【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:15.0.1
- watchOS:10.0
- Swift:5.9
- macOS:Sonoma 14.1
- fastlane:2.221.0
Xcode/iOSアプリでFastlaneを使用してアップロードからリリース/審査までの自動化する方法をまとめていきます。導入やセットアップの方法は以下の記事を参考にしてください。
アップロードからリリース/審査までの自動化する方法
Fastlaneを使用してアップロードからリリース/審査までの自動化するにはdeliver
アクションを使用します。このアクションを使用することでipaファイルをApp Store Connectへアップロードする作業から、スクリーンショットやアプリ名、概要などのメタ情報などの自動設定、審査への提出などを自動化することが可能です。
Fastlaneを使用したipaファイルの生成方法は以下の記事を参考にしてください。
おすすめ記事:【Xcode/Fastlane】自動ビルドしてipaファイルを生成/アーカイブする方法!build_app
手順
- AppFileにアカウント情報を登録
- deliverのセットアップ
- メタ情報などの準備
- App Store Connect APIキーの取得
- Fastfileのレーン作成(deliverアクション)
- レーンを実行してアップロード
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」ディレクトリ中には以下の部分のメタ情報と連携しています。
├── 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
またアップロードする際には最低限アプリアイコンはアセットに定義されていないとエラーになるのでこちらも対応しておいてください。
最低限必要なメタ情報
- review_informationディレクトリ内の一部情報
- アプリアイコンアセットの追加
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が生成できます(後述)。
ダウンロードしたファイルはfastlane
と同階層においておきます。ここは管理しやすい場所に設置すればどこでもOKです。
├── プロジェクト
│ ├── プロジェクト.xcodeproj
│ ├── AuthKey_XXXXXXXXXX.p8
│ ├── fastlane
│ ├── AppFile
│ ├── Fastfile
│ ├── DeliverFile
│ ├── metadata
│ └── screenshots
│ ├── etc...
5.Fastfileのレーン作成(deliverアクション)
続いて実際にアップロードする前のレーン処理を実装していきます。やるべきことは以下の3つです。
- DeliverFileにApple IDのメールアドレスを定義
- .envを作成し必要な秘匿情報を定義
- Fastfileにアップロードまでのアクションを追加
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」ファイルにアップロードする処理を記述していきます。ここでの処理の流れは以下のとおりです。
- ビルド番号を増加
- 自動署名(プロビジョニングプロファイル自動生成)
- ビルド(ipaファイル生成)
- 認証(JWTの生成)
- 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.
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。