NSUbiquityIdentityDidChangeNotification不起作用?

我正在创build一个cloudkit应用程序,并一直在尝试多种方式来获取NSUbiquityIdentityDidChangeNotification ,但我从来没有能够得到这个通知。

我已经尝试了委托didFinishviewDidLoad方法下的这些代码版本。 我试图从另一个通知 – UIApplicationDidBecomeActiveNotification调用它。 我也把import Foundation放在文件的顶部。

这是我尝试过的基本代码:

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

//这个也是我从另一个post里试过的:

  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文档”才能获得令牌的代码。 有没有人知道有一个社交应用程序不需要它打开的影响? 还有没有启用iCloud文档获得令牌的另一种方法?

这是我用来获取令牌并放置在委托didFinish方法中的代码,但仅在打开iCloud文档时才有效:

 var token = NSFileManager.defaultManager().ubiquityIdentityToken println("token is \(token!)") 

在iOS上,当我退出iCloud时,我的应用程序被终止。 所以似乎没有必要收到NSUbiquityIdentityDidChangeNotification 。 就像你所说的那样,将当前令牌与保存的令牌进行比较似乎就足够了。

在苹果电视上,我的应用程序没有被杀死,当我退出iCloud。 在这里,我注意到通知并没有被解雇,就像你所描述的那样。 由于该应用程序没有被杀害,通知将是有序的。 (当苹果账户被更改后,苹果公司是否忘记在苹果电视上杀死应用程序?)

对于Apple TV,没有iCloud文档容器可用(除非我明确地从iOS应用程序共享一个)。 我发现,在开发中心网站上,对于应用程序标识符,如果没有select文档容器,iCloud显示为“可configuration”,而不是“已启用”。 我想知道这是否对收到通知有影响。

在Apple TV和iOS上,我也可以确认iCloud令牌在不使用文档(此处仅为key-value-store)时nil 。 现在,这使苹果电视应用程序很难(因为应用程序不会在iCloud帐户更改,如在iOS上),以检测帐户更改。

我刚刚注意到,当我login到另一个iCloud帐户时,我的Apple TV应用程序确实收到了几个NSUbiquitousKeyValueStoreDidChangeExternallyNotification ,以反映这些更改。 我想这是一样好。 这些通知随userInfoNSUbiquitousKeyValueStoreChangeReasonKey键一起提供, NSUbiquitousKeyValueStoreChangeReasonKey的值表示帐户已更改。

对不起,不能提供直接的解决scheme,也许这有助于分享我的经验。

如果用户在使用应用程序login或退出iCloud时在iOS中收到通知,请使用CKAccountChangedNotification而不是NSUbiquityIdentityChanged通知。

(更长的解释: https : //stackoverflow.com/a/38689094/54423 。)