检测 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 端,我可以使用来自NSFileManager
的ubiquityIdentityToken
和URLForUbiquityContainerIdentifier("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 可用性变化的主要内容,如果未能解决你的问题,请参考以下文章
界面生成器:10.7 之前的 Mac OS X 版本上的属性不可用标识符