长期听众,第一次来电。
您好,
直接离开马口:"要处理iCloud可用性的变化,请注册以接收NSUbiquityIdentityDidChangeNotification通知。"
以下是他们为实现此目的而提供的代码:
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector (iCloudAccountAvailabilityChanged:)
name: NSUbiquityIdentityDidChangeNotification
object: nil];
我在我的应用程序中对它进行了调整:
var observer = NSNotificationCenter.defaultCenter().addObserverForName
(NSUbiquityIdentityDidChangeNotification, object: nil, queue: NSOperationQueue.mainQueue()
){...completion block...}
实现这个的正确方法是什么?它会进入AppDelegate吗?当应用程序被发送到后台时,我们会删除观察者吗?
我遇到的问题是,当Ubiquity Token发生变化时,无论如何都会终止应用,因为用户已经更改了iCloud设置。
你们如何设法订阅此通知,如果你不这样做,你又做了什么来跟踪当前登录的iCloud用户?
谢谢!
答案 0 :(得分:11)
要在用户使用您的应用时登录或退出iCloud时在iOS中收到通知,请使用CKAccountChangedNotification
,而不是NSUbiquityIdentityChanged
。
我一直在尝试让它也能运作。我记得在WWDC16的一次会谈中发现了一些东西,他们建议使用这样的东西。但是,根据他们提供的示例代码,我只能找到NSUbiquityKeyIdentityChanged
,这是我无法开始工作的。
所以我回到了the video (it's from 2015)。这就是我看到它们引用CKAccountChangedNotification
的地方 - 它完全符合预期:
答案 1 :(得分:1)
在 Swift 3.0 中有另一个重命名:
现在NSUbiquityIdentityDidChangeNotification
已更改为NSNotification.Name.NSUbiquityIdentityDidChange
。
所以完整注册如下:
// Register for iCloud availability changes
NotificationCenter.default.addObserver(self, selector: #selector(...), name: NSNotification.Name.NSUbiquityIdentityDidChange, object: nil)
答案 2 :(得分:0)
我发现了相同的问题,请参阅this question以获取我的意见。
总结一下:在iOS上,我认为当iCloud帐户发生变化(或刚刚签署)时,应用程序无论如何都会被杀死。所以不需要听NSUbiquityIdentityDidChangeNotification
。
但是,如果您使用的是tvOS,则您的应用程序不会被杀死。当您的应用变为有效状态时,您会收到一个或多个NSUbiquitousKeyValueStoreDidChangeExternallyNotification
NSUbiquitousKeyValueStoreChangeReasonKey
设置为NSUbiquitousKeyValueStoreAccountChange
因为tvOS会交换您的整个无处不在的键值存储。
也许您可以通过一些技巧来检测帐户更改,例如在普遍存在的键值存储中存储NSUUID
,当值发生变化时,表示存在新帐户。但您无法检测帐户是否已注销。
答案 3 :(得分:0)
在iOS 10上,我发现NSUbiquityIdentityDidChangeNotification
从未发送过。如果我有一个CKContainer(根据文档),CKAccountChangedNotification
是在非常有限的情况下发送的。
使用xCode 9.1构建,然后在iOS 10.02 iPhone 6+和iOS 11.0.3 iPhone SE上进行测试
如果
,则发送CKAccountChangedNotification如果
,申请已终止