2014-10-12 2 views
9

Приложение iCloud Core Data отлично работает на iOS7 и готово к запуску. Когда я тестирую iOS 8, я получаю следующую ошибку и не могу ее исправить при попытке загрузить данные в iCloud.iCloud Core Data IOS8 Path находится вне любого контейнера CloudDocs

Я подозреваю, моя проблема связана с тем, как я получаю каталог документов и изменений в каталоге док с iOS8, но я просто не могу понять это ..

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" 
) 

мой код приложения расширения Делегат где Я создаю свой постоянный магазин следующим образом. У меня есть база данных семян для первой установки.

- (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

Разве в итоге получилось решение? такая же ошибка здесь. – MatterGoal

+1

Мне удалось решить эту проблему, указав каталог iCloud в словаре icloudOptions. Мне также необходимо было полностью удалить его со всех устройств, удалить файлы диска iCloud и перезагрузить их на устройстве. Сообщение обновлено – grayentropy

+0

Я получаю ту же ошибку и задаюсь вопросом, что вы делаете, если пользователь отключил iCloud, а 'NSFileManager' возвращает' nil', когда вы запрашиваете каталог облаков? –

ответ

5

Я был в состоянии решить эту проблему, указав каталог диска iCloud (то же имя, что и на интерфейсе 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; 
} 

и включения его в словаре icloudOptions как NSPersistentStoreUbiquitousContentURLKey

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

я получаю некоторые странные ошибки, так что я удалил приложение из всех устройств, удалил файл диска ICloud и снова побежали на фактическом устройства, и он работал нормально. Не уверен, что он работает на IOS7 сейчас, но поскольку я только указал NSPersistentStoreUbiquitousContentURLKey, я уверен, что все должно быть хорошо.

+1

Я пробовал это, но получаю: «Невозможно продолжить разбор компонентов URL:/var/mobile/Library/Mobile Documents/iCloud ~ com ~ example ~ foo/CoreData/MyAppCloudStore/.baseline/MyAppCloudStore " – Ixx

+0

Что вы установили в идентификаторе teamID? – user3065901

-1

У меня была такая же проблема при загрузке некоторых тестовых данных. Для загрузки данных я удалял все записи. Чтобы избежать исключения, достаточно простого сна (1) между очисткой и загрузкой.

Смежные вопросы