在设备中切换测试iCloud帐户以测试我的应用是否正确处理iCloud帐户更改检测时,我遇到了一个问题。
所以我的数据都存储在CloudKit和NSUbiquitousKeyValueStore
上。
当我使用iOS设置注销iCloud帐户A时,该应用程序将自动终止(我想这是确定的)。然后,当我使用iCloud帐户B登录并重新启动该应用程序时,在调用fetchUserRecordID
方法时,我会获得正确的iCloud帐户(B)。
问题是尽管NSUbiquitousKeyValueStore
不会立即更新,并且.plist
所维护的SynchedPreferences
下存储的NSUbiquitousKeyValueStore
文件仍然具有先前的即使我在检测到iCloud更改后显式调用了synchronize
方法,仍会获得iCloud信息。
这里的问题是,当iCloud帐户更改时,我是否还需要做其他事情才能使NSUbiquitousKeyValueStore
同步生效?还是我只需要等待didChangeExternallyNotification
通知的发生,这可能需要3到30分钟的时间,或者(在我注意到的其他情况下)可能只需要重新启动应用程序即可启动?>
答案 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应用程序外,我从来没有做过其他事情!