iOS URLForUbiquityContainerIdentifier 在某些设备上返回 nil

Posted

技术标签:

【中文标题】iOS URLForUbiquityContainerIdentifier 在某些设备上返回 nil【英文标题】:iOS URLForUbiquityContainerIdentifier returns nil on some devices 【发布时间】:2014-11-07 16:25:56 【问题描述】:

我正在尝试向我的应用程序添加 iCloud 支持,并且有两台设备用于测试,一台 iPhone 和一台 iPad。两者都运行 ios 8.1 并连接到同一个 Apple 帐户。当我检查 iCloud 的设置时,我可以看到其他应用程序在两台设备上都成功地使用了 iCloud。然而,虽然在 iPhone 上一切正常(即我在启动应用程序后不久收到“使用本地存储:0”消息),但在 iPad 上它崩溃了:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'

原来[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier : nil] 返回nil。考虑到我在两台设备上运行完全相同的构建,因此导致这种行为的原因可能是什么,因此在任何配置、权利等方面都没有差异。

编辑 实际上,似乎 iCloud 通常在 iPad 上不可用。 [NSFileManager defaultManager].ubiquityIdentityToken 也返回 nil,这应该是确定是否可以使用 iCloud 的一种相当可靠的方法。 :(

【问题讨论】:

显示您进行此调用的代码。它需要在后台线程上,因此您不能立即使用它的结果;我怀疑您没有考虑到调用的异步性质。 感谢您的提示。我检查了ubiquityIdentityToken,它是nil,所以这可能不是异步调用问题。 实际上,如果您遇到 [NSFileManager defaultManager].ubiquityIdentityToken 的问题并且可以通过登录和注销 iCloud 来解决......那么您将遇到此处报告的错误:18702493 和 18940230 . 据说 8.1.1 解决了这个问题 :) 请参阅下面的完整回复。 【参考方案1】:

iCloud 同步守护程序在 iOS 8.1 上似乎仍然有些不稳定。在出现问题的设备上,使用设置应用程序退出该 iCloud 帐户,然后重新登录。重新启动设备以获得良好的测量效果,然后重试。必要时重复。

这通常会为我清除任何 iCloud 的怪异之处...

除此之外,您的 iCloud 权利配置是否正确?检查开发中心网站上的 Xcode Capabilities 和 Certificates & Identifiers 并查看两者都认为这些都可以。如果受影响设备上的其他应用程序能够同步文档(通过 Documents & Data 或 iCloud Drive),那么它可能是您的配置。

另外,不要依赖设置告诉您其他应用程序能够同步文档 - 这些应用程序是否实际同步文档(所以在应用程序中创建文档并查看它们是否实际同步)...设置所说的并不总是反映底层守护进程实际在做什么。

【讨论】:

你是对的,退出 iCloud 并重新登录在设置中添加了一个额外的选项 - “文档和数据” - 这似乎是完成所有这些工作的关键点。如果用户遇到完全相同的问题,可能会将此指针作为提示包含在应用程序中:)【参考方案2】:

检查 iCloud 可用性的正确方法是检查(如您所说):

id icToken = [[NSFileManager defaultManager] ubiquityIdentityToken];

文档声明如下:

当 iCloud 当前可用时,此属性包含一个表示当前用户身份的不透明对象。如果 iCloud 因任何原因不可用或没有登录用户,则此属性的值为 nil。访问此属性的值相对较快,因此您可以在启动时从应用的主线程检查该值。

但是,显然在 iOS 8.1 上,这被破坏了,当您在主线程上执行此操作时,iOS 会终止您……然后崩溃! Little Birdies 表示 iOS 更新将很快解决此问题。

请参阅以下错误报告:18848310、18940230

【讨论】:

当它 ISNT nil 时它是什么值???它是字符串值还是整数?我如何将此令牌值作为 NSString 返回?? 不记得了,但上面包含的代码是正确的。我记得它会向某种对象返回一个 id。将该行粘贴到您的 App Delegate 中,然后查看调试器中返回的内容。

以上是关于iOS URLForUbiquityContainerIdentifier 在某些设备上返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别