【问题标题】:NSUbiquityIdentityDidChangeNotification doesn't work?NSUbiquityIdentityDidChangeNotification 不起作用?
【发布时间】:2015-03-09 00:28:41
【问题描述】:

我正在创建一个 cloudkit 应用程序,并且一直在尝试多种方法来获取 NSUbiquityIdentityDidChangeNotification,但我始终无法收到此通知。

我已经在委托didFinishviewDidLoad 方法下尝试了这两个代码版本。我尝试从另一个通知中调用它 - UIApplicationDidBecomeActiveNotification。我还将import Foundation 放在文件顶部。

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

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

// 这个我也在另一篇帖子here 上尝试过:

    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 swift notifications cloudkit


    【解决方案1】:

    在 iOS 上,当我退出 iCloud 时,我的应用程序被终止。所以似乎真的不需要接收NSUbiquityIdentityDidChangeNotification。正如您所说,将当前令牌与保存的令牌进行比较似乎就足够了。

    但在 Apple TV 上,当我退出 iCloud 时,我的应用程序并没有被终止。在这里,我注意到通知没有被触发,就像你描述的那样。由于该应用程序没有被杀死,因此将按顺序发出通知。 (更改 iCloud 帐户时,Apple 是否忘记关闭 Apple TV 上的应用程序?)

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

    在 Apple TV 和 iOS 上,当不使用文档时,我还可以确认 iCloud 令牌是 nil(此处:仅限键值存储)。现在这使得 Apple TV 应用程序(因为应用程序不会在 iCloud 帐户更改时被终止,就像在 iOS 上一样)难以检测帐户更改。

    我刚刚注意到,当我登录另一个 iCloud 帐户时,我的 Apple TV 应用确实收到了多个NSUbiquitousKeyValueStoreDidChangeExternallyNotification,以反映这些更改。我想这已经很好了。这些通知带有userInfo 中的NSUbiquitousKeyValueStoreChangeReasonKey 键,NSUbiquitousKeyValueStoreAccountChange 的值表示帐户已更改。

    很抱歉无法提供直接的解决方案,也许它有助于分享我的经验。

    【讨论】:

    • 感谢分享。我最终放弃了通知,并且有一段时间没有重新访问它,所以也许这个问题已经被 Apple 解决了……我记得看到其他帖子也抱怨没有收到这个通知。我从未使用过 Apple TV,但这听起来很有趣。我不熟悉你最后提到的通知,但听起来它与我尚未使用的键值存储有关。祝你的应用好运!
    【解决方案2】:

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

    (加长解释:https://stackoverflow.com/a/38689094/54423.)

    【讨论】:

      猜你喜欢
      • 2015-06-15
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多