アカウント移行用に、iCloud アカウントに紐付いた一意の ID を取得する
複数の iOS 端末でのアカウント共有をしてもらうため、iCloud アカウントの ID を利用することを考えます。
様々な方法がありますが、CloudKit を使うのが一番簡単で考えることも少なくラクだと思います。
事前準備
- 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