eas submit iOSのエラー原因と対処法
著者:Mehdi Azizi
公開・10 分
eas submitの失敗は、EAS設定、Appleアカウント、ITMSコードによるバイナリ拒否の3種類です。原因と直し方をまとめます。
eas submit --platform ios が失敗したとき、どこを見ればいいかはほぼ必ずメッセージに書かれています。原因はEASの設定が不完全か、Appleアカウント側で止まっているか、Appleがバイナリを拒否したかのどれかです。 最初の2つは新しいビルドなしで数分で直せます。3つ目はITMSコードで見分けられ、ほぼ必ず新しいビルドが必要になります。
僕はSolys、TradaZen、NoleraなどのiOSアプリをExpoとEASで公開しています。ここで引用するメッセージは、Expo公式のGitHubリポジトリにあるEAS CLIのソースコードからコピーしたもので、2026年11月3日に再確認しています。Expoの旧フォーラムは現在Discordに誘導されているので、コードが一番確実な情報源です。eas.json ファイルから審査提出までの全体の流れは、先にEAS Submit iOS:ExpoアプリをApp Storeに公開するを読んでください。この記事では修理に専念します。
eas submitがやること、必要なもの
Expoのドキュメントによると、このコマンドは .ipa ファイルをApp Store Connectに送信します。Appleの処理が終わるとビルドがTestFlightに表示されます。通常10〜15分ほどです。ただし、アプリを審査に提出するわけではありません。 その操作はApp Store Connectで行う必要があります。
iOS送信に関するExpoのページには、前提条件が3つ挙げられています。
- 有料のApple Developerアカウント。App Storeへの送信には必須です。
ios.bundleIdentifierに設定したバンドルID。- EAS CLIのインストールと、Expoアカウントへのログイン。
対話なしで送信するには、同じページでさらに2つの設定が挙げられています。
eas.jsonのsubmitプロファイルにあるascAppId。App Store Connectのアプリページの番号です。- App Store Connect APIキー。EASに管理させるか、自分で用意します。作成方法、ロール、無効化についてはApp Store Connect APIキー(.p8)で詳しく解説しています。
最小構成のプロファイルは数行で済みます。値はダミーです。
{
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890"
}
}
}
}
EASがすでにAPIキーを保持していれば、このプロファイルだけで十分です。僕のアプリの大半はこの状態です。
メッセージを読む:3種類のエラー
修正方法を探す前に、コマンドがどの時点で止まったかを確認しましょう。この表は、失敗するたびに僕が使っている判断基準です。
| 失敗のタイミング | 種類 | 新しいビルドは必要? |
|---|---|---|
| 送信前 | EASの設定 | 不要 |
| Appleへの接続、アプリページの作成時 | Appleアカウント | 不要 |
| 送信後、ITMS-90xxxコード | バイナリ拒否 | ほぼ必ず必要 |
詳細はExpoのダッシュボードにある送信ページで確認できます。Expoはそこでログを読み、よくある失敗原因を示す「Build Annotations」の吹き出しを確認するよう勧めています。ターミナルでは、EAS CLIのリファレンスによると --verbose オプションを付ければEAS Submitのログが常に表示されます。
EASの設定エラー
「Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode.」
CIなどで --non-interactive を付けてコマンドを実行したのに、プロファイルに ascAppId がない状態です。この場合EAS CLIのコードは停止します。質問もできず、代わりにアプリページを作ることもできないからです。
修正:アプリページの番号を ascAppId にコピーします。 Expoが場所を説明しています。App Store Connectでアプリを開き、App Informationへ進みます。General Informationの下にあるApple IDの欄で、10桁ほどの数字です。AppleのメールアドレスでもバンドルIDでもありません。
Noleraでは、ascAppId がないとコマンドがApple Developerのセッションを要求してきました。このセッションは期限切れになります。番号を eas.json に入れてからは、送信時に何も聞かれなくなりました。
ascAppIdはビルドの後ではなく前に追加してください。SDK 57までは、Expoが計算するフィンガープリントに必ずeas.jsonが含まれます。ランタイムバージョンがfingerprintポリシーに従うVigieでは、ビルド後にこの番号を追加したことでフィンガープリントが変わりました。その後に公開したアップデートは、インストール済みのビルドには届かなかったはずです。SDK 58以降は、Expoの変更履歴によると、フィンガープリントのデフォルトプリセットbalancedはeas.jsonを無視します。
「App Store Connect API Keys cannot be set up in --non-interactive mode.」
プロファイルにキーがなく、EASにもアプリに紐づいたキーがない状態です。Expoの説明のとおり、非対話モードではキーを尋ねられないので、このメッセージで失敗します。
修正方法は2つあります。
- EASにキーを作成・保管させる。 自分のマシンで一度だけ対話モードで
eas credentials --platform iosを実行し、アプリ用のApp Store Connect APIキーを設定させます。 - 自分のキーを用意する。
ascApiKeyPath、ascApiKeyIssuerId、ascApiKeyIdに設定します。eas.jsonのリファレンスによると、この3つのフィールドには$ASC_API_KEY_PATHのような環境変数も使えます。
最新のアプリでは、--auto-submit オプションが送信用キーを作るためにApple IDを求めてきました。そこで、自分のキーの3つのフィールドを作業コピーのプロファイルに入れました(コミットはしていません)。そして完成済みのビルドを --id と --non-interactive で送信しました。
「EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter.」
変数にApp用パスワード以外のもの、多くはAppleのパスワードそのものが入っています。EAS CLIは送信前にこの形式をチェックします。
Appleのヘルプによると、App用パスワードは2ファクタ認証を有効にした状態で、account.apple.comのApp-Specific Passwordsから生成します。Appleアカウントのパスワードを変更すると、すぐに無効になります。Expoはこの方法を、デフォルトかつ推奨の方法であるAPIキーより安全性が低いとしています。
Appleアカウントのエラー
「… agree to the latest Program License Agreement in your developer account.」
メッセージ全体は「You currently don't have access to this membership resource」で始まります。Apple側の生のレスポンスには「Unable to process request - PLA Update available」が含まれることがあります。EASの最近の送信ステップでは、代わりに「A required Apple agreement is missing or has expired」と表示されます。
原因は同じです。Appleが契約を更新したのに、誰も同意していません。Appleのロール一覧によると、契約に同意できるのはアカウント所有者(Account Holder)だけです。 EASのコードは、App Store ConnectのBusinessページから、さらにAppleに促された場合はdeveloper.apple.comのアカウントから同意するよう求めます。その後コマンドを再実行してください。有料アプリの契約については専用ガイドがあります:App Store ConnectのPaid Apps Agreement。
「App Store Connect rejected the API authentication credentials.」
Appleが401エラー NOT_AUTHORIZED を返しています。EASは原因を3つ挙げています。キーが無効になっている、別のApp Store Connectアカウントのキーである、Key ID・キーの中身・Issuer IDのいずれかが間違っている、のどれかです。
App Store ConnectのUsers and AccessメニューのIntegrationsタブで、2つのIDを確認してください。Appleによると、Issuer IDはページ上部に、Key IDは有効なキーの一覧に表示されます。無効化したキーは二度と有効にできません。 Appleは30日間Revokedの下に表示しますが、新しいキーを生成する必要があります。
「App Store Connect app for application identifier … was not found.」
ascAppId で指定したアプリページが、そのキーでは見つかりません。EASはこの番号と、キーが正しいアカウントでそのアプリにアクセスできるかを確認するよう求めます。そのキーで見えるアプリもいくつか表示してくれます。Appleの送信ツールでは、同じ問題が「No suitable application records were found」として表示されます。
よくある原因は3つで、うち2つはAppleフォーラムのこのスレッドでも挙がっています。
- アプリページが存在しない。 App Store Connectで作成するか、
ascAppIdを外してコマンドに作らせます。 - 番号が別のアカウントのもの。 別のチームや別プロジェクトの
ascAppIdをコピーしています。 - ユーザーにアプリへのアクセス権がない。 App ManagerやDeveloperは特定のアプリに制限されることがあります。一方、チームキーはアカウントのすべてのアプリにアクセスできます。
「… is not available to team」または「… is not available to provider」
このメッセージは、ascAppId がないためにEASがアプリページを代わりに作るときに出ます。バンドルIDがすでに別のチームに使われています。EASはアプリの設定でバンドルIDを変更してから再実行するよう求めます。
「App name "…" is already taken. Using generated name "…"」
これは失敗ではありません。App Storeで名前がすでに使われている場合、EASはランダムな6文字を付け足して最大5回まで再試行します。アプリページの名前は後でApp Store Connectで変更できます。避けたいなら、初回送信前にプロファイルに appName と language を設定しましょう。language がないと、プライマリ言語は en-US になります。
バイナリのエラー:ITMSコード
送信後、Appleがビルドを処理します。拒否された場合、ログに1つ以上のITMSコードが表示されます。EASの送信ステップが認識して説明してくれるコードは次のとおりです。
| ITMSコード | Appleが拒否する内容 | 修正 |
|---|---|---|
| 90189 | ビルド番号が使用済み | autoIncrement |
| 90062, 90186, 90478 | バージョンが締め切り済み、または追い越し済み | version を上げる |
| 90683 | 利用目的の説明文がない | ios.infoPlist |
| 90725 | iOS SDKが古すぎる | iOSイメージかExpo SDK |
| 90054, 90055 | 対象アプリページとバンドルが違う | ascAppId を修正 |
| 90022, 90023, 90391, 90713 | アイコンがない、または宣言が誤っている | アイコンを見直す |
| 90771 | バックグラウンドタスクのIDがない | ios.infoPlist |
これらのメッセージから分かる補足が3つあります。
- ビルド番号はバージョンごとに一意です。 90189の場合、EASは
eas.jsonに"autoIncrement": trueを設定するよう勧めています。詳しくはビルド番号とバージョンにまとめています。 - 90725の場合、EASは
eas.jsonでより新しいiOSイメージを選び、必要ならサポート対象のExpo SDKに上げるよう勧めています。 - 90771の場合、Info.plistでバックグラウンドモード
processingを宣言しているのに、BGTaskSchedulerPermittedIdentifiersキーがありません。
正しいアプリページか別のビルドを指定すれば済む90054と90055を除き、修正はバイナリに関わります。ビルドし直してから再送信してください。 2つのコードには専用ガイドがあります:ExpoでのITMS-90683とITMS-90725。
2026年9月末、Solysのビルドが配信時にITMS-90683で拒否されました。設定ファイルを整理したとき、写真の利用目的の説明文を削除していたのです。Solysは写真を使いませんが、プロジェクト内のライブラリがiOSの写真APIを呼び出しています。Appleが解析するのはバイナリで、実際の使用状況ではありません。 それ以来、この説明文は絶対に削除しないことにしています。
ちなみにMissing Complianceのステータスは送信エラーではありません。暗号化に関する申告が足りないだけで、EASでの公開ガイドで説明しています。
送信前の僕のチェックリスト
ascAppIdがsubmitプロファイルにあり、ビルド前に追加されている。- APIキーがEASで管理されているか、3つのフィールドがリポジトリ外に置いた
.p8を指している。 - Account HolderがApp Store Connectで最新の契約に同意している。
autoIncrementが有効で、EAS CLI 12以降Expoが推奨する"appVersionSource": "remote"も設定されている。versionが最後に承認されたバージョンより大きい。- バイナリに含まれる機密APIすべてに利用目的の説明文がある。
- 新規アプリなら、初回送信前に
appNameとlanguageを設定している。
つまずかずに最初のアプリを送信する
このコマンドは一つのステップにすぎません。iOS & Android Kitは、サブスクリプションも含めた僕のアプリのStarter Codeから始まり、App Storeまでの4ステップを自分のペースで進められます。
初めてのリリースを準備しているなら、無料の診断を受けてみてください。本当のボトルネックを教えてくれて、Appleのリジェクト対策チェックリストも届きます。アプリページ、スクリーンショット、審査については、App Storeにアプリを公開するのページで各ステップを解説しています。
よくある質問
なぜeas submitはCIでだけ失敗するのですか?
--non-interactive モードでは、コマンドは何も質問できません。プロファイルの ascAppId と、アプリにすでに紐づいたAPIキー、または eas.json にキーの3つのフィールドが必要です。自分のマシンなら、これらを質問してくれたはずです。
eas submitのエラー後にビルドし直す必要はありますか?
AppleがITMSコードでバイナリを拒否した場合だけです。例外として、ITMS-90054と90055はビルドが間違ったアプリページを指定していただけなので、正しいページに再送信すれば済みます。設定やアカウントのエラーは、eas.json、App Store Connect、Appleアカウントで直せます。その後、たとえば --latest や --id で同じビルドを再送信します。
EAS Submitの送信ログはどこで見られますか?
Expoのダッシュボードにある送信ページです。Expoはそこでログと「Build Annotations」の吹き出しを確認するよう勧めています。ターミナルでは --verbose を付けると常にログが表示されます。
無料のAppleアカウントでeas submitは使えますか?
使えません。ExpoはApp Storeへの送信に有料のApple Developerアカウントを必須としています。無料アカウントでは自分のiPhoneでテストはできますが、App Store Connectは使えません。
eas submit用のAPIキーにはどのロールを付ければいいですか?
ExpoのガイドではキーにAdminロールを付けています。Appleのロール一覧によると、ビルドの送信はApp ManagerとDeveloperのロールでも可能です。僕のExpoビルドはApp Managerロールのチームキーで動いています。チームキーを生成できるのはAccount HolderとAdminだけです。
EASの「Increment Build Number」とはどういう意味ですか?
AppleがITMS-90189でビルドを拒否したという意味です。そのバージョンにこのビルド番号がすでに存在します。eas.json で "autoIncrement": true を有効にするか、ios.buildNumber を上げてから、ビルドし直してください。

