App Store多言語対応をfastlane+ASC APIで効率化した話。できること・できないことの現実
App Storeの多言語対応(日本語+英語)をfastlane+App Store Connect APIで自動化しようとしたら、 想定外の詰まりポイントが3つ出てきました。できること・できないことの境界線と、手動×自動ハイブリッドで乗り切った方法をまとめます。

iOSアプリを初めて多言語対応で審査に出したとき、改めて実感したのが「App Storeの入稿作業は多言語だと2倍じゃ済まない」ということでした。
アプリ名、サブタイトル、説明文、キーワード——これを日本語と英語でそれぞれ用意して、App Store Connectに入稿していく。ブラウザからポチポチやると地味に時間がかかります。
そこで今回は fastlane+App Store Connect APIを使ってメタデータ入稿を自動化に挑戦しました。結論から言うと「全部自動でいける」という甘い見込みは外れたのですが、ハマりポイントを全部乗り越えたら審査提出まで到達できました。その過程を書きます。
fastlaneとApp Store Connect APIとは
まず簡単に整理します。
App Store Connect(ASC) は、Apple が提供するアプリ管理画面です。説明文や価格の設定、審査への提出など、App Store への公開に関わる操作を行う場所です。
fastlane は、そのASCをコマンドで自動化するオープンソースツールです。「アプリ名を更新して」「審査に出して」といった作業を、設定ファイルに書いておけばターミナルから一発で実行できます。
fastlane公式サイト → https://fastlane.tools/
fastlaneからASCを操作するには、APIキーによる認証が必要です。これが App Store Connect API です。Apple が公式に提供している REST API で、メタデータの更新や審査提出などをプログラムから操作できます。
セットアップ:ASCとfastlaneを繋ぐ
認証の仕組みを一度セットアップしてしまえば、複数のプロジェクトで使い回せます。
ステップ1:APIキーを発行する
App Store Connect にログインして「ユーザーとアクセス」→「統合」→「App Store Connect API」→「チームキー」を開きます。

「+」ボタンで新しいキーを作成し、権限は「App Manager」を選択します。作成後、.p8 形式の鍵ファイルをダウンロードします。このファイルは一度しかダウンロードできないので、大切に保管してください。
また、この画面に表示されている「キーID」と「発行者ID(Issuer ID)」をメモしておきます。
ステップ2:鍵ファイルを正しい場所に置く
ダウンロードした .p8 ファイルは、以下のパスに保存するのが推奨です。
~/.appstoreconnect/private_keys/AuthKey_XXXXXXXXXX.p8
XXXXXXXXXX の部分がキーIDです。ここに置くと fastlane が自動的に見つけてくれるうえ、プロジェクトフォルダの外なのでGitHubに誤ってアップするリスクもありません。
ステップ3:環境変数を設定する
キーIDと発行者IDを ~/.zshrc に書いておきます。
export APP_STORE_CONNECT_API_KEY_KEY_ID="YOUR_KEY_ID"
export APP_STORE_CONNECT_API_KEY_ISSUER_ID="YOUR_ISSUER_ID"
設定後は source ~/.zshrc で反映します。この方法にしておくと、プロジェクトが増えても同じ認証情報を使い回せます。
ステップ4:Fastfileに認証設定を書く
プロジェクトの fastlane/Fastfile に以下のように書きます。
lane :metadata do
api_key = app_store_connect_api_key(
key_id: ENV["APP_STORE_CONNECT_API_KEY_KEY_ID"],
issuer_id: ENV["APP_STORE_CONNECT_API_KEY_ISSUER_ID"],
key_filepath: "~/.appstoreconnect/private_keys/AuthKey_#{ENV['APP_STORE_CONNECT_API_KEY_KEY_ID']}.p8"
)
deliver(
api_key: api_key,
skip_binary_upload: true,
skip_screenshots: true,
force: true
)
end
ステップ5:多言語メタデータのフォルダ構成
fastlane の deliver コマンドはロケールごとにフォルダを分けて管理します。
fastlane/metadata/
├── ja/
│ ├── name.txt ← アプリ名(日本語)
│ ├── subtitle.txt ← サブタイトル(日本語)
│ ├── description.txt ← 説明文(日本語)
│ └── keywords.txt ← キーワード(日本語)
└── en-US/
├── name.txt ← アプリ名(英語)
├── subtitle.txt ← サブタイトル(英語)
├── description.txt ← 説明文(英語)
└── keywords.txt ← キーワード(英語)
このフォルダ構成にテキストを書いて fastlane metadata を実行するだけで、日英両方のメタデータが一括で入稿されます。手動でブラウザから入力する場合と比べると、修正のたびにASCを開き直す手間がなくなります。
自動化できること・できないこと
セットアップが終わって実際に動かしてみると、自動化できることとできないことがあることがわかりました。
自動化できたこと:
- アプリ名・サブタイトル・説明文・キーワードの入稿(日本語・英語の多言語対応)
- カテゴリの設定
- 年齢レーティングの設定
- コンテンツ権利(サードパーティコンテンツを含まない)の設定
- 輸出コンプライアンス(暗号化を使っていない)の設定
fastlane deliverコマンドで審査提出
手動でやるしかなかったこと:
- アプリのプライバシー(プライバシー栄養ラベル)の回答
- 価格設定(後述)
- スクリーンショットのアップロード
「全部自動でいけるはず」という見込みは甘かった。特にプライバシー栄養ラベルはApple側のAPIが対応していないので、「このアプリはどんなデータを収集しますか?」という質問にASCの画面から手動で答えるしかありません。
ハマりポイント①:設定ファイルのキー名が古くなっていた
年齢レーティングを自動設定するには fastlane/metadata/app_rating.json に設定値を書きます。
{
"CARTOON_OR_FANTASY_VIOLENCE": "NONE",
"REALISTIC_VIOLENCE": "NONE",
...
}
このキー名の書き方がくせ者で、ネット上の古い記事をもとに書いていたらエラーが出て落ちました。
ClaudeCode にfastlaneの内部コードを読んでもらったところ、正しいキー名を教えてもらいました。ドキュメントには明記されていない内容で、自分では絶対にたどりつけなかったと思います。
教訓:app_rating.json を書くときは、fastlane の最新ソースコード(Spaceship::Tunes::AgeRatingDeclaration 周辺)を参照するか、ClaudeCode に確認してもらうのが確実です。
ハマりポイント②:Appleが年齢レーティングに新しい必須項目を追加していた
キー名を直したら、今度は別のエラーが出ました。
The provided entity is missing a required attribute - 'userGeneratedContent'
The provided entity is missing a required attribute - 'gambling'
The provided entity is missing a required attribute - 'parentalControls'
...(計10項目)
要約すると「必須項目が足りません」です。
Apple が年齢レーティングに新しい必須項目を追加していたのに、fastlane がまだ対応できていませんでした。「設定ファイルのフォーマットが Apple 側の仕様変更によって古くなっていた」という状態です。
対処法は、fastlane が自動で処理しない新しい項目を app_rating.json に自分で追記することでした。ClaudeCodeがfastlaneのソースコードを解析して、追加すべき項目と値を教えてくれました。
{
"CARTOON_OR_FANTASY_VIOLENCE": "NONE",
"REALISTIC_VIOLENCE": "NONE",
"USER_GENERATED_CONTENT": "NONE",
"GAMBLING": "NONE",
"PARENTAL_CONTROLS": "NONE"
}
fastlane は便利なツールですが、Appleの仕様変更に追いつけていない箇所があります。エラーが出たらfastlaneの最新ソースを確認するか、不足している項目はClaudeCodeに頑張ってもらいます。
ハマりポイント③:価格設定もAPIの変更で動かなくなっていた
価格を「無料」に設定する処理も fastlane で自動化しようとしたのですが、こちらもエラーが出ました。
原因はハマりポイント②と同じで、Apple が API の仕様を変更したのに fastlane が対応できていないというものでした。調べると「現状 fastlane では直せない、修正待ち」という状態だとわかりました。
回避策はシンプルで、ASCの画面から「Pricing and Availability」→「Free」を選ぶだけです。30秒で終わります。こういう「壊れている箇所は手動で補う」というハイブリッド判断が、現時点では良いかなと思います。
多言語対応での効率化の実感
詰まりポイントを全部乗り越えたあと、実際に多言語対応で審査提出できました。
一番効率化を実感したのは説明文の修正サイクルです。日英の説明文を書き直したいとき、ブラウザのASCで修正すると「日本語版を開いて保存」→「英語版を開いて保存」と2往復かかります。fastlane なら ja/description.txt と en-US/description.txt をエディタで直して fastlane metadata を実行するだけで、両言語が一括更新されます。
今回整備したもの:
- ASCのAPIキー認証の仕組み(複数プロジェクトで使い回せる設定)
deliverコマンド:多言語メタデータ・年齢レーティング・カテゴリを一括入稿- 年齢レーティング設定ファイル:Apple最新仕様対応版
まとめ
今回一番の学びはこれです。
fastlane は万能ではない。Apple の API が変わるとすぐ壊れる箇所がある。
2024〜2025年にかけて Apple が API 仕様を大きく変更した影響で、fastlane の対応が追いついていない箇所が複数ありました。「エラーが出ても、何が壊れているかを読み解ければ手動で補える」という割り切りが大事です。
「どこで壊れているか」「なぜ壊れているか」の原因特定を ClaudeCode にやってもらえたのが大きかった。fastlane のソースコードを直接読んで「この項目が追加されていますね」と教えてもらえるのは、非エンジニアが一人でやるには難しい作業です。
多言語対応の App Store 入稿を効率化したい方に、fastlane+ASC API の組み合わせはおすすめできますが、非エンジニア的にはつまづきポイントが多く、今回自動化出来たポイントと、そうでなかった箇所は、今後また新しいアプリを作ろうと思った時に役立つ気がしたので、ここに書き残します。
同じように、入稿作業が手間!と感じている方に読んでいただければ幸いです!
