【Xcode/Fastlane】アップロードからリリース/審査までの自動化!deliverと自動署名

この記事からわかること

  • iOS/Xcode自動化ツールFastlane使い方
  • アップロードからリリース/審査までを自動化する方法
  • deliverアクション使い方
  • App Store Connect APIキー取得
  • Unable to upload archive. Failed to get authorization for username 'XXXXXXXXXX' and passwordエラー解消

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

Xcode/iOSアプリでFastlaneを使用してアップロードからリリース/審査までの自動化する方法をまとめていきます。導入やセットアップの方法は以下の記事を参考にしてください。

アップロードからリリース/審査までの自動化する方法

Fastlaneを使用してアップロードからリリース/審査までの自動化するにはdeliverアクションを使用します。このアクションを使用することでipaファイルをApp Store Connectへアップロードする作業から、スクリーンショットやアプリ名、概要などのメタ情報などの自動設定、審査への提出などを自動化することが可能です。

Fastlaneを使用したipaファイルの生成方法は以下の記事を参考にしてください。

おすすめ記事:【Xcode/Fastlane】自動ビルドしてipaファイルを生成/アーカイブする方法!build_app

手順

  1. AppFileにアカウント情報を登録
  2. deliverのセットアップ
  3. メタ情報などの準備
  4. App Store Connect APIキーの取得
  5. Fastfileのレーン作成(deliverアクション)
  6. レーンを実行してアップロード

1.AppFileにアカウント情報を登録

まずはAppfileにAppleアカウントに関する情報を追加しておきます。Appfileに記述していなくてもdeliverアクションを実行した時に1つ1つ聞かれるだけなので都度入力すれば問題はありません。


# アプリのバンドルIDを定義
app_identifier "com.XXX.XXX"

# Apple ID 
apple_id "sample@sample.com"

# Apple Developer PortalのチームID
team_id "XXXXXXX"

# App Store ConnectのチームID
itc_team_id "XXXXXXX"

2.deliverのセットアップ

続いてdeliverアクションを使用するためのセットアップをしていきます。プロジェクトルートで以下のコマンドを実行します。Appfileに記述したバンドルIDのストアページがない場合はエラーになるので先に作成しておく必要があります。

$ bundle exec fastlane deliver init

コマンドを実行するとFastfileと同階層に「DeliverFile」、「metadataディレクトリ」、「screenshotsディレクトリ」の3つが生成されます。

├── プロジェクト
│ ├── プロジェクト.xcodeproj  
│ ├── fastlane
│        ├── AppFile
│        ├── Fastfile
│        ├── DeliverFile
│        ├── metadata
│                └── いろいろな設定ファイル
│        └── screenshots
│                └── README.txt
│ ├── etc...

このコマンドを実行した際にストアに既にスクショやメタ情報を記述していた場合はそれが反映された状態で「metadataディレクトリ」、「screenshotsディレクトリ」が生成されます。「DeliverFile」はdeliverアクションのパラメータファイルです。

3.メタ情報の準備

ストアに掲載したい情報はmetadataディレクトリの中にあるテキストファイルに記述していきます。最初はファイルの中身が空になっているのでファイル名からどこの項目に該当するか読み解きながら値のみを記述していきます。

例えば「review_information」ディレクトリ中には以下の部分のメタ情報と連携しています。

【Xcode/Fastlane】アップロードからリリース/審査までの自動化!deliverでメタ情報の定義
├── fastlane
│ ├── metadata
│        ├── copyright.txt
│        ├── review_information
│                ├── demo_password.txt
│                ├── demo_user.txt
│                ├── email_address.txt
│                ├── first_name.txt
│                ├── last_name.txt
│                ├── notes.txt
│                └── phone_number.txt
│        ├── etc...

中には以下のように値だけを記述します。電話番号は日本なら最初の0+81にする必要があるので注意してください。


+8190XXXXXXXXXX

ひとまずアップロードまでの動作を確認したいので最低限の作業だけしてアップロード作業を行いたいと思います。メタ情報はreview_informationの以下4つだけ記述しておかないとエラーが発生したのでこれだけ記述しておきます。

first_name.txt
last_name.txt
notes.txt
phone_number.txt

発生したエラー

The provided entity is missing a required attribute - You must provide a value for the attribute 'contactFirstName' with this request - /data/attributes/contactFirstName
The provided entity is missing a required attribute - You must provide a value for the attribute 'contactLastName' with this request - /data/attributes/contactLastName
The provided entity is missing a required attribute - You must provide a value for the attribute 'contactEmail' with this request - /data/attributes/contactEmail
The provided entity is missing a required attribute - You must provide a value for the attribute 'contactPhone' with this request - /data/attributes/contactPhone
An attribute value is invalid. - The phone number must be in a valid format. Preface the phone number with ‘+’ followed by the country code (for example, +44 844 209 0611) - /data/attributes/contactPhone

またアップロードする際には最低限アプリアイコンはアセットに定義されていないとエラーになるのでこちらも対応しておいてください。

最低限必要なメタ情報

4.App Store Connect APIキーの取得

App Store Connectへアップロードするためには認証する必要があります。認証はAppleが公式で提供しているApp Store Connect APIを使用します。

Fastlaneで使用するのは「App Store Connect APIキー(.p8ファイル)」だけになります。APIキーの取得方法は以下の記事を参考にしてください。この記事ではJWTの取得方法やAPIの叩き方なども紹介しています。

APIキー(.p8ファイル)がダウンロードできたらその画面に示されている「IssuerID」と「キーID」を後で使用するのでコピーしておいてください。上記の記事の手順とは異なりFastlaneではapp_store_connect_api_keyアクションでJWTが生成できます(後述)。

【iOS】App Store Connect APIとは?JWTトークンの取得方法

ダウンロードしたファイルはfastlaneと同階層においておきます。ここは管理しやすい場所に設置すればどこでもOKです。

├── プロジェクト
│ ├── プロジェクト.xcodeproj  
│ ├── AuthKey_XXXXXXXXXX.p8
│ ├── fastlane
│        ├── AppFile
│        ├── Fastfile
│        ├── DeliverFile
│        ├── metadata
│        └── screenshots
│ ├── etc...

5.Fastfileのレーン作成(deliverアクション)

続いて実際にアップロードする前のレーン処理を実装していきます。やるべきことは以下の3つです。

DeliverFileにApple IDのメールアドレスを定義

まずは「DeliverFile」に対象のApple IDのメールアドレスを定義します。


username "Apple IDのメールアドレス"

.envを作成し必要な秘匿情報を定義

続いて「.env」ファイルを「fastlane」と同じ階層に生成しアップロードに必要な秘匿情報を記述しておきます。なのでこの「.env」ファイルは.gitignoreファイルに記載しコミットしてしまわないように注意してください。


TEAM_ID=XXXXXXXXXX
KEY_ID=XXXXXXXXXX
ISSUER_ID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX
KEY_FILE_PATH=AuthKey_XXXXXXXXXX.p8 # AuthKey_XXXXXXXXXX.p8ファイルへのパス
# ↑ このパスはfastlaneディレクトリから見た位置を指定する

Fastfileにアップロードまでのアクションを追加

最後に「Fastfile」ファイルにアップロードする処理を記述していきます。ここでの処理の流れは以下のとおりです。

  1. ビルド番号を増加
  2. 自動署名(プロビジョニングプロファイル自動生成)
  3. ビルド(ipaファイル生成)
  4. 認証(JWTの生成)
  5. App Store Connectにアップロード

default_platform(:ios)

platform :ios do
  desc "App Store Connectにアップロード"
  lane :release do
    # 1.ビルド番号インクリメント
    increment_build_number
    # 2.自動署名
    automatic_code_signing(
      use_automatic_signing: true,
      team_id: ENV['TEAM_ID']
    )
    # 3.ビルド(ipaファイル生成)
    gym(
      scheme: "FastlaneTest",
      output_directory: "./build",       # 出力先ディレクトリ
      output_name: "FastlaneTest.ipa",   # 出力ファイル名
      export_xcargs: "-allowProvisioningUpdates"  # プロビジョニングプロファイルを自動的に更新
    )
    # 4.認証(JWTの生成)
    api_key = app_store_connect_api_key(
      key_id: ENV['KEY_ID'],
      issuer_id: ENV['ISSUER_ID'],
      key_filepath: ENV['KEY_FILE_PATH']
    )
    # 5.App Store Connectにアップロード
    deliver(
      api_key: api_key,
      submit_for_review: false,  # 審査に提出するかどうか
      force: true,               # アップロード前に確認が必要かどうか
      submission_information: {
      export_compliance_uses_encryption: false,    # 輸出コンプライアンスの暗号化を使用するか
        export_compliance_encryption_updated: false, # 輸出コンプライアンスの暗号化を更新するか
        add_id_info_limits_tracking: false, # アプリが広告トラッキングを制限するかどうか
        add_id_info_uses_idfa: false,       # 広告ID情報 idfaを使用するか
        add_id_info_serves_ads: false,      # 広告ID情報 広告を配信するか
        add_id_info_tracks_action: false,   # 広告ID情報 アクションの追跡を行うか
        add_id_info_tracks_install: false,  # 広告ID情報 インストールの追跡を行うか
      },
      precheck_include_in_app_purchases: false # アプリ内課金のチェックを除外
    )
  end
end

6.レーンを実行してアップロード

ここまで準備ができたらターミナルで作成したレーンを実行するだけです。以下のコマンドを実行することで現在のプロジェクトをビルドしApp Store Connectへアップロード作業が完了します。時間としてはプロジェクトに規模などにもよりますが、数分程度で終了し、一連の流れを一つのコマンドで終えられるのはかなり大きなメリットになるかと思います。

$ bundle exec fastlane release

Unable to upload archive. Failed to get authorization for username 'XXXXXXXXXX' and password

上記コマンドを実行した際には以下のようなエラーが発生しました。これは認証が成功しなかった場合に発生するエラーで、App Store Connect APIでの認証が失敗したことを表しています。「IssuerID」や「キーID」などを再確認して、再度実行してみてください。

[Application Loader Error Output]: Error uploading '/var/folders/wh/XXXXXXXXXXXXXXXXXXXXXXXXX/T/XXXXXXXXXXXXXXXXXXXXXXXXX.ipa'.
[Application Loader Error Output]: Unable to upload archive. Failed to get authorization for username 'XXXXXXXXXX' and password. (
[Application Loader Error Output]: The call to the altool completed with a non-zero exit status: 1. This indicates a failure.

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index