我正在创建一个cloudkit应用,并尝试了多种方式来获取NSUbiquityIdentityDidChangeNotification
,但我无法收到此通知。
我在委托didFinish
和viewDidLoad
方法下尝试了这两个代码版本。我尝试从另一个通知中调用它 - UIApplicationDidBecomeActiveNotification
。我还将import Foundation
放在文件的顶部。
这是我尝试过的基本代码:
NSNotificationCenter.defaultCenter().addObserver(self,
selector: "handleIdentityChanged:",
name: NSUbiquityIdentityDidChangeNotification,
object: nil)
//这个我在另一篇文章here上也试过了SO:
var localeChangeObserver = NSNotificationCenter.defaultCenter().addObserverForName(NSUbiquityIdentityDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()) { _ in
println("The user’s iCloud login changed: should refresh all user data.")
}
有没有人知道如何让这个通知仅适用于swift中的cloudkit应用程序?我真的只想检测iCloud状态更改,然后在发生更改时启动提取userID
。
不是我需要访问ubiquityIdentityToken
,但我想知道为什么不存储令牌并且每次应用启动时将当前令牌与本地存储中的令牌进行比较以查看它是否是不同的帐户或零?因此,为什么需要通知?
此外,如果我打开“iCloud Documents”,我不需要获取令牌的代码。有没有人知道为不需要它的社交应用程序启用该功能的含义?还有另一种方法可以在不启用iCloud Documents的情况下获取令牌吗?
这是我用来获取令牌并放在委托didFinish
方法中的代码,但只有在打开iCloud文档时才有效:
var token = NSFileManager.defaultManager().ubiquityIdentityToken
println("token is \(token!)")
答案 0 :(得分:1)
在iOS上,当我退出iCloud时,我的应用程序被杀死了。所以似乎没有必要接收NSUbiquityIdentityDidChangeNotification
。就像你说的那样,将当前令牌与保存的令牌进行比较似乎就足够了。
在Apple TV上,当我退出iCloud时,我的应用程序没有被杀死。在这里,我注意到通知未被解雇,就像你描述的那样。由于应用程序未被杀死,因此通知将是有序的。 (当iCloud帐户发生变化时,Apple是否忘记在Apple TV上杀死应用程序?)
Apple TV没有可用的iCloud文档容器(除非我明确地从iOS应用程序共享一个)。我发现在开发中心网站上,对于应用程序标识符,如果未选择文档容器,则iCloud显示为“可配置”而不是“已启用”。我想知道这是否会对接收通知产生影响。
在Apple TV和iOS上,我还可以在不使用文档时确认iCloud令牌是nil
(此处:仅限键值存储)。现在这使得Apple TV应用很难(因为应用程序没有在iCloud帐户更改中被杀死,就像在iOS上一样)来检测帐户更改。
我刚刚注意到,当我登录另一个iCloud帐户时,我的Apple TV应用程序收到了多个NSUbiquitousKeyValueStoreDidChangeExternallyNotification
,以反映更改。我想这很好。这些通知随NSUbiquitousKeyValueStoreChangeReasonKey
中的userInfo
密钥一起提供,值NSUbiquitousKeyValueStoreAccountChange
表示帐户已更改。
很抱歉无法提供直接的解决方案,也许有助于分享我的经验。
答案 1 :(得分:1)
要在用户使用您的应用时登录或退出iCloud时在iOS中收到通知,请使用CKAccountChangedNotification
代替NSUbiquityIdentityChanged
通知。