NSUbiquityIdentityDidChangeNotification和SIGKILL

Swift 1.2 Xcode 6

长时间的听众,第一次来电。

你好,

直接从马嘴:“处理变更的iCloud可用性,注册接收NSUbiquityIdentityDidChangeNotification通知。”

这里是他们提供的代码来实现这个:

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (iCloudAccountAvailabilityChanged:) name: NSUbiquityIdentityDidChangeNotification object: nil]; 

我在我的应用程序中使用swif

 var observer = NSNotificationCenter.defaultCenter().addObserverForName (NSUbiquityIdentityDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue() ){...completion block...} 

src: https : //developer.apple.com/library/ios/documentation/General/Conceptual/iCloudDesignGuide/Chapters/iCloudFundametals.html#//apple_ref/doc/uid/TP40012094-CH6-SW6

什么是正确的方法来实现这个? 它是否在AppDelegate? 当应用程序被发送到后台时,我们是否移除观察者?

我遇到的问题是,当无处不在的令牌改变时,应用终止,因为用户已经改变了iCloud设置。

你们如何设法订阅这个通知,如果你不知道,你会做什么来跟踪当前login的iCloud用户?

谢谢!

简答

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

长答案

我一直试图让这个工作。 我记得在WWDC16的一次会谈中有一些事情是他们推荐使用的。 然而,从他们提供的示例代码中,我只能findNSUbiquityKeyIdentityChanged ,我一直无法工作。

所以我回到了video(从2015年起) 。 这就是我看到他们引用CKAccountChangedNotification – 它的工作原理与预期完全一样:

  • 从Xcode在模拟器上启动您的应用程序
  • 退出到模拟器上的设置应用程序
  • login(或退出)iCloud账户
  • 返回到您的应用程序(点击模拟器主屏幕上的图标)
    • 收到通知。
  • 再次退出设置应用程序
  • 注销(或在)到iCloud帐户
  • 再次回到你的应用程序
    • 收到另一个通知。

Swift 3.0中有另一个重命名:

现在NSUbiquityIdentityDidChangeNotification已经变成了NSNotification.Name.NSUbiquityIdentityDidChange

所以完整的注册如下:

 // Register for iCloud availability changes NotificationCenter.default.addObserver(self, selector: #selector(...), name: NSNotification.Name.NSUbiquityIdentityDidChange, object: nil) 

我发现相同的问题,看到这个问题 ,我的意见。

总结一下:在iOS上,我认为应用程序在iCloud账户更改(或刚刚注销)时会被终止。 所以不需要听取NSUbiquityIdentityDidChangeNotification

但是,如果你使用的是tvOS,你的应用程序不会被杀死。 当您的应用程序变为活动状态时,您确实会收到一个或多个NSUbiquitousKeyValueStoreDidChangeExternallyNotificationNSUbiquitousKeyValueStoreChangeReasonKey设置为NSUbiquitousKeyValueStoreAccountChange因为tvOS会交换您的整个无处不在键值存储区。

也许你可以用一些NSUUID来检测帐户的变化,例如将NSUUID存储在无处不在的键值存储中,当值改变时,这意味着有一个新的帐户。 但是,您无法检测到帐户是否已注销。

在iOS 10上,我发现NSUbiquityIdentityDidChangeNotification从来没有发送过。 如果我有一个CKContainer(根据文档), CKAccountChangedNotification是在非常有限的情况下发送的。

使用xCode 9.1构build,然后在iOS 10.02 iPhone 6+和iOS 11.0.3 iPhone SE上进行testing

如果发送CKAccountChangedNotification

  • 用户login到iCloud帐户,或
  • 用户在iOS 11中启用iCloud Drive。这始终导致启用iCloud Drive-> App。 但是,获取帐户状态后,产生NoAccount!
  • 用户在iOS 10中启用iCloud Drive。iCloud Drive-> App的后续状态是禁用iCloud Drive时的状况。 帐户状态是适当的。 但是,如果iCloud Drive-> App在此时被禁用,启用它不会产生终止或通知。

如果应用程序被终止

  • 无论iCloud Drive状态如何,用户都从iCloud注销
  • 用户禁用了iCloud Drive-> App
  • 用户禁用iCloud Drive(即使iCloud Drive-> App已经禁用)
  • 用户在启用了iCloud Drive的情况下启动了应用程序,然后启用了iCloud Drive-> App