Donc, il est finalement arrivé. Le pire scénario pour toute indépendant développeur iPhone s'est produite. Plusieurs utilisateurs sont le rapport de perte de données après la mise à jour de mon application. iCloud Base de Données de synchronisation ne fonctionne pas. Mes utilisateurs sont à l'aide de cette application, en partie pour faire fonctionner leurs entreprises. C'est vraiment un échec catastrophique.
La seule iCloud liées chose que j'ai changé, c'était d'ajouter la clé-valeur à stocker sur iCloud. La base de données de code resté exactement le même, le même modèle version (pas de migration), etc.
Dans mes tests, tout a fonctionné à merveille! Mais à mon grand désarroi, les utilisateurs ont signalé que leurs données n'était plus là quand ils ont ouvert la mise à jour de l'app.
Quelle pourrait être la raison pour cela?
- La persistance de l'URL (un omniprésente URL) ne devrait pas avoir changé.
- Les conflits de fusion sont également peu probable, car c'est un problème qui doit ont surgi avant la mise à jour.
-
Peu d'interférences avec la nouvelle omniprésent key-value store peut-être?
(J'ai à peu près exclue.)
Veuillez trouver ci-dessous le code de mon modèle d'objet managé et de persistance. Laissez-moi savoir si vous avez besoin de rien d'autre pour évaluer le problème.
- (NSManagedObjectContext *)managedObjectContext {
if (managedObjectContext_ != nil) {
return managedObjectContext_;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[managedObjectContext_ performBlockAndWait:^{
[managedObjectContext_ setPersistentStoreCoordinator:coordinator];
if (useICloud) {
[managedObjectContext_ setMergePolicy:NSMergeByPropertyObjectTrumpMergePolicy];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(mergeiCloud:)
name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
object:coordinator];
}
}];
}
return managedObjectContext_;
}
et
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSMutableDictionary *options = [NSMutableDictionary dictionary];
NSURL *storeURL = [[self applicationDocumentsDirectory]
URLByAppendingPathComponent:@"SalesCalls.sqlite"];
[options setObject:[NSNumber numberWithBool:YES]
forKey:NSMigratePersistentStoresAutomaticallyOption];
[options setObject:[NSNumber numberWithBool:YES]
forKey:NSInferMappingModelAutomaticallyOption];
if (useICloud) { // this is an internal flag set to YES
NSURL *iCloudURL = [[NSFileManager defaultManager]
URLForUbiquityContainerIdentifier:nil];
if (nil!=iCloudURL) {
NSString *cloudData = [[iCloudURL path]
stringByAppendingPathComponent:@"data"];
iCloudURL = [NSURL fileURLWithPath:cloudData];
[options setObject:@"at.topofmind.salesplus.store"
forKey:NSPersistentStoreUbiquitousContentNameKey];
[options setObject:iCloudURL
forKey:NSPersistentStoreUbiquitousContentURLKey];
NSURL *nosyncDir = [iCloudURL
URLByAppendingPathComponent:@"data.nosync"];
[[NSFileManager defaultManager] createDirectoryAtURL:nosyncDir
withIntermediateDirectories:YES
attributes:nil error:nil];
storeURL = [nosyncDir
URLByAppendingPathComponent:@"SalesCalls.sqlite"];
}
}
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_
addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Cannot create persistent store coordinator, %@, %@",
error, [error userInfo]);
abort();
}
return persistentStoreCoordinator_;
}
Des commentaires, des opinions, des suppositions sauvages etc. (et bien sûr des solutions!) sont tous les bienvenus.
Mise à JOUR:
L'un de mes clients a perdu toutes ses données après la réinstallation et de tout réinitialiser (le redémarrage de l'appareil, etc.) il ne pouvait pas la synchronisation avec iCloud. Le symbole n'est tout simplement pas dans les Paramètres.