2014-10-12 7 views
9

La mia app iCloud Core Data funzionava alla perfezione su iOS7 e pronta per il lancio. Quando eseguo il test su iOS 8 ottengo il seguente errore e non riesco a risolverlo quando provo a caricare i dati su iCloud.iCloud Core Data IOS8 Path è all'esterno di qualsiasi contenitore CloudDocs

Ho il sospetto che il mio problema è legato al modo in cui io sono sempre la directory del documento e le modifiche nella directory doc con iOS 8, ma non riesco proprio a capirlo ..

014-10-12 15:14:17.862 XXXXXXX [4662:236693] __45-[PFUbiquityFilePresenter processPendingURLs]_block_invoke(439): CoreData: Ubiquity: Librarian returned a serious error for starting downloads Error Domain=BRCloudDocsErrorDomain Code=6 "The operation couldn’t be completed. (BRCloudDocsErrorDomain error 6 - Path is outside of any CloudDocs container, will never sync)" UserInfo=0x7f8b1a525f60 {NSDescription=Path is outside of any CloudDocs container, will never sync, NSFilePath=/Users/garyrea/Library/Developer/CoreSimulator/Devices/9AADFE8E-5ECC-4969-9418-57DA45B747C9/data/Containers/Data/Application/AD2E5E62-7295-4371-A08D-1790E8FCCD96/Documents/CoreDataUbiquitySupport/nobody~simA28745A4-A67F-598C-9260-F9AC36609ECF/iCloud/5B8BFA36-1ACA-4966-B7ED-A7344D36ACF1/container/nobody~simA28745A4-A67F-598C-9260-F9AC36609ECF/iCloud/2trlqdMQVpJ~wlEfiLvjWtQfrUJ8YiNCd84KW_xiw4A=/F0CF5F29-D437-4728-B0A2-C5BB90BBC239.1.cdt} with userInfo { 
    NSDescription = "Path is outside of any CloudDocs container, will never sync"; 
    NSFilePath = "/Users/garyrea/Library/Developer/CoreSimulator/Devices/9AADFE8E-5ECC-4969-9418-57DA45B747C9/data/Containers/Data/Application/AD2E5E62-7295-4371-A08D-1790E8FCCD96/Documents/CoreDataUbiquitySupport/nobody~simA28745A4-A67F-598C-9260-F9AC36609ECF/iCloud/5B8BFA36-1ACA-4966-B7ED-A7344D36ACF1/container/nobody~simA28745A4-A67F-598C-9260-F9AC36609ECF/iCloud/2trlqdMQVpJ~wlEfiLvjWtQfrUJ8YiNCd84KW_xiw4A=/F0CF5F29-D437-4728-B0A2-C5BB90BBC239.1.cdt"; 
} for these urls: (
    "file:///Users/garyrea/Library/Developer/CoreSimulator/Devices/9AADFE8E-5ECC-4969-9418-57DA45B747C9/data/Containers/Data/Application/AD2E5E62-7295-4371-A08D-1790E8FCCD96/Documents/CoreDataUbiquitySupport/nobody~simA28745A4-A67F-598C-9260-F9AC36609ECF/iCloud/5B8BFA36-1ACA-4966-B7ED-A7344D36ACF1/container/nobody~simA28745A4-A67F-598C-9260-F9AC36609ECF/iCloud/2trlqdMQVpJ~wlEfiLvjWtQfrUJ8YiNCd84KW_xiw4A=/F0CF5F29-D437-4728-B0A2-C5BB90BBC239.1.cdt" 
) 

il mio codice di applicazione di estensione delegato in cui Creo il mio negozio persistente è come segue. Ho un database di seed per la prima installazione.

- (NSPersistentStoreCoordinator *)createPersistentStoreCoordinator{ 
    NSPersistentStoreCoordinator *persistentStoreCoordinator = nil; 
    NSManagedObjectModel *managedObjectModel = [self createManagedObjectModel]; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:managedObjectModel]; 
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@ 
    "CoreData.sqlite"];  

    if (![[NSFileManager defaultManager]fileExistsAtPath:[storeURL path]]){ 
     NSURL *preloadURL=[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"SeedDatabase" ofType:@ 
     "sqlite"]]; 
     NSError *error=nil; 
     if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&error]){ 
      NSLog(@ 
      "File couldnt save"); 
     } 
    } 


    NSUbiquitousKeyValueStore *kvStore=[NSUbiquitousKeyValueStore defaultStore]; 
    if (![kvStore boolForKey:@"SEEDED_DATA"]){ 
     NSLog (@ 
     "In the new database"); 
     NSURL *seedStoreURL=[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"SeedDatabase" ofType:@ 
     "sqlite"]]; 
     NSError *seedStoreErrpr; 
     NSDictionary *[email protected]{NSReadOnlyPersistentStoreOption: @YES}; 
     NSPersistentStore *seedStore=[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:seedStoreURL options:seedStoreOptions error:&seedStoreErrpr]; 

     NSDictionary *iCloudOptions [email protected]{NSPersistentStoreUbiquitousContentNameKey: @"iCloud", 
             NSMigratePersistentStoresAutomaticallyOption:@YES, 
             NSInferMappingModelAutomaticallyOption:@YES 
     }; 

     NSOperationQueue *queue=[[NSOperationQueue alloc] init]; 
     [queue addOperationWithBlock:^{ 
      NSError *error; 
      [persistentStoreCoordinator migratePersistentStore:seedStore toURL:storeURL options:iCloudOptions withType:NSSQLiteStoreType error:&error]; 
      NSLog(@ 
      "Persistant store migrated"); 
      [kvStore setBool:YES forKey:@ 
      "SEEDED_DATA"]; 
      // [self checkForDuplicates]; 
     }]; 
    }else{ 
     NSError *error; 
     NSDictionary *storeOptions [email protected]{NSPersistentStoreUbiquitousContentNameKey: @ 
      "iCloud" 
     }; 
     if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
             configuration:nil 
             URL:storeURL 
             options:storeOptions 
             error:&error]) { 
      NSLog(@ 
      "Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
     } 
    } 

    return persistentStoreCoordinator; 
} 

- (NSURL *)applicationDocumentsDirectory{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 
+1

Finito con una soluzione? stesso errore qui .. – MatterGoal

+1

Sono stato in grado di risolvere questo problema specificando la directory iCloud nel dizionario icloudOptions. Avevo anche bisogno di rimuoverlo completamente da tutti i dispositivi, eliminare i file di unità iCloud e riavviare su un dispositivo. Post aggiornato – grayentropy

+0

Ricevo lo stesso errore e mi chiedo cosa fai se l'utente ha disattivato iCloud e 'NSFileManager' restituisce' nil' quando chiedi la directory cloud? –

risposta

5

Sono stato in grado di risolvere questo errore specificando la directory dell'unità iCloud (stesso nome dell'interfaccia developer.apple.com).

-(NSURL *)cloudDirectory 
{ 
NSFileManager *fileManager=[NSFileManager defaultManager]; 
NSString *[email protected]"iCloud"; 
NSString *bundleID=[[NSBundle mainBundle]bundleIdentifier]; 
NSString *cloudRoot=[NSString stringWithFormat:@"%@.%@",teamID,bundleID]; 
NSURL *cloudRootURL=[fileManager URLForUbiquityContainerIdentifier:cloudRoot]; 
NSLog (@"cloudRootURL=%@",cloudRootURL); 
return cloudRootURL; 
} 

compreso nel dizionario icloudOptions come NSPersistentStoreUbiquitousContentURLKey

NSDictionary *storeOptions [email protected]{NSPersistentStoreUbiquitousContentNameKey: @"iCloud", 
            NSPersistentStoreUbiquitousContentURLKey:[self cloudDirectory], 
            }; 

stavo ottenendo alcuni strani errori così ho rimosso l'applicazione da tutti i dispositivi, cancellato il file unità iCloud e ri correva su un vero e proprio dispositivo e ha funzionato bene. Non sono sicuro che venga eseguito su IOS7 ora, ma poiché ho specificato solo NSPersistentStoreUbiquitousContentURLKey sono abbastanza sicuro che dovrebbe andare bene.

+1

Ho provato questo, ma ottengo: "Impossibile continuare i componenti di analisi dell'URL:/var/mobile/Libreria/Documenti mobili/iCloud ~ com ~ esempio ~ foo/CoreData/MyAppCloudStore/.baseline/MyAppCloudStore " – Ixx

+0

Cosa hai impostato sul teamID? – user3065901

-1

Ho avuto lo stesso problema durante il caricamento di alcuni dati di test. Per il caricamento dei dati stavo cancellando tutti i record. Per evitare l'eccezione, è sufficiente un semplice sleep (1) tra pulizia e caricamento.

Problemi correlati