12

我有时在打开存储在 iCloud 上的 UIDocuments 时遇到问题。在检查 iCloud 是否可用并获得 NSMetaDataQuery 的结果后,我在我的应用程序的最开始调用以下代码。这适用于所有情况的 98%。只是有时(例如,有时在重新安装应用程序后)完成处理程序永远不会被调用:

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

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

正如您从代码中看到的那样,我正在初始化一个新的 UIDocument 实例 (FRNBDocument),因此不可能是旧的 UIDocument 仍处于打开状态,因此无法打开。

让应用程序再次运行的唯一方法是杀死它,然后转到 settings.app > iCloud > Documents & Data 并关闭它,然后再次打开它。当我返回应用程序时,将毫无问题地加载 UIDocs。

我注意到其他应用程序(例如 xTrail by sophiestication)也有同样的问题,我只能在完成上述技巧后让它们再次运行。

到底是怎么回事?

4

3 回答 3

3

好的,这似乎是一个 iCloud 错误。我一直在与 Apple 联系,他们建议提交错误报告。所以我做到了(id 12260670)。

我现在要做的是简单地实现一个计时器。如果 UIDocs 在 20 秒后没有加载,我将显示一个 AlertView,告诉用户转到 settings.app > iCloud > Documents & Data 并将其关闭,然后再次打开。

这太令人沮丧了。难以置信的。

于 2012-09-08T09:52:45.503 回答
1

我有个类似的问题。NSMetadataQuery 返回一个结果,但 openWithCompletionHandler: 偶尔不会完成,因此应用程序的数据不会加载。有一段时间,我通过在尝试加载文档之前检查 NSMetadataUbiquitousItemIsDownloadedKey 来解决问题。如果没有下载,我调用了 evictUbiquitousItemAtURL 然后 startDownloadingUbiquitousItemAtURL。然后我不得不继续使用 NSMetadataQuery 轮询 NSMetadataUbiquitousItemIsDownloadedKey 是否为真,此时我可以成功调用 openWithCompletionHandler。这似乎解决了问题。然而令人沮丧的是,这似乎不再适用于 iOS 6,或者不再适用。如果您找到更好的解决方法或从 Apple 获取有关该错误的更新,请随时通知我们。

于 2012-10-11T17:04:07.833 回答
0

iCloud访问需要返回函数调用

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

返回

指向指定 ubiquity 容器的 URL,如果无法找到容器或当前用户或设备无法使用 iCloud 存储,则返回nil 。

参考

由于 iCloud 没有那么灵敏,我检查我是否获得了URL,然后只继续进一步同步数据。

NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
if (ubiq) 
{
    NSLog(@"iCloud access at %@", ubiq);
    [self loadDocument];
} 
else 
{
    NSLog(@"No iCloud access");
}
于 2012-09-09T12:38:21.150 回答