Больше проблем с синхронизацией данных в iCloud Core
Итак, это наконец случилось. Произошел наихудший сценарий для любого независимого разработчика iPhone. Несколько пользователей сообщают о завершениипотери данных после обновления моего приложения. Синхронизация данных iCloud Core не работает. Мои пользователи частично используют это приложение для управления своим бизнесом. Это действительнокатастрофический провал.
Единственное, что я изменил в связи с 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. Символ просто не отображается в настройках.