【发布时间】:2013-01-06 20:40:45
【问题描述】:
所以,它终于发生了。对于任何独立的 iPhone 开发者来说,最糟糕的情况发生了。升级我的应用程序后,一些用户报告完全数据丢失。 iCloud 核心数据同步不工作。我的用户部分使用这个应用程序来经营他们的业务。这是一个真正的灾难性失败。
我唯一更改的与 iCloud 相关的事情是将键值存储添加到 iCloud。核心数据代码保持不变,模型版本相同(无迁移)等
在我的测试中,一切都很顺利!但令我沮丧的是,用户报告说,当他们打开更新的应用程序时,他们的数据已经不存在了。
这可能是什么原因?
- 永久存储 URL(一个普遍存在的 URL)不应更改。
- 合并冲突也不太可能发生,因为这个问题应该在更新之前就出现了。
-
也许对新的无处不在的键值存储有一些干扰?
(我几乎已经排除了这一点。)
请在下面找到我的托管对象模型和持久存储的代码。如果您需要其他任何东西来评估问题,请告诉我。
- (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_;
}
欢迎评论、意见、疯狂猜测等(当然还有解决方案!)。
更新:
我的一位客户丢失了所有数据,并且在重新安装和重置所有内容(重新启动设备等)后,他无法再与 iCloud 同步。该符号根本不会显示在“设置”中。
【问题讨论】:
-
疯狂猜测。您是否 100% 确定您在 iCloud 设置中附加到正确的 ubiquity 容器?
-
嗨 Mundi,我只想说这完全有可能只是代表 Apple 的错误。他们的云产品过去曾受到过抨击,我的理解是他们的 iCloud iOS 产品非常不稳定。 tuaw.com/2012/11/27/…
-
@WarrenBurton - 是的,请参阅上面的代码。这一切都在那里。我删除了日志语句,但我确实检查了无处不在的 URL。顺便说一句,只要它们保持不变,我不知道什么会使它们“正确”或不“正确”。
-
@occulus 告诉我……这就是为什么我在标题中加上“更多……麻烦”。
-
帮自己一个忙,如果可以的话,放弃 iCloud 和 Core Data。它还没有准备好,而且我从未听说过任何开发人员让这个组合能够可靠地工作。如果你找到了(最好是开源代码),请指出来。 (即使在它应该可以工作的应用程序中,您也可以确定同步会在一段时间后停止。)
标签: iphone ios core-data synchronization icloud