检测 OS X 上的 iCloud 可用性变化

Posted

技术标签:

【中文标题】检测 OS X 上的 iCloud 可用性变化【英文标题】:Detect iCloud availability change on OS X 【发布时间】:2015-10-05 10:30:10 【问题描述】:

我有一对应用程序,一个用于 ios,一个用于 OS X,如果用户选择,它们通过 CloudKit 私有数据库和 iCloud 键值存储共享数据,他已登录并为我的启用了 iCloud 数据和文档应用程序,并且从一开始就启用或禁用 iCloud 时一切正常。

在 iOS 端,我可以使用来自NSFileManagerubiquityIdentityTokenURLForUbiquityContainerIdentifier("iCloud.my.default.container.for.osx") 检测Settings 应用程序中的用户选择,以检测用户是否已登录以及他是否启用了数据和文档,并且它们是nil 时预期:当它们既不是 CloudKit 也不是 Key-Value 存储时(如预期的那样)。

在应用程序运行时更改这两个设置时,它会终止,因此我可以在再次打开时检查更改,所以没问题。当我在 OS X 上测试相同的代码时,我发现如果我关闭 System Preferences 中的数据和文档,该应用程序不会被杀死,但我想这是预期的行为,但即使我使用监听 iCloud 可用性变化

NSNotificationCenter.defaultCenter().addObserver(self, selector: "checkiCloud:", name: NSUbiquityIdentityDidChangeNotification, object: nil)

我的应用没有收到通知。如果我手动检查 iCloud 可用性,即通过重新启动应用程序,我发现 ubiquityIdentityToken 不是 nil,这是正确的,因为我已登录 iCloud,但即​​使 URLForUbiquityContainerIdentifier("iCloud.my.default.container.for.osx") 也不是 nil,这不是我所期望的.

这是 OS X 上的预期行为吗?如果是这样,我如何检查 iCloud 是否被禁用并在发生变化时得到通知?或者这是一个错误(我正在 El Capitan 上进行测试)?

更新:同时禁用 iCloud Drive 会触发通知,URLForUbiquityContainerIdentifier() 返回 nil 所以我猜这是一个错误。

更新:我已向 Apple 提交错误报告:#22973458

【问题讨论】:

为什么URLForUbiquityContainerIdentifier() 不是您所期望的nil?在OS X 中,您应该改用NSDocument 对象(如果您的应用是基于文档的)。 当我为我的应用禁用 System Preferences 中的数据和文档时,我仍然会得到一个 URL,但这仅在 OS X 上发生。在 iOS 上执行相同操作时,我会在调用 @987654340 时给我 nil @。该应用程序不是基于文档的,它使用我与 CloudKit 保持同步的核心数据数据库。 我相信您看到的返回值可能是您的应用程序本地默认容器,不确定。您可能希望使用NSURLRelationship 通知NSUbiquityIdentityDidChangeNotification iCloud 是否已禁用或身份已更改。 我将一个特定值传递给URLForUbiquityContainerIdentifier()(我会更新我的问题),但该值是默认容器,所以我猜这也是同一个问题。我是否应该使用两个应用程序都不是默认的容器,但 Apple 在文档中说这是不可能的?你能发布一个关于如何做到这一点的例子吗? 如果你能指出文档中提到它的地方,我很想看看它说了什么。我认为您不需要使用不同的容器;您的目标是否只是检查 iCloud 是否被禁用和/或它是否是不同的 iCloud 身份? 【参考方案1】:

如果您正在构建基于文档的 OS X 应用程序,您可以使用

if ([[NSFileManager defaultManager] ubiquityIdentityToken])
//iCloud Drive is enabled

检查设备是否启用了 iCloud Drive。

【讨论】:

以上是关于检测 OS X 上的 iCloud 可用性变化的主要内容,如果未能解决你的问题,请参考以下文章

仅使用键值存储检测 iCloud 帐户可用性/更改?

界面生成器:10.7 之前的 Mac OS X 版本上的属性不可用标识符

验证 iCloud 容器上的文档是不是存在

64 位系统上的 OS X Carbon 框架

Qt & OpenGL OS X:山狮上的 GLSL 着色器版本只有 120

在一个可执行文件中使用 iPhone OS 3.0 功能(如果可用)和 2.1 功能(如果不可用)