# App Store Connectのビルド番号とバージョンの違い

> バージョンはユーザーに見える番号、ビルド番号は送信ごとの識別番号です。この組み合わせは一意である必要があり、ExpoならEASがビルド番号を自動で上げてくれます。

元のページ：[App Store Connectのビルド番号とバージョンの違い](https://devoria.fr/ja/blog/app-store-connect-build-number-version)
著者：[Mehdi Azizi](https://devoria.fr/ja/mehdi-azizi)
公開日：2026-11-04
内容の最終更新：2026-11-04


App Store Connectのビルド番号（build number）は、送信するビルドごとに付く番号で、キーは `CFBundleVersion` です。一方のバージョン `CFBundleShortVersionString` は、App Storeでユーザーが目にする番号です。**Appleは「バージョンとビルド番号の組み合わせ」が一意であることを求めています。同じバージョンでは、1つのビルド番号は1回しか使えません。**

Expoでは、バージョンは自分で決め、ビルド番号は本番ビルドのたびにEASに自動で上げてもらえます。このガイドでは2つの番号の違い、Appleのルール、ITMS-90062とITMS-90189のエラー、そしてビルドが表示されないときの確認ポイントを解説します。

僕はSolys、TradaZen、NoleraなどのiOSアプリをExpoとEASで公開しています。このあと紹介する設定は、これらのアプリの `eas.json` のものです。

## バージョンとビルド番号の違いは？

アプリを識別するInfo.plistのキーは2つあります。[CFBundleShortVersionStringに関するAppleのドキュメント](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring)では、ユーザーに見えるバージョンとして説明されています。10.14.1のように、ピリオドで区切った3つの整数です。[CFBundleVersionのドキュメント](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion)では、ビルドのバージョンとされています。1〜3個の整数で、使えるのは数字とピリオドだけです。

| 要素       | iOSのキー                  | 誰が見るか    | Expoのフィールド  |
| ---------- | -------------------------- | ------------- | ----------------- |
| バージョン | CFBundleShortVersionString | ユーザー      | `version`         |
| ビルド番号 | CFBundleVersion            | あなたとApple | `ios.buildNumber` |

架空の例です。バージョン1.4.0のテスト中にビルド12、13、14を送り、その中から1つを審査に出します。[App Store Connectのヘルプ](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds)の要約では、バージョンはビルドをそのページに紐づけ、ビルド番号はシステム全体でビルドを識別します。

## Appleの番号の上げ方のルール

1. **組み合わせは一意であること。** [Xcode Cloudのドキュメント](https://developer.apple.com/documentation/xcode/setting-the-next-build-number-for-xcode-cloud-builds)によると、App Store Connectはバージョンとビルド番号の一意な組み合わせを求めます。そのためiPhoneアプリなら、新しいバージョンで1から始め直せます。Macアプリはできません。番号は常に上がっていく必要があります。
2. **承認済みのバージョンは閉じられる。** Appleがバージョン1.4.0を承認したら、そこにビルドを追加することはもうできません。次はもっと大きい番号にする必要があります。
3. **各数字は整数として比較される。** 10は9より大きいので、1.10は1.9のあとになります。1.20が承認されたあとに1.9を送ると拒否されます。

僕のおすすめは、**ビルド番号を常に増え続ける整数にして、1に戻さないこと**です。iPhoneでは1に戻すことも許されていますが、アプリの生涯を通じて一意な番号にしておけば、TestFlightで2つのビルドを取り違えずに済みます。リモートモードにしている僕のアプリでも、カウンターはバージョンをまたいで続いています。

## ExpoとEASでバージョンとビルド番号を管理する

2026年9月25日に更新された[Expoのバージョンに関するページ](https://docs.expo.dev/build-reference/app-versions/)では、役割が分けられています。バージョン（app.jsonの `version`）はあなたが管理するもので、新しいリリースを準備するときに変更します。ビルド番号（`ios.buildNumber`）はEASに任せられます。Expoは、ビルド番号の上げ忘れを送信時のリジェクトのよくある原因として挙げています。

設定はすべてeas.jsonで行います。

```json
{
  "cli": {
    "appVersionSource": "remote"
  },
  "build": {
    "production": {
      "autoIncrement": true
    }
  }
}
```

- **`"remote"`**：EASのサーバーがビルド番号を管理します。EAS CLI 12以降の推奨動作です。カウンターは設定ファイルの値（なければ1）から始まり、その後 `ios.buildNumber` は無視されます。
- **`"local"`**：設定ファイルが正になります。`autoIncrement` を使うとEASがファイル内の `ios.buildNumber` を書き換えるので、ビルドのたびにその変更をコミットする必要があります。
- **`autoIncrement`**：[eas.jsonのリファレンス](https://docs.expo.dev/eas/json/)では、ビルド番号用に `true` または `"buildNumber"`、バージョンの最後の数字を上げる場合は `"version"` が使えます。リモートモードでは `"version"` に対応していないとExpoは明記しています。

僕の場合、TradaZenとNoleraは `remote` です。Solysは `local` のままで、ビルド番号はapp.jsonにあり、本番ビルドのたびにファイル内で上がります。**どちらでも動きますが、リモートモードならコミットし忘れのリスクがなくなります。**

あと2つコマンドを覚えておきましょう。`eas build:version:set` はリモートのカウンターを初期化します。Appleに最後に送った番号を入力してください。`eas build:version:sync` はリモートの値をプロジェクトにコピーします。いつかXcodeでビルドするときに便利です。EAS Updateを使う場合、リモートモードは `nativeVersion` ポリシーとは併用できません。Expoは `appVersion` を推奨しています。

## ITMS-90062：そのバージョンはすでに承認済み

メッセージはこんな感じです（番号は架空）。

```text
ERROR ITMS-90062: This bundle is invalid. The value for key
CFBundleShortVersionString [1.4.0] in the Info.plist file must
contain a higher version than that of the previously approved
version [1.4.0].
```

Appleはすでにバージョン1.4.0を承認しているので、もうビルドを追加できません。**app.jsonでバージョンを1.4.1などに上げてから、もう一度ビルドしてください。** ビルド番号を変えるだけでは足りません。

`version` を更新したのにエラーが出る場合は、`ios.version` フィールドがないか探してください。[Expoの設定リファレンス](https://docs.expo.dev/versions/latest/config/app/)によると、iOSではこちらが `version` より優先されます。よく似たエラーITMS-90186「Invalid Pre-Release Train」も、新しいビルドを受け付けないバージョンを示すもので、対処法は同じです。

## ITMS-90189：Redundant Binary Upload

こちらはビルド番号が原因です。

```text
ERROR ITMS-90189: Redundant Binary Upload. You've already uploaded
a build with build number '12' for version number '1.4.0'.
```

1.4.0 (12) という組み合わせがすでにApple側に存在しています。Expoでよくある原因は4つです。

- **使ったプロファイルに `autoIncrement` がない。** NoleraのようにTestFlight用の別プロファイルを作った場合は、そこにもオプションを入れ直してください。
- **リモートのカウンターが遅れている。** 手動で送信したあとに `remote` に切り替えた場合です。Appleが把握している最後の番号で `eas build:version:set` を実行しましょう。
- **ローカルモードでコミットを忘れた。** 次のビルドが古い番号から始まってしまいます。
- **同じバイナリを再送している。** `eas submit` では、古いビルドではなく新しいビルドを選んでください。

**直し方はいつも同じです。番号を上げて新しくビルドすることです。**

## 「No builds available」：ビルドが表示されない

ビルドは送ったのに、ページで選択肢に出てこない。そんなときは次の順で確認してください。

1. **まだ処理中。** Appleは各ビルドを処理してから表示し、完了時にメールを送ってきます。[Expo](https://docs.expo.dev/submit/ios/)によると通常10〜15分です。[Appleによれば](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata)、24時間を超えて処理中のままなら、Feedback Assistantでチケットを開く必要があります。
2. **暗号化の申告待ち。** Missing Complianceというステータスです。詳しくは後述します。
3. **バージョンが一致していない。** 1.4.1のビルドは、App Store Connectで1.5.0として準備したページには入りません。両者を揃えてください。
4. **その間に別のバージョンがリリースされた。** [ビルドの選択に関するヘルプ](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit)によると、その場合リストにはそのリリース以降に送ったビルドしか表示されません。
5. **テスターから見えていないだけ。** TestFlightアプリで「no builds available」と出るのは、多くの場合ビルドがどのグループにも入っていないか、ベータ審査待ちか、期限切れのいずれかです。詳しくは[iPhoneアプリをTestFlightでテストする](https://devoria.fr/ja/blog/testflight-iphone-app-beta-testing)を見てください。

### 知っておきたいステータス

ビルドが表示されない理由として特に多いステータスを、[Appleの一覧](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses)をもとにまとめました。ProcessingとFailedはその一覧には載っていません。これらは[ビルドの確認](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata)で説明されている送信ステータスです。

| ステータス         | 意味                       | 対処                       |
| ------------------ | -------------------------- | -------------------------- |
| Processing         | Appleがビルドを処理中      | メールを待つ               |
| Failed             | 処理中にエラー             | エラーを読んで再送         |
| Missing Compliance | 暗号化が未申告             | 回答するかInfo.plistに記載 |
| Invalid Binary     | 送信内容が要件を満たさない | 修正して新しくビルド       |
| Expired            | 90日を過ぎた               | 新しくビルド               |
| Ready to Submit    | テストや審査の準備完了     | グループに追加する         |

### 暗号化の申告を一度で済ませる

`ITSAppUsesNonExemptEncryption` キーがないと、[Apple](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption)は新しいバージョンのたびにコンプライアンスの質問をしてきます。Expoでは、フィールド名は `ios.config.usesNonExemptEncryption` です。

```json
{
  "expo": {
    "ios": {
      "config": {
        "usesNonExemptEncryption": false
      }
    }
  }
}
```

`false` は「暗号化を使っていない、または免除対象の暗号化のみ」という意味です。[Appleの説明](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations)では、HTTPS接続のようなシステム組み込みの暗号化は一般に免除対象で、この回答は使っているライブラリにも及びます。僕の3つのアプリはどれも `false` を申告しています。**`false` にするのは、あなたのアプリで本当にそうである場合だけにしてください。申告には責任が伴います。**

## 送信済みビルドの番号は変更できる？

できません。番号は署名済みのバイナリに書き込まれているので、直すには新しくビルドする必要があります。

変えられるのは、バージョンに紐づけるビルドです。1つのバージョンに付けられるビルドは1つだけですが、審査に出すまでは[何度でも差し替えられます](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit)。

1. App Store Connectでバージョンを開き、Buildセクションに進みます。
2. 現在のビルドにカーソルを合わせ、削除ボタン（マイナス記号）をクリックします。
3. 追加ボタン（プラス記号）をクリックし、正しいビルドを選んで保存します。

バージョンからビルドを外しても、アカウントから削除されるわけではありません。バージョンがすでに審査中なら、[先に審査から提出を取り下げてください](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/remove-a-submission-from-review)。審査は最初からやり直しになります。

## 次の送信の前に

ビルド番号は、送信時のチェックの1つにすぎません。ビルドイメージによっては[ITMS-90725](https://devoria.fr/ja/blog/itms-90725-sdk-version-issue-expo)が出ることがありますし、署名にも特有の落とし穴があります。これは[iOS開発者証明書とプロビジョニングプロファイル](https://devoria.fr/ja/blog/ios-certificate-provisioning-profile-expo)で詳しく説明しています。ビルドからTestFlightまでの全体の流れは[MacなしでiOSアプリを公開する](https://devoria.fr/ja/blog/publish-ios-app-without-mac-expo-eas)に、審査期間は[App Storeの審査期間](https://devoria.fr/ja/blog/app-store-review-time)にまとめています。すべてのステップは[App Storeにアプリを公開する](https://devoria.fr/ja/expertise/publish-app-on-app-store)のページで確認できます。

初めてのリリースを準備しているなら、[無料診断を受けてみてください](https://devoria.fr/ja/diagnostic)。プロジェクトで何が詰まっているかを教えてくれて、Appleのリジェクトを防ぐ僕のチェックリストも届きます。アプリを作り、サブスクリプションを組み込み、公開するところまでは、[iOS & Android Kit](https://devoria.fr/ja/kits/ios)が僕のアプリのスターターコード付きで4ステップの流れに沿って、自分のペースで進められるようにしています。

## よくある質問

### App Store Connectのバージョンとビルド番号の違いは？

バージョンは1.4.0のような、リリースの公開番号です。ビルド番号は、そのバージョン向けにAppleへ送った特定のバイナリを識別します。1つのバージョンに複数のビルドを送ることができ、それぞれに番号が付きます。

### 送信のたびにビルド番号を変える必要がありますか？

はい、同じバージョンであれば必要です。Appleは同じバージョンとビルド番号の組み合わせでの2回目の送信を拒否します。これがITMS-90189エラーです。EASなら、本番ビルドのたびに `autoIncrement` が自動でやってくれます。

### ビルド番号はバージョンごとに1に戻すべきですか？

必須ではありません。iPhoneでは組み合わせが一意であればよいので、新しいバージョンなら低い番号も受け付けられます。ただ、常に増え続けるカウンターのほうが追いやすいです。

### App Store Connectでビルド番号を変更するには？

送信済みビルドの番号は変更できません。ただし、審査に出していない間は、ページのBuildセクションからバージョンに紐づくビルドを差し替えられます。新しい番号にしたいなら、ビルドし直してください。

### App Store Connectにビルドが表示されないのはなぜですか？

多くの場合、まだ処理中か、暗号化の申告待ちです。ビルドのバージョンがページのバージョンと一致しているかも確認してください。24時間を超えて処理中なら、Appleはチケットを開くよう求めています。


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

[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ステップのロードマップ、あなたに合ったキットがわかります。
