# eas submit iOSのエラー原因と対処法

> eas submitの失敗は、EAS設定、Appleアカウント、ITMSコードによるバイナリ拒否の3種類です。原因と直し方をまとめます。

元のページ：[eas submit iOSのエラー原因と対処法](https://devoria.fr/ja/blog/eas-submit-ios-errors-fixes)
著者：[Mehdi Azizi](https://devoria.fr/ja/mehdi-azizi)
公開日：2026-11-04
内容の最終更新：2026-11-04


`eas submit --platform ios` が失敗したとき、どこを見ればいいかはほぼ必ずメッセージに書かれています。**原因はEASの設定が不完全か、Appleアカウント側で止まっているか、Appleがバイナリを拒否したかのどれかです。** 最初の2つは新しいビルドなしで数分で直せます。3つ目はITMSコードで見分けられ、ほぼ必ず新しいビルドが必要になります。

僕はSolys、TradaZen、NoleraなどのiOSアプリをExpoとEASで公開しています。ここで引用するメッセージは、[Expo公式のGitHubリポジトリ](https://github.com/expo/eas-cli)にあるEAS CLIのソースコードからコピーしたもので、2026年11月3日に再確認しています。Expoの旧フォーラムは現在Discordに誘導されているので、コードが一番確実な情報源です。`eas.json` ファイルから審査提出までの全体の流れは、先に[EAS Submit iOS：ExpoアプリをApp Storeに公開する](https://devoria.fr/ja/blog/eas-submit-ios-app-store)を読んでください。この記事では修理に専念します。

## eas submitがやること、必要なもの

[Expoのドキュメント](https://docs.expo.dev/deploy/submit-to-app-stores/)によると、このコマンドは `.ipa` ファイルをApp Store Connectに送信します。Appleの処理が終わるとビルドがTestFlightに表示されます。通常10〜15分ほどです。**ただし、アプリを審査に提出するわけではありません。** その操作はApp Store Connectで行う必要があります。

[iOS送信に関するExpoのページ](https://docs.expo.dev/submit/ios/)には、前提条件が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）](https://devoria.fr/ja/blog/app-store-connect-api-key-p8)で詳しく解説しています。

最小構成のプロファイルは数行で済みます。値はダミーです。

```json
{
  "submit": {
    "production": {
      "ios": {
        "ascAppId": "1234567890"
      }
    }
  }
}
```

EASがすでにAPIキーを保持していれば、このプロファイルだけで十分です。僕のアプリの大半はこの状態です。

## メッセージを読む：3種類のエラー

修正方法を探す前に、コマンドがどの時点で止まったかを確認しましょう。この表は、失敗するたびに僕が使っている判断基準です。

| 失敗のタイミング                    | 種類            | 新しいビルドは必要？ |
| ----------------------------------- | --------------- | -------------------- |
| 送信前                              | EASの設定       | 不要                 |
| Appleへの接続、アプリページの作成時 | Appleアカウント | 不要                 |
| 送信後、ITMS-90xxxコード            | バイナリ拒否    | ほぼ必ず必要         |

詳細はExpoのダッシュボードにある送信ページで確認できます。[Expoは](https://docs.expo.dev/deploy/submit-to-app-stores/)そこでログを読み、よくある失敗原因を示す「Build Annotations」の吹き出しを確認するよう勧めています。ターミナルでは、[EAS CLIのリファレンス](https://docs.expo.dev/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のコード](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts)は停止します。質問もできず、代わりにアプリページを作ることもできないからです。

**修正：アプリページの番号を `ascAppId` にコピーします。** [Expoが場所を説明しています](https://github.com/expo/fyi/blob/main/asc-app-id.md)。App Store Connectでアプリを開き、App Informationへ進みます。General Informationの下にあるApple IDの欄で、10桁ほどの数字です。AppleのメールアドレスでもバンドルIDでもありません。

Noleraでは、`ascAppId` がないとコマンドがApple Developerのセッションを要求してきました。このセッションは期限切れになります。番号を `eas.json` に入れてからは、送信時に何も聞かれなくなりました。

> `ascAppId` はビルドの後ではなく前に追加してください。SDK 57までは、[Expoが計算するフィンガープリント](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts)に必ず `eas.json` が含まれます。ランタイムバージョンが `fingerprint` ポリシーに従うVigieでは、ビルド後にこの番号を追加したことでフィンガープリントが変わりました。その後に公開したアップデートは、インストール済みのビルドには届かなかったはずです。SDK 58以降は、[Expoの変更履歴](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/CHANGELOG.md)によると、フィンガープリントのデフォルトプリセット `balanced` は `eas.json` を無視します。

### 「App Store Connect API Keys cannot be set up in --non-interactive mode.」

プロファイルにキーがなく、EASにもアプリに紐づいたキーがない状態です。[Expoの説明](https://docs.expo.dev/submit/ios/)のとおり、非対話モードではキーを尋ねられないので、このメッセージで失敗します。

修正方法は2つあります。

- **EASにキーを作成・保管させる。** 自分のマシンで一度だけ対話モードで `eas credentials --platform ios` を実行し、アプリ用のApp Store Connect APIキーを設定させます。
- **自分のキーを用意する。** `ascApiKeyPath`、`ascApiKeyIssuerId`、`ascApiKeyId` に設定します。[eas.jsonのリファレンス](https://docs.expo.dev/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](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts)は送信前にこの形式をチェックします。

[Appleのヘルプ](https://support.apple.com/en-us/102654)によると、App用パスワードは2ファクタ認証を有効にした状態で、account.apple.comのApp-Specific Passwordsから生成します。Appleアカウントのパスワードを変更すると、すぐに無効になります。**Expoはこの方法を、デフォルトかつ推奨の方法である[APIキーより安全性が低い](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md)としています。**

## 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のロール一覧](https://developer.apple.com/help/account/access/roles/)によると、**契約に同意できるのはアカウント所有者（Account Holder）だけです。** [EASのコード](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts)は、App Store ConnectのBusinessページから、さらにAppleに促された場合はdeveloper.apple.comのアカウントから同意するよう求めます。その後コマンドを再実行してください。有料アプリの契約については専用ガイドがあります：[App Store ConnectのPaid Apps Agreement](https://devoria.fr/ja/blog/paid-apps-agreement-status-w-8ben-first-payment)。

### 「App Store Connect rejected the API authentication credentials.」

Appleが401エラー `NOT_AUTHORIZED` を返しています。[EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts)は原因を3つ挙げています。キーが無効になっている、別のApp Store Connectアカウントのキーである、Key ID・キーの中身・Issuer IDのいずれかが間違っている、のどれかです。

App Store ConnectのUsers and AccessメニューのIntegrationsタブで、2つのIDを確認してください。[Apple](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests)によると、Issuer IDはページ上部に、Key IDは有効なキーの一覧に表示されます。**無効化したキーは二度と有効にできません。** [Appleは](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys)30日間Revokedの下に表示しますが、新しいキーを生成する必要があります。

### 「App Store Connect app for application identifier … was not found.」

`ascAppId` で指定したアプリページが、そのキーでは見つかりません。[EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts)はこの番号と、キーが正しいアカウントでそのアプリにアクセスできるかを確認するよう求めます。そのキーで見えるアプリもいくつか表示してくれます。Appleの送信ツールでは、同じ問題が「No suitable application records were found」として表示されます。

よくある原因は3つで、うち2つは[Appleフォーラムのこのスレッド](https://developer.apple.com/forums/thread/106806)でも挙がっています。

- **アプリページが存在しない。** App Store Connectで作成するか、`ascAppId` を外してコマンドに作らせます。
- **番号が別のアカウントのもの。** 別のチームや別プロジェクトの `ascAppId` をコピーしています。
- **ユーザーにアプリへのアクセス権がない。** App ManagerやDeveloperは特定のアプリに制限されることがあります。一方、チームキーはアカウントの[すべてのアプリにアクセスできます](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api)。

### 「… is not available to team」または「… is not available to provider」

このメッセージは、`ascAppId` がないためにEASがアプリページを代わりに作るときに出ます。バンドルIDがすでに別のチームに使われています。[EASは](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts)アプリの設定でバンドルIDを変更してから再実行するよう求めます。

### 「App name "…" is already taken. Using generated name "…"」

これは失敗ではありません。App Storeで名前がすでに使われている場合、EASはランダムな6文字を付け足して最大5回まで再試行します。アプリページの名前は後でApp Store Connectで変更できます。避けたいなら、初回送信前にプロファイルに `appName` と `language` を設定しましょう。`language` がないと、[プライマリ言語は `en-US` になります](https://docs.expo.dev/eas/json/)。

## バイナリのエラー：ITMSコード

送信後、Appleがビルドを処理します。拒否された場合、ログに1つ以上のITMSコードが表示されます。[EASの送信ステップ](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts)が認識して説明してくれるコードは次のとおりです。

| 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` を設定するよう勧めています。詳しくは[ビルド番号とバージョン](https://devoria.fr/ja/blog/app-store-connect-build-number-version)にまとめています。
- **90725の場合**、EASは `eas.json` でより新しいiOSイメージを選び、必要ならサポート対象のExpo SDKに上げるよう勧めています。
- **90771の場合**、Info.plistでバックグラウンドモード `processing` を宣言しているのに、`BGTaskSchedulerPermittedIdentifiers` キーがありません。

正しいアプリページか別のビルドを指定すれば済む90054と90055を除き、**修正はバイナリに関わります。ビルドし直してから再送信してください。** 2つのコードには専用ガイドがあります：[ExpoでのITMS-90683](https://devoria.fr/ja/blog/itms-90683-missing-purpose-string-expo)と[ITMS-90725](https://devoria.fr/ja/blog/itms-90725-sdk-version-issue-expo)。

2026年9月末、Solysのビルドが配信時にITMS-90683で拒否されました。設定ファイルを整理したとき、写真の利用目的の説明文を削除していたのです。Solysは写真を使いませんが、プロジェクト内のライブラリがiOSの写真APIを呼び出しています。**Appleが解析するのはバイナリで、実際の使用状況ではありません。** それ以来、この説明文は絶対に削除しないことにしています。

ちなみにMissing Complianceのステータスは送信エラーではありません。暗号化に関する申告が足りないだけで、[EASでの公開ガイド](https://devoria.fr/ja/blog/eas-submit-ios-app-store)で説明しています。

## 送信前の僕のチェックリスト

- `ascAppId` が `submit` プロファイルにあり、ビルド前に追加されている。
- APIキーがEASで管理されているか、3つのフィールドがリポジトリ外に置いた `.p8` を指している。
- Account HolderがApp Store Connectで最新の契約に同意している。
- `autoIncrement` が有効で、EAS CLI 12以降[Expoが推奨する](https://docs.expo.dev/build-reference/app-versions/) `"appVersionSource": "remote"` も設定されている。
- `version` が最後に承認されたバージョンより大きい。
- バイナリに含まれる機密APIすべてに利用目的の説明文がある。
- 新規アプリなら、初回送信前に `appName` と `language` を設定している。

## つまずかずに最初のアプリを送信する

このコマンドは一つのステップにすぎません。[iOS & Android Kit](https://devoria.fr/ja/kits/ios)は、サブスクリプションも含めた僕のアプリのStarter Codeから始まり、App Storeまでの4ステップを自分のペースで進められます。

初めてのリリースを準備しているなら、[無料の診断を受けてみてください](https://devoria.fr/ja/diagnostic)。本当のボトルネックを教えてくれて、Appleのリジェクト対策チェックリストも届きます。アプリページ、スクリーンショット、審査については、[App Storeにアプリを公開する](https://devoria.fr/ja/expertise/publish-app-on-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` を上げてから、ビルドし直してください。


## あなたのプロジェクト

[Review Kit](https://devoria.fr/ja/kits/app-review)：私のApp Store審査チェックリスト、修正済みのAppleのリジェクト事例、Google Play用チェックリスト、Claude Codeのスキル3つ。￥8,500。

[iOS & Android Kit](https://devoria.fr/ja/kits/ios)：Claude CodeでiPhoneとAndroidのアプリを作りましょう。私のアプリのスターターコード、ストア公開までの手順、すべてのキットが揃っています。￥17,500。

[診断：あなたとiPhoneアプリの間にあるもの](https://devoria.fr/ja/diagnostic)：7つの質問、60秒。iPhoneアプリの公開を本当に妨げているもの、4ステップのロードマップ、あなたに合ったキットがわかります。
