iOSキーチェーンの引き継ぎについて

はじめに

こんにちは。メディアサービス開発部 モバイルアプリケーション開発課の楠本です。
普段はニコニコ漫画や読書メーターのiOSアプリ開発をしています。

キーチェーンは、iOSアプリがログインセッションなどのセキュアに保存しておきたい情報を保存するための機能です。実際にニコニコ漫画や読書メーターのアプリでは、ログインセッションをキーチェーンで管理しています。

iOSでは、新しい端末を購入したときに、それまで使っていた端末から新しい端末へデータを移行できます。
データ移行の方法や、アプリの実装によって、キーチェーンに保存している情報を移行できたりできなかったりする場合があります。

そこで、この記事ではどの方法を使用したときにキーチェーンに保存している情報を移行できるか、また移行させるためにはアプリの実装をどのようにするべきかを実際に試して検証しましたので、その結果をご紹介します。

データ移行の方法について

新しい端末の初期設定における、以前の端末からデータを移行する際の選択肢は以下の5つがあります。

  • iCloudバックアップから復元
  • MacまたはPCから復元
  • iPhoneから直接転送する
  • Androidからデータを移行
  • Appとデータを転送しない

バックアップ候補

これら5つの選択肢それぞれについて、キーチェーンをデータ移行できるかどうかについて調べた結果が次の表です。

データの移行方法

キーチェーンのデータが移行されるかどうか

iCloudバックアップから復元

× されない

MacまたはPCから復元

△ バックアップ時にローカルバックアップを暗号化していれば、される

ローカルバックアップを 暗号化するかどうかのチェックボックス

iPhoneから直接転送する

○ される

Androidからデータを移行

× されない

Appとデータを転送しない

× されない

この検証をした際、下記のような点で躓いたり苦労したりしました。

  • 移行先端末は、その端末において利用できる最新のOSである必要があります。
  • 移行先端末は、バックアップ時のOSバージョン以上である必要があります。
    • iPhone 7を移行先端末にした場合を試そうとしましたが、iPhone 7はiOS15までの対応だったため、iOS17の端末を移行元にはできませんでした
  • iCloudバックアップから復元には二要素認証を設定したiCloudアカウントである必要があり、SMSを受け取れる必要があります。
  • 直接iPhoneから転送する場合、テストフライト経由のアプリは転送されませんでした。
  • 直接iPhoneから転送するパターンが一番時間がかかり、おおよそ1時間かかりました。
  • 移行先端末が容量不足の場合、復元の残り時間計算中画面から数時間経過しても変化がありませんでした。
  • iPadからiPhone、またはiPhoneからiPadへのデータ移行はできませんでした。

実装について

kSecAttrAccessibleにThisDeviceOnlyを指定していると移行できない

kSecAttrAccessibleにThisDeviceOnlyを指定していると端末固有のUIDを利用してキーチェーンへ保存されるため、別の端末では復号できません。

developer.apple.com

一部のkSecClassでは、実装とユーザ設定によって、iCloud経由で常に同期できる場合がある

kSecClassがkSecClassGenericPasswordなどの場合、kSecAttrSynchronizableをkCFBooleanTrueに設定すると、その値がiCloudを経由して同期されます。

developer.apple.com

同期を有効にするためには、同じiCloudアカウントを使用している必要があります。
ただし、設定アプリの中でパスワードとキーチェーンの項目を有効にする必要があります。

iCloud パスワードとキーチェーン

まとめ

今回の調査を通じて、キーチェーンの引き継ぎに関する複数のケースを詳しく検証し、その挙動について深く理解することができました。この記事が、これからキーチェーンに関する挙動を理解しようとするみなさんの助けになれば幸いです。

ブックウォーカーでは物理・電子・Web連載問わず漫画や本が好き、あるいは将来の電子書籍や漫画連載をより良い設計ならびに実装で実現していくことに興味があるエンジニアを募集しています。

興味がありましたらぜひ、下記採用情報ページからカジュアル面談をお申し込みください。 お待ちしています。www.bookwalker.co.jp