Timers Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

Debug版アプリをTestFlight からインストールするようにしてUDIDの呪縛から解放されたい #fastlane #Bitrise

iOSエンジニアのkirichanです。最近は Famm 年賀状の Android アプリも作ってます。

famm.us

Bitrise で fastlane を使用して、TestFlight に Debug 版のビルドをアップロードするようにした話になります。

なぜやったのか

TestFlight で配信するメリットはいくつかありますが、Famm においての1番の課題はUDID の管理でした。 新規端末、新規メンバーが増えるたびに UDID を登録しないといけないため、開発者にもインストールしたい側にも一定のコストがかかります。

参考にした記事

AdHoc 配信の歴史や TestFlight の仕組み、TestFlight で配信するメリットなどについてわかりやすくまとめられている記事がありますので、併せて参考にしてみてください。

qiita.com

上記記事ではBitriseの下記ステップを使用した方法ですが、今回Fammでは fastlane の upload_to_testflight アクションを使用して実現しています。

  • Xcode Archive & Export for iOS
  • Deploy to iTunes Connect - Application Loader

fastlane で行うことで、ローカルで配信をする際もCIと同じコマンドで行うことができますし、可能性は低いですがもしCIサービスの変更を行う際もスムーズな移行をすることができます。

また前職で同様のことをやったことがあり、知見が多少あったことから fastlane での アップロードを採用しました。

やったこと

App Store Connect に Debug 版のアプリを追加する

https://appstoreconnect.apple.com/apps

Bitrise から App Store Connect にビルドをアップロードするための認証設定

Bitrise のヘルプページを参考に、p8ファイルを使用した認証設定を行う。

Bitrise Workflow の設定

  • fastlane ステップを追加
  • fastlane lanebetaと入力(後述するFastfileのlane名)
  • API Key: URLAPI Key: Issuer IDに先ほど設定した認証情報を入力(URL の Key は Code Signing タブにあります)

Fastfile の変更

指定する Provisioning Profile は Distribution = App Store、App ID = Debug版アプリのID になります。 Bitrise の iOS Auto Provision with App Store Connect APIステップで管理していると、"Bitrise iOS app-store - (com.example.dev)"のような名前になるかと思います。

platform :ios do
  desc "Submit a new Beta Build to Apple TestFlight"
  lane :beta do
    build_app(
      workspace: "Famm.xcworkspace",
      scheme: "FammDev",
      export_method: "app-store",
      configuration: "Debug",
      export_options: {
        provisioningProfiles: {
          "com.example.dev" => "Bitrise iOS app-store - (com.example.dev)",
          "com.example.dev.NotificationExtension" => "Bitrise iOS app-store - (com.example.dev.NotificationExtension)",
          "com.example.dev.ShareDev" => "Bitrise iOS app-store - (com.example.dev.ShareDev)",
          "com.example.dev.WidgetExtension" => "Bitrise iOS app-store - (com.example.dev.WidgetExtension)"
        }
      }
    )
    upload_to_testflight(
      app_identifier: "com.example.dev",
      notify_external_testers: false,
      skip_waiting_for_build_processing: true
    )
  end
end

輸出コンプライアンス設定の自動入力

TestFlight にアップロードした後に輸出コンプライアンスを設定しないと配信できないため、info.plistに下記を追記して自動的に設定されるようにします。

<key>ITSAppUsesNonExemptEncryption</key>
<false/>

詰まったところ

TestFlight 各ビルドの Test Details に任意のメッセージを入れたい

upload_to_testflightアクションのchangelogで反映することができるのですが、アップロード後の Processing 中は反映できないようです。

f:id:krymsan:20211130164400j:plain:w300

Proccesing が完了するまで待つと30分ほどかかってしまい、その間Bitriseの並列実行数を占有してしまうため諦めました。QA依頼時は自動でインクリメントされるビルド番号をQAメンバーに伝える運用にしています。

ちなみにブランチ名の取得はこのようにできます。

qiita.com

さいごに

TestFlight に変更したことで、配信時間が約2倍になってしまいましたが、急いで実機インストール確認をしたいケースはほぼないため問題にはならないかなと思います。

それよりも UDID 登録の呪縛から解放されるメリットが圧倒的に大きいので、TestFlight 配信はおすすめです!

積極採用中!!

子育て家族アプリFammを運営するTimers inc.では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP: http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる