Weitere Probleme bei der iCloud Core Data-Synchronisierung

Also ist es endlich passiert. Das Worst-Case-Szenario für einen unabhängigen iPhone-Entwickler ist aufgetreten. Mehrere Benutzer melden sich vollständigDatenverlust nach dem Upgrade meiner App. Die iCloud Core Data-Synchronisierung funktioniert nicht. Meine Nutzer nutzen diese App teilweise, um ihre Geschäfte zu betreiben. Das ist ein wahrerkatastrophales Versagen.

Das einzige, was ich im Zusammenhang mit iCloud geändert habe, war das Hinzufügen des Schlüsselwertspeichers zu iCloud. Der Kerndatencode blieb exakt gleich, dieselbe Modellversion (keine Migration) usw.

Bei meinen Tests hat alles wunderbar geklappt! Zu meinem Entsetzen meldeten die Benutzer jedoch, dass ihre Daten nicht mehr vorhanden waren, als sie die aktualisierte App öffneten.

Was könnte der Grund dafür sein?

Daspersistente Speicher-URL (eine allgegenwärtige URL) sollte sich nicht geändert haben.Konflikte zusammenführen sind auch unwahrscheinlich, da dieses Problem vor dem Update aufgetreten sein sollte.Einige Eingriffe in das Neueubiquitärer Schlüsselwertspeicher vielleicht?
(Ich habe das so ziemlich ausgeschlossen.)

Unten finden Sie den Code für mein verwaltetes Objektmodell und meinen permanenten Speicher. Lassen Sie mich wissen, wenn Sie etwas anderes benötigen, um das Problem zu bewerten.

- (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_;
}

und

- (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_;
}

Kommentare, Meinungen, wilde Vermutungen usw. (und natürlich Lösungen!) Sind willkommen.

AKTUALISIEREN:

Einer meiner Kunden hat alle seine Daten verloren und konnte nach der Neuinstallation und dem Zurücksetzen aller Daten (Neustart des Geräts usw.) keine Synchronisierung mehr mit iCloud durchführen. Das Symbol wird in den Einstellungen einfach nicht angezeigt.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage