NSUbiquityIdentityDidChangeNotification和SIGKILL

时间:2015-04-09 18:39:34

标签: ios xcode swift icloud

斯威夫特1.2 Xcode 6

长期听众,第一次来电。

您好,

直接离开马口:"要处理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...}

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

实现这个的正确方法是什么?它会进入AppDelegate吗?当应用程序被发送到后台时,我们会删除观察者吗?

我遇到的问题是,当Ubiquity Token发生变化时,无论如何都会终止应用,因为用户已经更改了iCloud设置。

你们如何设法订阅此通知,如果你不这样做,你又做了什么来跟踪当前登录的iCloud用户?

谢谢!

4 个答案:

答案 0 :(得分:11)

简答

要在用户使用您的应用时登录或退出iCloud时在iOS中收到通知,请使用CKAccountChangedNotification,而不是NSUbiquityIdentityChanged

长答案

我一直在尝试让它也能运作。我记得在WWDC16的一次会谈中发现了一些东西,他们建议使用这样的东西。但是,根据他们提供的示例代码,我只能找到NSUbiquityKeyIdentityChanged,这是我无法开始工作的。

所以我回到了the video (it's from 2015)。这就是我看到它们引用CKAccountChangedNotification的地方 - 它完全符合预期:

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

答案 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
  • 用户登录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