More Icloud Core Data Synching Woes

Dus gebeurde het uiteindelijk. Het slechtste scenario voor elke onafhankelijke iPhone-ontwikkelaar vond plaats. Verschillende gebruikers rapporteren compleet gegevensverlies na het upgraden van mijn app. iCloud Core Data Sync werkt niet. Mijn gebruikers gebruiken deze app gedeeltelijk om hun bedrijven uit te voeren. Dit is een echt catastrofale mislukking .

Het enige iCloud-gerelateerde wat ik veranderde, was om de sleutelwaardewinkel toe te voegen aan iCloud. De kerngegevenscode bleef precies dezelfde, dezelfde modelversie (geen migratie) enz.

In mijn tests werkte alles mooi! Maar naar mijn ontzetting meldden gebruikers dat hun gegevens er niet meer waren toen ze de bijgewerkte app openden.

Wat kan hiervoor de reden zijn?

  • De Persistent Store-URL (een alomtegenwoordige URL) mag niet zijn gewijzigd.
  • Samenvoeging Conflicten zijn ook onwaarschijnlijk, omdat dit probleem zich vóór de update zou moeten ontstaan.
  • Enige interferentie met de nieuwe Ubiquitous Key-Value Store Misschien?
    (Ik heb dit vrijwel uitgesloten.)

Hieronder vindt u de code voor mijn beheerde objectmodel en persistente winkel. Laat me weten of je iets anders nodig hebt om het probleem te beoordelen.

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

en

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

Opmerkingen, meningen, wilde gissingen enz. (en natuurlijk oplossingen!) zijn allemaal welkom.

UPDATE:

Een van mijn klanten verloor al zijn gegevens en nadat hij alles opnieuw had geïnstalleerd en gereset (apparaat opnieuw opstarten, enz.) kon hij niet meer synchroniseren met iCloud. Het symbool verschijnt gewoon niet in de Instellingen.


Antwoord 1, autoriteit 100%

Ik had te maken met iets soortgelijks met weinig gebruik (volgens je beschrijving ging ik ervan uit dat je veel meer volume hebt dan ik, dat is misschien de reden voor verschillende gevallen)

In mijn geval leek Apple de 20 GB vrije ruimte in de icloud zonder voorafgaande kennisgeving te hebben verwijderd. Ik heb gemerkt dat de twee gebruikers die stroomverbruikers zijn, nieuwe gegevens van mijn app hadden verloren (die moesten omgaan met historische aandelenkoersen) en de anderen die we prima konden downloaden van dezelfde gegevensgrootte.

Ik volgde die twee op en hielp hen dingen op te ruimen om meer ruimte in iCloud te laten en voila, na het opnieuw downloaden van de gegevens werkte het prima.

Other episodes