iCloudのログイン状態を判定する
CloudKit
と連携したアプリなどでは、ユーザーがiCloud
にログインしていない状態だと使えない機能が出てきます。ユーザーのiCloud
ログイン状態の判定について調べました。
今回調査したきっかけ
CloudKit
で公開Databaseにアクセスするとき、エラーも何も返ってこなかった問題がありました。
具体的には、CKQuery.perform
のコールバックが呼ばれませんでした。
明確な答えはstackoverflowなどでは解決できず、自力で調査した結果iCloudアカウントにログインしていないことが問題でした。特にシミュレータではiCloudアカウントにログインしてもすぐにログアウト状態となってしまうので比較的容易に問題が再現できました。
ユーザーがiCloudにログインしているかどうかの判定方法
iCloudにログインしているかどうかは、公式に記載がありました。
FileManager.ubiquityIdentityToken
In iCloud Drive Documents, when iCloud is available, this property contains an opaque object representing the identity of the current user. If iCloud is unavailable or there is no logged-in user, the value of this property is nil. Accessing the value of this property is relatively fast, so you can check the value at launch time from your app’s main thread.
iCloud
にログインしていると、ubiquityIdentityToken
がnilではなくなります。この値はアプリ起動時から使えます。
実装
実際には下記のように実装します。
static func isCloudKitContainerAvailable() -> Bool {
return FileManager.default.ubiquityIdentityToken != nil
}
参考
Discussion