阅读背景:

iCloud核心数据IOS8路径不在任何CloudDocs容器中

来源:互联网 

My iCloud Core Data app was running great on iOS7 and ready to launch. When I test on iOS 8 I get the following error and can't seem to fix it when trying to upload data to iCloud.

我的iCloud核心数据应用程序在iOS7上运行良好并准备启动。当我在iOS 8上测试时,我收到以下错误,并且在尝试将数据上传到iCloud时似乎无法修复它。

I suspect my problem is related to how I am getting the document directory and changes in the doc directory with iOS8 but I just can't figure this out..

我怀疑我的问题与我如何使用iOS8获取文档目录和doc目录中的更改有关但我无法弄清楚这一点..

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

my app delegate extension code where I create my persistent store is as follows. I have a seed database for first time installation.

我的app委托扩展代码,我创建我的持久存储如下。我有第一次安装的种子数据库。

- (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 *seedStoreOptions=@{NSReadOnlyPersistentStoreOption: @YES};
       NSPersistentStore *seedStore=[persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:seedStoreURL options:seedStoreOptions error:&seedStoreErrpr];

       NSDictionary *iCloudOptions =@{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 =@{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];
}

2 个解决方案

#1


5  

I was able to resolve this error by specifying the iCloud drive directory (Same name as the one on the developer.apple.com interface).

我能够通过指定iCloud驱动器目录(与developer.apple.com界面上的名称相同)来解决此错误。

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

and including it in the icloudOptions Dictionary as a NSPersistentStoreUbiquitousContentURLKey

并将其作为NSPersistentStoreUbiquitousContentURLKey包含在icloudOptions字典中

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

I was getting some strange errors so I removed the app from all devices, deleted the iCloud drive file and re ran on an actual device and it worked fine. Not sure if it runs on IOS7 now but since I only specified the NSPersistentStoreUbiquitousContentURLKey I am pretty confident it should be fine.

我收到了一些奇怪的错误,所以我从所有设备中删除了应用程序,删除了iCloud驱动器文件并在实际设备上重新运行,它运行正常。不知道它现在是否在IOS7上运行,但由于我只指定了NSPersistentStoreUbiquitousContentURLKey,我相信它应该没问题。

#2


-1  

I had the same issue during loading some test data. For the load of the data I was deleting all records. To avoid the exception a simple sleep(1) between cleaning and loading was enough.

在加载一些测试数据时我遇到了同样的问题。对于数据的加载,我删除了所有记录。为了避免异常,清洁和装载之间的简单睡眠(1)就足够了。


分享到: