うな(。・ε・。)

Android, iOS, AppEngine まわりのめもめも

アカウント移行用に、iCloud アカウントに紐付いた一意の ID を取得する

複数iOS 端末でのアカウント共有をしてもらうため、iCloud アカウントの ID を利用することを考えます。

様々な方法がありますが、CloudKit を使うのが一番簡単で考えることも少なくラクだと思います。

事前準備

f:id:liedderoptik:20151130185543p:plain

  1. iCloud Capability を ON にします。あわせて、CloudKit にチェックを入れます。

Capability の変更がありますが、iCloud の場合は既存のアプリからアップデートしても正常に Capability が移行されます。

コード

次のようにして1.iCloudアカウントに一意で2.アプリ毎に異なるIDを取得することができます。(トークン置換攻撃が予防されてます)

[[CKContainer defaultContainer] fetchUserRecordIDWithCompletionHandler:^(CKRecordID *recordID, NSError *error) {
    if (error != nil) {
        NSLog(@"%@", error);
        return;
    }
    NSLog(@"%@", recordID.recordName); // recordID.recordName が ID
}];

このコードを実行すると、_cd2f38d1db30d2fe80df12c89f463a9e のような NSString が取得できます。この ID の実体は UUID であり、推測可能性や名前空間の大きさは UUID に準じます。

一回の fetch には 2 秒ほどかかり、自動的にキャッシュされることもありません。したがって、KeyChain などを用いてキャッシュする運用が必要になります。

iCloud アカウントにログインしていない場合は、error のみが返ります。 AppStore でアプリをインストールしていることを考えると、このケースは数は多くないように思います。

全体的な性質を鑑みると、ユーザ ID としては自社のものを用意し、こちらの iCloud ID はアカウント紐付け用に利用するのがよいと思います。

参考

iOS Onboarding without Signup Screens — welcome aboard — Medium