更多的iCloud核心数据同步的困境
所以,它终于发生了。 对于任何独立的iPhone开发者来说,最糟糕的情况是 升级我的应用后,有几个用户报告完全丢失数据 。 iCloud核心数据同步不起作用。 我的用户正在使用这个应用程序部分运行他们的业务。 这真是一场灾难性的失败 。
我改变的唯一与iCloud相关的事情是将键值存储添加到iCloud。 核心数据代码保持完全一样,相同的型号版本(不迁移)等
在我的testing中,一切都很好用! 但令我沮丧的是,用户报告说他们的数据在他们打开更新的应用程序时已经不存在了。
这可能是什么原因?
- 持久存储URL (无处不在的URL)不应该改变。
- 合并冲突也不太可能,因为在更新之前应该出现这个问题。
-
一些干扰新的无处不在的键值存储也许?
(我几乎排除了这一点。)
下面请find我的托pipe对象模型和持久存储的代码。 让我知道你是否需要别的什么来评估这个问题。
- (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_; }
和
- (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_; }
评论,意见,猜测等(当然,解决scheme!)都是受欢迎的。
更新:
我的一位客户丢失了所有数据,重新安装并重新设置(重新启动设备等)之后,他无法再与iCloud同步。 该符号根本不显示在设置中。
我正面临着一些类似的东西(通过你的描述,我认为你的音量比我多,这可能是几个例子的原因)
在我的情况下,苹果公司似乎没有提前通知icloud的20GB可用空间。 我注意到这两个用户谁是电力数据使用用户已经失去了我的应用程序(这是为了处理历史股票定价)的新数据和其他人我们只是罚款下载相同的数据大小。
我跟着那两个,帮他们清理一些东西,让更多的空间在icloud和瞧,下载数据后再次工作正常。