59 votes

Plus d'iCloud Base de Données de synchronisation de malheurs

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.

1voto

The Poet Points 2161

J'ai été confronté à quelque chose de similaire avec quelques utilisations ( par votre description, je suppose que vous avez moyen de plus de volume que je fais, c'est la raison pour laquelle plusieurs cas )

Dans mon cas, Apple semble avoir supprimé sans préavis antérieure au 20 go d'espace libre dans le icloud. J'ai remarqué que les 2 qui utilise la puissance de l'utilisation des données des utilisateurs avait perdu de nouvelles données à partir de mon application (qui était de traiter les historiques de prix ) et les autres, ceux que nous venons d'amende téléchargement de la même taille des données.

J'ai suivi avec ces 2, en les aidant à nettoyer les trucs pour laisser plus d'espace dans icloud et voila, après avoir téléchargé les données de nouveau il a bien fonctionné.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X