2014-02-11 1 views
0

Мое приложение использует один документ (UIDocument), чтобы содержать его информацию и никогда не закрывает его, пока приложение открыто. Я реализовал подключение iCloud для сохранения файла, чтобы я мог делиться им через устройства. При использовании симулятора (iOS7) я могу открыть документ и сохранить его. Если я закрою приложение в симуляторе, я все равно могу открыть документ iCloud и работать с ним, когда я перезапущу.UIDocument openWithCompletionHandler получает NO и UIDocumentStateSavingError при открытии документа iCloud после прекращения действия приложения

Я тестирую iPad (iOS7) и симулятор для разработки обновлений между устройствами. Я могу успешно открыть документ iCloud (сохраненный симулятором) и увидеть все правильно на iPad. Однако, если я покинул приложение на iPad и перезапустил его, у меня получится success = NO и Document State = UIDocumentStateSavingError в моем openWithCompletionHandler. Я захватил ошибку в методе HandleError и нашел это:

Error 
Domain=NSCocoaErrorDomain 
Code=257 "The operation couldn’t be completed. (Cocoa error 257.)" 
UserInfo=0x14650360 {NSFilePath=/private/var/mobile/Library/Mobile Documents/2A9S2V8BH4~com~mishnookasoftware~selists/Lists.archive, NSUnderlyingError=0x1462b590 "The operation couldn’t be completed. Operation not permitted"} 

Это, как представляется, разрешение отказано ошибка. Я дважды проверил сертификат, чтобы гарантировать, что iCloud включен для приложения, и это так. Я тестировал, чтобы изменения, сделанные на моем iPad, были перенесены в iCloud, оставив приложение в симуляторе и перезапустив его, чтобы увидеть обновления.

Я закрываю документ iCloud в приложении приложения делегата. МетодWullTerminate ([iCloudListDocument closeWithCompletionHandler: nil];). Мне интересно, если файл не закрывается должным образом и, следовательно, не может быть повторно открыт после перезапуска.

Я искал StackOverflow и не нашел ничего, что могло бы помочь в моей ситуации. Любая помощь приветствуется.

+0

Что произойдет, если вы запустите iPad первым, прежде чем какой-либо документ существует в iCloud? –

+0

К сожалению, я не знаю, как удалить файл в iCloud, чтобы проверить это. Кроме того, приложение создает документ и начинает сохранять изменения в iCloud после его запуска с использованием iCloud. Я уверен, что у меня получится такая же ошибка, если я выйду из приложения и перезапустится на iPad. –

+0

Перейдите в каталог библиотеки/мобильных документов/на вашем Mac и найдите контейнер appsId и удалите все содержимое. –

ответ

3

Хорошо, это было странно. Я сохранил полный URL-адрес пути к документу iCloud в userDefaults, а затем прочитал его и попытался использовать его для открытия документа iCloud, если у меня был действительный ubiquityIdentityToken после перезапуска. Полный путь содержал исходный URLForUbiquityContainerIdentifier с конечным местоположением и именем документа, добавленным к нему. Это действие привело к тому, что документ не был найден ([[NSFileManager defaultManager] fileExistsAtPath: имя_файла] = НЕТ, где имя файла было взято из сохраненного полного URL-адреса пути).

Теперь, странная часть, для меня в любом случае. Я должен был снова восстановить URLForUbiquityContainerIdentifier (NSURL * myUbiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier: nil];), прежде чем я смог получить доступ к полностью сохраненному URL-адресу пути. Если я сделал это, прежде чем я проверил, существовал ли документ, [[NSFileManager defaultManager] fileExistsAtPath: fileName] = YES.

Заключения после перезапуска приложения, желающего открыть существующий ICloud документ, необходимо выполнить оба метод:

id currentiCloudToken = [[NSFileManager defaultManager] ubiquityIdentityToken]; 
NSURL *myUbiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier: nil]; 

Это позволит вам получить доступ к фактическому документу в полностью квалифицированной URL пути, в моем сохраненный с предыдущего сеанса в приложении.