Я собираюсь начать обновление, чтобы помочь тем, кто пытается использовать это как ссылку для своего личного кода.
Новое обновление
- Я уверен, что нашел способ повторной синхронизации устройств, когда они перестали разговаривать друг с другом. Я собираюсь обновить свои ответьте ниже со всеми подробностями. Я полностью надеюсь, что вы все найдете это полезно. Прошло почти 2 месяца проб и ошибок, чтобы понять это один из. Поэтому, пожалуйста, дайте ссылку и поделитесь этим с другими, кто имея аналогичные проблемы, получая устройства, чтобы снова поговорить с каждым другой через iCloud. Мне потребовалось навсегда, чтобы все это понять, поэтому я я более чем счастлив сохранить как можно больше других разработчиков из чтобы создать свои собственные исправления для make-shift.
Другое дополнение для правильной настройки
- Я обнаружил, что после обновления приложения, которое связано с данными iCloud
с учетной записью может вызвать сбой при открытии, потому что iCloud
данные будут пытаться немедленно слиться с устройством (где
устройство еще не настроило свой постоянный магазин). Я добавил
@property (nonatomic, readwrite) BOOL unlocked;
доAppDelegate.h
и@synthesize unlocked;
доAppDelegate.m
. Затем я изменил свой метод- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
как а также мой метод- (void)mergeChangesFrom_iCloud
, оба из которых будет показано ниже (посередине для постоянной настройки хранилища и внизу для метода слияния iCloud). По сути, я говорю приложение, чтобы предотвратить iCloud от слияния данных до тех пор, пока приложение не установит его постоянный магазин. В противном случае вы увидите крах приложения из-за нечитаемые ошибки.
Вот как я настраиваю свой persistentStoreCoordinator:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (__persistentStoreCoordinator != nil)
{
return __persistentStoreCoordinator;
}
// here is where you declare the persistent store is not prepared;
self.unlocked = NO;
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Maintain_My_Car.sqlite"];
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSPersistentStoreCoordinator *psc = __persistentStoreCoordinator;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *options = nil;
NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:nil];
NSString *coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
if (coreDataCloudContent.length != 0) {
// iCloud enabled;
cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];
options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, @"<bundleIdentifier>.store", NSPersistentStoreUbiquitousContentNameKey, cloudURL, NSPersistentStoreUbiquitousContentURLKey, nil];
} else {
// iCloud not enabled;
options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
}
NSError *error = nil;
[psc lock];
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
NSLog(@"bad things %@ %@", error, [error userInfo]);
abort();
}
[psc unlock];
// the store is now prepared and ready for iCloud to import data;
self.unlocked = YES;
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"iCloud persistent store added");
[[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
});
});
return __persistentStoreCoordinator;
}
<myAppKey>
и <bundleIdentifier>
- это, конечно, фактические значения. Я просто маскирую их для совместного использования этого кода.
Я знаю, что некоторые люди по-прежнему испытывают проблемы с этим и могут использовать этот вопрос в качестве ссылки на то, как настроить свои собственные приложения Core Data с поддержкой iCloud, поэтому я хочу обновить его всякий раз, когда я вношу изменения в свой персональный код, чтобы все могли использовать код, который работает для меня. В этом обновлении я изменил начальный cloudURL с [fileManager URLForUbiquityContainerIdentifier:@"<TeamIdentifier>.<bundleIdentifier>"]
на [fileManager URLForUbiquityContainerIdentifier:nil]
, гарантируя, что информация о контейнере будет собрана из файла прав.
Дополнительные методы
_notificationArray
определяется следующим образом:
@property (nonatomice, strong) NSMutableArray *notificationArray;
@synthesize notificationArray = _notificationArray;
- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
if (self.unlocked) {
NSManagedObjectContext *moc = [self managedObjectContext];
if (self.notificationArray.count != 0) {
for (NSNotification *note in _notificationArray) {
[moc performBlock:^{
[self mergeiCloudChanges:note forContext:moc];
}];
}
[_notificationArray removeAllObjects];
[moc performBlock:^{
[self mergeiCloudChanges:notification forContext:moc];
}];
} else {
[moc performBlock:^{
[self mergeiCloudChanges:notification forContext:moc];
}];
}
} else {
if (_notificationArray == nil) {
_notificationArray = [[NSMutableArray alloc] init];
}
[_notificationArray addObject:notification];
}
}
- (void)resetStore {
[self saveContext];
__persistentStoreCoordinator = nil;
__managedObjectContext = nil;
// reset the managedObjectContext for your program as you would in application:didFinishLaunchingWithOptions:
myMainView.managedObjectContext = [self managedObjectContext];
// the example above will rebuild the MOC and PSC for you with the new parameters in mind;
}
Тогда существует метод mergeiCloudChanges:forContext:
:
- (void)mergeiCloudChanges:(NSNotification *)note forContext:(NSManagedObjectContext *)moc {
// below are a few logs you can run to see what is being done and when;
NSLog(@"insert %@", [[note userInfo] valueForKey:@"inserted"]);
NSLog(@"delete %@", [[note userInfo] valueForKey:@"deleted"]);
NSLog(@"update %@", [[note userInfo] valueForKey:@"updated"]);
[moc mergeChangesFromContextDidSaveNotification:note];
NSNotification *refreshNotification = [NSNotification notificationWithName:@"RefreshAllViews" object:self userInfo:[note userInfo]];
[[NSNotificationCenter defaultCenter] postNotification:refreshNotification];
// do any additional work here;
}
Исходная проблема
-
Использование iCloud в iOS 5.0.1, я иногда получаю ошибки к постоянному магазину. Я собираюсь продолжить обновление новую информацию, поскольку я нахожу ее в экспериментах, но до сих пор решение, которое я предоставил, - это единственный способ заставить приложение работать (к сожалению, решение jlstrecker не работает me) как только я начну видеть ошибку, которая выглядит следующим образом:
-NSPersistentStoreCoordinator addPersistentStoreWithType: configuration: URL: options: error:: CoreData: Ubiquity: ошибка при попытке прочитать корневой URL-адрес вездесущности: файл://localhost/private/var/mobile/Library/Mobile%20Documents/./data/. Ошибка: Error Domain = LibrarianErrorDomain Code = 1 "Операция не удалось завершить. (Ошибка LibrarianErrorDomain 1 - Невозможно выполнить initiate item download.)" UserInfo = 0x176000 {NSURL = Файл://localhost/private/var/mobile/Library/Mobile%20Documents/./data/, NSDescription = Невозможно инициировать загрузку элемента.}
В жизни я не могу понять, почему я вижу это все внезапно или как заставить его остановиться. Я удалил приложение из обоих устройства удалили данные iCloud, которые были ранее синхронизированы между их и удалили любые данные из резервных копий в отношении приложений. у меня есть перезапустил Xcode, перезапустил оба устройства, очистил проект Xcode, но ничто не остановило ошибку. Я никогда не видел эта ошибка раньше и не имела нулевой информации как это сделать.
Приложение вылетает здесь:
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { NSLog(@"bad things %@ %@", error, [error userInfo]); abort(); }
Журнал никогда не попадает и не прерывается. Я просто вижу ошибку выше и само приложение становится невосприимчивым. Если кто-нибудь может мне помочь в правильном направлении, я был бы очень благодарен.
Предыдущие выпуски/вопросы
-
Это похоже на продолжение даже после обновления с бета-версии публичный выпуск 5.0.1. Последний раз, когда это случилось со мной изменение модели управляемых контекстных данных. Учитывая, что у меня нет выпустила приложение еще, я не беспокоился о слиянии новой версии модель. Я просто удалил и переустановил приложение на своих устройствах, но то он отказался сотрудничать с данными, хранящимися в iCloud контейнер, под которым я подразумеваю, что я получил сообщение об ошибке, что хранилище не удалось загрузить элементы. Я думаю, это связано с противоречивыми данными модели, что имеет смысл. Похоже, вам просто нужно избавиться от данных в контейнере iCloud, не избавляясь от контейнера. Удаление данных iCloud, кажется, убивает все по сути отключив контейнер и идентификатор приложения. Поскольку это казалось проще, я попытался создать новый контейнер, как это было предложено jlstrecker, но, к сожалению, это совсем не помогло. Поэтому еще раз я должен был выполните шаги, изложенные в моем ответе, которые снова сделали трюк. Но учитывая, как надоедает создание нового приложения Идентификаторы и обновления профилей подготовки каждый раз, я думал, что лучше всего обновите то, что я научился, чтобы сузить причину и получить к более быстрому решению.
Переход через iCloud > Хранение и резервное копирование > Управление хранилищем, затем удаление приложения будет лучшим решением для данных, но это приводит к повреждению контейнера, что приводит к ошибка выше. И после успешного выполнения этого, независимо от того, сколько раза я удаляю приложение и переустанавливаю его на устройство (чтобы сделать это появляются, как будто это первый раз, появляющийся на устройстве, и, надеюсь воссоздайте контейнер), я никогда не смогу заставить приложение показать в Документы и список данных снова. Это несколько касается, если это означает что любой, кто удаляет данные из своего iCloud, iCloud больше не будет работать для приложения. Я использую только на данный момент профиль разработки приложения, поэтому, возможно, используя профиль распределения может иметь какое-то значение, но мне придется испытайте это, прежде чем что-то сказать наверняка.
Я надеюсь, что эти новые обновления помогут всем, у кого может возникнуть проблема с настройкой своего магазина. До сих пор он отлично работал у меня. Я обязательно буду обновлять больше, если найду лучшие исправления или просто что-нибудь, что сделает процесс более безвкусным.