Подтвердить что ты не робот

Почему iCloud иногда перестает работать?

У меня иногда возникает проблема с открытием UIDocuments, которые хранятся в iCloud. Я вызываю следующий код в самом начале моего приложения после проверки доступности iCloud и получения результатов NSMetaDataQuery. Это работает в 98% случаев. Это просто иногда (например, иногда после повторной установки приложения), что завершениеHandler никогда не будет вызвано:

FRNBDocument *doc = [[FRNBDocument alloc] initWithFileURL:fileURL];
[doc openWithCompletionHandler:^(BOOL success) {

    NSLog(@"... doc: openedWithCompletionHandler");

Как вы можете видеть из кода, я инициализирую новый экземпляр UIDocument (FRNBDocument), так что это не может быть так, как старый UIDocument все еще открыт, и поэтому этот не открывается.

Единственный способ заставить приложение работать снова - убить его, а затем перейти к settings.app > iCloud > Documents and Data и выключить его, а затем снова включить его. Когда я вернусь к приложению, UIDocs загрузятся без проблем.

Я заметил, что другие приложения (например, xTrail by sophiestication) имеют одинаковую проблему и что я могу заставить их работать снова после выполнения трюка, описанного выше.

Что происходит?

4b9b3361

Ответ 1

ОК, похоже, это ошибка iCloud. Я связался с Apple, и они предложили подать отчет об ошибке. И так я сделал (id 12260670).

Теперь я просто сделаю таймер. Если UIDocs не загрузились через 20 секунд, я покажу AlertView, предлагая пользователю перейти к settings.app > iCloud > Documents and Data и выключить его, а затем снова включить его.

Это так расстраивает. Невероятно.

Ответ 2

У меня такая же проблема. NSMetadataQuery возвращает результат, но openWithCompletionHandler: очень редко не выполняется, поэтому данные приложения не загружаются. На какое-то время у меня было обходное решение, проверив NSMetadataUbiquitousItemIsDownloadedKey, прежде чем пытаться загрузить документ. Если он не был загружен, я вызвал evictUbiquitousItemAtURL, а затем startDownloadingUbiquitousItemAtURL. Затем мне нужно было проводить опрос с NSMetadataQuery для NSMetadataUbiquitousItemIsDownloadedKey, чтобы быть истинным, и в это время я мог успешно вызвать openWithCompletionHandler. Это, похоже, решило проблему. Однако это разочаровывает, похоже, либо больше не работает в iOS 6, либо не работает все время. Пожалуйста, держите нас в курсе, если вы найдете лучшее обходное решение или получите обновление от Apple.

Ответ 3

Доступ к iCloud требует возврата вызова функции

- (NSURL *)URLForUbiquityContainerIdentifier:(NSString *)containerID

который возвращает

URL, указывающий на указанный контейнер вездесущности, или nil, если контейнер не может быть расположен или если хранилище iCloud недоступно для текущего пользователя или устройства.

Reference

Поскольку iCloud не так отзывчив, я проверяю, получился ли URL, а затем продолжаю синхронизировать данные.

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (ubiq) 
{
    NSLog(@"iCloud access at %@", ubiq);
    [self loadDocument];
} 
else 
{
    NSLog(@"No iCloud access");
}