更改iCloud帐户时NSUbiquitousKeyValueStore同步延迟

时间:2018-12-15 14:19:15

标签: ios swift mobile icloud cloudkit

在设备中切换测试iCloud帐户以测试我的应用是否正确处理iCloud帐户更改检测时,我遇到了一个问题。

所以我的数据都存储在CloudKit和NSUbiquitousKeyValueStore上。

当我使用iOS设置注销iCloud帐户A时,该应用程序将自动终止(我想这是确定的)。然后,当我使用iCloud帐户B登录并重新启动该应用程序时,在调用fetchUserRecordID方法时,我会获得正确的iCloud帐户(B)。

问题是尽管NSUbiquitousKeyValueStore不会立即更新,并且.plist所维护的SynchedPreferences下存储的NSUbiquitousKeyValueStore文件仍然具有先前的即使我在检测到iCloud更改后显式调用了synchronize方法,仍会获得iCloud信息。

这里的问题是,当iCloud帐户更改时,我是否还需要做其他事情才能使NSUbiquitousKeyValueStore同步生效?还是我只需要等待didChangeExternallyNotification通知的发生,这可能需要3到30分钟的时间,或者(在我注意到的其他情况下)可能只需要重新启动应用程序即可启动?

2 个答案:

答案 0 :(得分:0)

您可以尝试观察CKAccountChanged对象,看看是否有帮助:

//AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

  //Listen for iCloud account status changes
  NotificationCenter.default.addObserver(self, selector: #selector(checkCloudKitStatus), name: Notification.Name.CKAccountChanged, object: nil)

  return true
}

@objc func checkCloudKitStatus(){
  //Do whatever you need to in order to switch iCloud accounts
}

checkCloudKitStatus()方法中,您可以尝试优雅地处理更改,以使您的应用程序不会崩溃。我怀疑当机可能是您的应用程式未正确处理帐户变更的迹象。您也可以尝试在该方法内刷新NSUbiquitousKeyValueStore

答案 1 :(得分:0)

我相信Apple已建立了一个名为NSUbiquityIdentityDidChangeNotification的单独的通知系统,用于登录和注销iCloud以及在iCloud Drive(或总共iCloud Drive)中打开/关闭应用程序的开关。

因此,基本上,如果您要检查应用程序的iCloud状态/登录和注销事件,请订阅NSUbiquityIdentityDidChangeNotification。如果您想知道iCloud在其他设备上为您的应用更改数据的时间,请订阅NSUbiquitousKeyValueStore.didChangeExternallyNotification

大多数应用程序可能都希望同时订阅这两个应用程序,尽管在设备上切换iCloud帐户除了调试iOS应用程序外,我从来没有做过其他事情!