因此,它终于发生了。 发生了任何独立的iPhone开发者最糟糕的情况。 一些用户正在升级我的应用程序后,报告数据完全丢失 。 iCloud的核心数据同步不工作。 我的用户都在使用这个应用程序部分来运行他们的业务。 这是一个真正的灾难性故障 。
唯一的iCloud相关的事情我改变是对键值存储添加到iCloud。 核心数据代码仍然完全一样的,同样的模型版本(没有迁移)等
在我的测试一切正常一级棒! 但我失望的是,用户报告说,当他们打开更新后的应用他们的数据是不存在了。
可能是什么原因呢?
- 持久性存储URL(无处不URL)不应该改变。
- 合并冲突也是不可能的,因为这个问题应该在更新之前已经出现。
-
新无处不在的key-value存储也许有些干扰?
(我几乎排除了这一可能性。)
下面请找出我的管理对象模型和持久性存储的代码。 让我知道如果你需要什么要对问题进行评估。
- (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的任何更多的同步。 符号根本不设置显示出来。