应用程序终止后,打开iCloud文档时,UIDocument openWithCompletionHandler收到NO和UIDocumentStateSavingError

时间:2014-02-11 00:10:14

标签: ios icloud uidocument

我的应用使用单个文档(UIDocument)来包含其信息,并且在应用程序打开时永远不会关闭它。我已经实现了iCloud连接以保存文件,因此我可以跨设备共享它。使用模拟器(iOS7)时,我可以打开文档并保存到它。如果我在模拟器中退出应用程序,我仍然可以打开iCloud文档并在重新启动时使用它。

我正在iPad(iOS7)和模拟器上进行测试,以计算设备之间的更新。我可以成功打开iCloud文档(由模拟器保存)并在iPad上正确查看所有内容。但是,如果我在iPad上退出App并重新启动它,我的openWithCompletionHandler中的成功= NO和Document State = UIDocumentStateSavingError。我在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,方法是在模拟器中退出App并重新启动它以查看更新。

我在App Delegate的applicationWillTerminate方法中关闭了iCloud文档([iCloudListDocument closeWithCompletionHandler:nil];)。我想知道文件是否没有正确关闭,因此在重新启动时无法重新打开。

我搜索过StackOverflow,找不到任何可以帮助我的情况。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

好的,这很奇怪。我正在将完整路径URL保存到userDefaults中的iCloud文档,然后读取它并尝试使用它打开iCloud文档,如果我在重新启动时有一个有效的ubiquityIdentityToken。完整路径包含原始URLForUbiquityContainerIdentifier,其中附加了文档的最终位置和名称。此操作导致找不到文档([[NSFileManager defaultManager] fileExistsAtPath:fileName] = NO,其中fileName取自保存的完整路径URL。)

现在,这个奇怪的部分,无论如何对我来说。在我可以访问我保存的完整路径URL之前,我必须再次检索URLForUbiquityContainerIdentifier(NSURL * myUbiquityContainer = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];)。如果我在检查文档是否存在之前这样做了,[[NSFileManager defaultManager] fileExistsAtPath:fileName] = YES。

结论,在重新启动想要打开现有iCloud文档的应用程序时,您必须执行以下两种方法:

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

这将允许您访问完全限定路径URL中的实际文档,在我的情况下,从应用程序中的上一个会话中保存。