🚀

iOSアプリ配布やmatchで2FA対策は不要?fastlaneがAppStoreConnect APIに対応しました!

2020/10/03に公開
3

fastlaneを利用してのAppStoreConnectへの配布には、2FA(2段階認証)の対策のためにApp用シークレットを用意したりといろいろ面倒でした。しかし、昨年AppStoreConnect APIがリリースされ、ついにfastlaneがこのAPIをサポートしました🎉(正確には2.162.0でmatchのサポートが入ったのでかなり使いやすくなったという感じです)

fastlaneチームの方々にはいつも本当に感謝しかありません。⭐を送るなどして応援しましょう!
https://github.com/fastlane/fastlane

App Store Connect APIを使うと何が嬉しいのか

https://docs.fastlane.tools/app-store-connect-api/
👆こちらのページを見てみましょう。

Benefitとして以下の4つが記載されています。

  • No 2FA needed
  • Better performance
  • Documented API
  • Increased reliability

2FAが不要になり、パフォーマンスがよく、ドキュメントに書かれているAPIを使い、信頼性が増します。いい事ずくめですね!

APIの秘密鍵を発行する

APIを利用するには秘密鍵が必要になります。

👇 まずAppStore Connectを開き、ユーザーとアクセスのキーを開きます。初期状態ではAPI利用のリクエストを送信する必要があります。

👇 「アクセスをリクエスト」を押すと、ポップアップが表示されるので、目を通した上でチェックを入れて提出を押します。これはすぐに承認されるようです。

👇 APIキーを生成を押します。

👇 名前は何でもいいでしょう。役割は、matchを使うのであればAppManagerかAdminである必要があります。

👇 ここで表示されるIssuerIDとキーIDもfastlaneで使用します。

fastlaneに組み込む

さっそくFastfileを編集していきましょう。matchを使いつつ、審査に向けてAppStoreConnectへアプリバイナリをアップロードします。app_store_connect_api_keyというactionを使います。詳細はこちらをご覧ください。

今回はCI/CD環境で実行することも踏まえ、ファイルとして読み込むのではなく文字列として秘密鍵を読むこむようにしました。GitHub ActionsやBitriseの場合でも、コンソールなどから環境変数を設定すればそのまま活用できるかと思います。

default_platform(:ios)

platform :ios do
  desc "Push a new release build to the App Store"
  lane :release do
    # api_keyの生成
    # ローカルであれば.env.defaultにASC_KEY_ID=your_keyのように設定してください。
    api_key = app_store_connect_api_key(
      key_id: ENV['ASC_KEY_ID'], # your key id
      issuer_id: ENV['ASC_ISSUER_ID'], # your issuer id
      key_content: ENV['ASC_KEY_CONTENT'], # your secret key body
      # ex) key_content: '-----BEGIN PRIVATE KEY-----\nfoobar\n-----END PRIVATE KEY-----'
    )

    match(
      api_key: api_key, # pass api_key
      app_identifier: 'YOUR APP BUNDLE ID',
      type: "appstore",
      readonly: is_ci
    )

    build_app(
      scheme: "YOUR_SCHEME",
      export_options: {
        method: "app-store",
      },
    )

    upload_to_app_store(
      api_key: api_key, # pass api_key
      skip_metadata: true,
      skip_screenshots: true,
      precheck_include_in_app_purchases: false, # 2.162.0ではfalseにしなければならない
    )
  end
end

2.162.0では、precheck_include_in_app_purchasesをfalseにする必要があります。ここを指定していないと次のようなエラーが出てしまいます。今後対応されるのでしょう。

[!] Precheck cannot check In-app purchases with the App Store Connect API Key (yet). Exclude In-app purchases from precheck or use Apple ID login

これでFastfileの設定は完了です(もし足りていない部分があれば教えて下さい)。以下を叩けば2FAなしでAppStoreへのアップロードが完了するはずです!

fastlane release

おわりに

これからはこの形が主流になっていくでしょう。早めに対応しておきたいところですね!

Discussion

Takeshi AkutsuTakeshi Akutsu

綺麗にまとまっていて、とても参考になりました!ありがとうございます。

こちらは好みの問題もあるかもしれませんが、返り値を使わない形で app_store_connect_api_key を実行すると、以降のactionでは api_key が自動設定されるようです。
参考までに、共有させていただきます。

The app_store_connect_api_key action sets Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY] and actions (like pilot) will automatically load the API Key from Actions.lane_context

lane :release do
  app_store_connect_api_key(
    key_id: "D383SF739",
    issuer_id: "6053b7fe-68a8-4acb-89be-165aa6465141",
    key_filepath: "./AuthKey_D383SF739.p8",
    duration: 1200, # optional (maximum 1200)
    in_house: false, # optional but may be required if using match/sigh
  )

  # Automatically loads Actions.lane_context[SharedValues::APP_STORE_CONNECT_API_KEY]
  pilot
end

参考: Use the shared value in lane context

mogamoga

おおーこれは便利ですね!これを使うほうがよさそうです、ありがとうございます!