🐈

iCloudのログイン状態を判定する

2021/07/14に公開

CloudKitと連携したアプリなどでは、ユーザーがiCloudにログインしていない状態だと使えない機能が出てきます。ユーザーのiCloudログイン状態の判定について調べました。

今回調査したきっかけ

CloudKitで公開Databaseにアクセスするとき、エラーも何も返ってこなかった問題がありました。
具体的には、CKQuery.performのコールバックが呼ばれませんでした。
明確な答えはstackoverflowなどでは解決できず、自力で調査した結果iCloudアカウントにログインしていないことが問題でした。特にシミュレータではiCloudアカウントにログインしてもすぐにログアウト状態となってしまうので比較的容易に問題が再現できました。

ユーザーがiCloudにログインしているかどうかの判定方法

iCloudにログインしているかどうかは、公式に記載がありました。

https://developer.apple.com/documentation/foundation/filemanager/1408036-ubiquityidentitytoken

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
}

参考

https://stackoverflow.com/questions/32335942/check-if-user-is-logged-into-icloud-swift-ios

Discussion