10 min readfastlane / App Store / 個人開発 / iOS

App Store多言語対応をfastlane+ASC APIで効率化した話。できること・できないことの現実

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

App Store多言語対応をfastlane+ASC APIで効率化した話。できること・できないことの現実

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 で、メタデータの更新や審査提出などをプログラムから操作できます。

App Store Connect API 公式ドキュメント → https://developer.apple.com/jp/help/app-store-connect/get-started/app-store-connect-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.txten-US/description.txt をエディタで直して fastlane metadata を実行するだけで、両言語が一括更新されます。

今回整備したもの:

  • ASCのAPIキー認証の仕組み(複数プロジェクトで使い回せる設定)
  • deliver コマンド:多言語メタデータ・年齢レーティング・カテゴリを一括入稿
  • 年齢レーティング設定ファイル:Apple最新仕様対応版

まとめ

今回一番の学びはこれです。

fastlane は万能ではない。Apple の API が変わるとすぐ壊れる箇所がある。

2024〜2025年にかけて Apple が API 仕様を大きく変更した影響で、fastlane の対応が追いついていない箇所が複数ありました。「エラーが出ても、何が壊れているかを読み解ければ手動で補える」という割り切りが大事です。

「どこで壊れているか」「なぜ壊れているか」の原因特定を ClaudeCode にやってもらえたのが大きかった。fastlane のソースコードを直接読んで「この項目が追加されていますね」と教えてもらえるのは、非エンジニアが一人でやるには難しい作業です。

多言語対応の App Store 入稿を効率化したい方に、fastlane+ASC API の組み合わせはおすすめできますが、非エンジニア的にはつまづきポイントが多く、今回自動化出来たポイントと、そうでなかった箇所は、今後また新しいアプリを作ろうと思った時に役立つ気がしたので、ここに書き残します。

同じように、入稿作業が手間!と感じている方に読んでいただければ幸いです!

Nullko - 子育てPdM個人開発

Nullko - 子育てPdM個人開発

小学生育児中のフルタイム会社員。PdM歴約8年。AI個人開発に挑戦中。2026年1月から主にClaudeCodeを使い、個人開発をスタート。教育費シミュレーターGaku-Simや、子供と一緒に考えた未就学児向けのiOSアプリ「今日なに食べる?」などを付き回ペースでリリース。現在は、個人開発経験値を積むために、本サービス「DoneLayer」のiOS版とWEB版の開発に勤しむ日々。今まで作ったサービスはポートフォリオサイトで公開中。

アプリをDLする