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,你的应用程序不会被杀死。 当您的应用程序变为活动状态时,您确实会收到一个或多个NSUbiquitousKeyValueStoreDidChangeExternallyNotification
, NSUbiquitousKeyValueStoreChangeReasonKey
设置为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