📱

Firebase App DistributionとfastlaneでiOSテスターのUDID登録を自動化する

に公開

はじめに

iOSアプリ開発において、開発中のアプリをテスターへアプリを配布する場合、各テスト端末のUDIDをApple Developerサイトに登録する必要があります。

私たちのチームでは、以下のような運用フローでテスター配布を行っていました。

  1. (手動)テスターから端末のUDIDを収集
  2. (手動)Apple DeveloperサイトへUDIDを登録
  3. (CI)新規UDID含む最新のProvisioning Profileでアプリをビルド
  4. (CI)Firebase App Distributionでテスターへ配布

このフロー自体はうまく機能していましたが、運用していく中でステップ1~2の手動UDID登録にいくつかの課題が見えてきました。

日常的な作業負荷

  • 新しいテスターが増えるたびにApple Developerサイトにログインして登録作業が発生
  • テスターからUDIDを受け取ってから登録完了までのタイムラグ
  • テスター側でもUDIDを調べること自体に手間がかかる

ヒューマンエラーのリスク

  • UDIDのコピペミスによる登録失敗
  • 複数のテスターが同時に増えた場合の登録漏れ

データ管理の不安と復旧リスク

  • どのUDIDを誰が使用しているのか、管理が曖昧になりがち
  • Apple Developerサイトの登録が唯一の正となり、万が一のデバイスリセット時の復旧手段がない

こうした課題を解決するために検討していたところ、Firebase App Distributionに各テスターのUDID情報が保存されていることがわかり、これを活用して作業を自動化できないかと考えました。

自動化の全体像

今回実現する自動化フローは以下の通りです。

  1. (CI)Firebase App Distributionから全テスターのUDIDリストを取得
  2. (CI)取得したUDIDリストをApple Developerサイトへアップロード
    (以降はこれまでと同様のフロー)
  3. (CI)新規UDID含む最新のProvisioning Profileでアプリをビルド
  4. (CI)Firebase App Distributionでテスターへ配布

以下のような環境構成となります。

今回の重要なポイントは、UDIDのマスタデータをApple DeveloperサイトからFirebase App Distributionへ移行することです。
テスターがプロファイルをインストールした時点でFirebaseにUDIDが記録されるため、常に最新かつ正確なデバイスリストがFirebase上に自動で構築されます。このリストをダウンロードし、Apple Developerサイトへアップロードすることで、手動登録の作業を排除できます。

具体的なCI処理の実装内容

ここからは、fastlaneを使った具体的な実装方法を紹介します。

前提事項

以下については今回の本質的な話題から外れるので、事前に環境整備済みである前提とします。

  • CI環境の構築
  • CI環境からFirebaseサービスへのアクセス
  • CI環境からApp Store Connect APIへのアクセス

Firebase App Distributionから全テスターのUDIDリストを取得

firebase_app_distribution_get_new_devices(
  service_credentials_file: service_credentials_file, # Firebase認証情報
  project_number: "1234567890", # Firebaseのプロジェクト番号
  output_file: "tester_udids.txt" # 出力ファイル名
)

参考:
https://firebase.google.com/docs/app-distribution/register-additional-devices?hl=ja#programmatic-export-udids

公式ドキュメントはちょっと記載が古いようで、 app パラメータにFirebaseアプリIDを与える記載となっているのですが、こちらは現在Deprecatedとなっており、上記のように project_number を与える形式となっています。

取得したUDIDリストをApple Developerサイトへアップロード

register_devices(
  api_key: api_key, # App Store Connect API認証情報
  devices_file: "tester_udids.txt", # 登録したいUDIDリストファイル名
)

参考:
https://docs.fastlane.tools/actions/register_devices/

こちらはUDIDリストファイルを指定するだけなのでシンプルですが、公式ドキュメントに記載がある通りリストでの一括登録だけでなく個別UDID指定での登録も可能ですので、必要に応じて使い分けることも可能です。

なお、登録しようとしたUDIDが既にApple側へ登録済みの場合、そのUDIDの処理はスキップされます(重複して複数レコードが登録されることはありません)。また、この処理は「追加」のみで、既存のUDIDが「削除」されることもありません。

その後のステップと全体フロー

この段階の最新のProvisioning Profileを用いてビルドすれば、新規UDIDのデバイスで利用可能なアプリバイナリが生成できるので、こちらをFirebase App Distributionで配布すれば対応完了となります。

最終的なフロー全体像としては以下のような形となります。

lane :deploy_app do
  # 1. Firebase App Distributionから全テスターのUDIDリストを取得
  firebase_app_distribution_get_new_devices(
    service_credentials_file: service_credentials_file, # Firebase認証情報
    project_number: "1234567890", # Firebaseのプロジェクト番号
    output_file: "tester_udids.txt" # 出力ファイル名
  )

  # 2. 取得したUDIDリストをApple Developerサイトへアップロード
  register_devices(
    api_key: api_key, # App Store Connect API認証情報
    devices_file: "tester_udids.txt", # 登録したいUDIDリストファイル名
  )

  # 3. 最新のProvisioning Profile取得
  get_provisioning_profile(
    api_key: api_key, # App Store Connect API認証情報
    # その他必要なパラメータ...
  )

  # 4. アプリビルド
  build_app(
    scheme: "YourApp"
    # その他必要なパラメータ...
  )

  # 5. Firebase App Distributionへデプロイ
  firebase_app_distribution(
    service_credentials_file: service_credentials_file, # Firebase認証情報
    app: "1:1234567890:ios:abcdef123456" # FirebaseアプリID
    # その他必要なパラメータ...
  )
end

※ 各アクションの詳細なパラメータ設定は、プロジェクトの要件に応じて適宜追加してください

これをCI上で定期的に実行することで、新しいテスターが追加されても自動で対応できます。

まとめ

本記事では、Firebase App Distributionとfastlaneを組み合わせて、iOSアプリ配布時のUDID登録を自動化する方法を紹介しました。

この自動化により、以下のような効果が得られました。

  • 手動でのUDID登録作業が不要に
  • 新規テスター追加から配布までの時間を短縮
  • ヒューマンエラーのリスクを削減
  • Firebase App Distributionをマスタデータとすることで、万が一Apple側でデバイスリセットなどの問題が発生しても簡単に復旧可能

Firebase App Distributionのデバイス情報を活用することで、これまで属人的だった配布フローを安全かつ効率的に改善できます。同様の課題を抱えているチームの参考になれば幸いです。

株式会社フライヤー Tech Blog

Discussion