【问题标题】:Why does iCloud sometimes stops working?为什么 iCloud 有时会停止工作?
【发布时间】:2012-08-26 12:04:04
【问题描述】:

我有时在打开存储在 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)也有同样的问题,我只能在完成上述技巧后让它们再次运行。

发生了什么事?

【问题讨论】:

  • 你能把你用来附加到 iCloud 的代码和其余的文件代码贴出来。。这里的代码不够。
  • @stackmonster 我使用我很乐意发布的普通代码,但我认为它不会有太大帮助。与 Apple 交谈,它似乎是一个众所周知的错误。

标签: iphone ios icloud uidocument


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    iCloud 访问需要返回函数调用

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

    返回

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

    Reference

    由于 iCloud 的响应速度不快,我检查我是否获得了 URL,然后才继续进一步同步数据。

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

    【讨论】:

    • 我不认为这是问题所在。我得到了一个有效的 ubiq,我什至通过 NSMetaDataQuery 得到了结果。但是,一旦 iCloud 卡住,就无法加载任何结果。
    • 你可以使用 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(queryDidFinishGathering:) name:NSMetadataQueryDidFinishGatheringNotification object:query]; 添加通知
    • 我已经完成了所有这些。我可以发布整个代码,但这会非常乏味且无关紧要。我已经确保一切都很好——而且它在 95% 的时间里都能正常工作。有时,只是有时,iCloud 会播放并且不会加载 UIDocument。这显然是一个已知问题 - 其他开发人员也有同样的问题。
    【解决方案3】:

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

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

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

    【讨论】:

    • @stackmonster 如果不是错误,请解释原因。如果它解决了问题,我很乐意将您的答案标记为正确答案。谢谢。顺便说一句,我已经尝试对这个问题使用技术支持事件,所以我相信如果这不是错误,他们会向我解释 API。但他们退还了 TCI 事件,并说我应该提交一个错误。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多