# Build number v App Store Connect: verze a číslo buildu

> Verzi vidí tvoji zákazníci, build number označuje každé nahrání. Jejich dvojice musí být unikátní. S Expem ti EAS číslo buildu zvýší samo.

Původní stránka: [Build number v App Store Connect: verze a číslo buildu](https://devoria.fr/cs/blog/app-store-connect-build-number-verze-cislo-buildu)
Autor: [Mehdi Azizi](https://devoria.fr/cs/mehdi-azizi)
Publikováno: 2026-11-04
Poslední revize obsahu: 2026-11-04


Build number v App Store Connect je číslo buildu: klíč `CFBundleVersion`, který označuje každé nahrání. Verze, `CFBundleShortVersionString`, je číslo, které tvoji zákazníci vidí v App Storu. **Apple vyžaduje, aby dvojice verze a čísla buildu byla unikátní: jedno číslo buildu můžeš pro stejnou verzi použít jen jednou.**

S Expem si verzi nastavuješ sám a EAS může číslo buildu zvýšit u každého produkčního buildu. Tenhle návod vysvětluje obě čísla, pravidla Applu, chyby ITMS-90062 a ITMS-90189 a co zkontrolovat, když se ti build neobjeví.

Svoje iOS appky vydávám přes Expo a EAS, mimo jiné Solys, TradaZen a Nolera. Nastavení, která uvidíš níže, jsou z jejich souborů `eas.json`.

## Verze a číslo buildu: jaký je rozdíl?

Tvoji appku identifikují dva klíče v Info.plist. [Dokumentace Applu k CFBundleShortVersionString](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleshortversionstring) ji popisuje jako verzi viditelnou pro uživatele: tři celá čísla oddělená tečkami, třeba 10.14.1. [Ta k CFBundleVersion](https://developer.apple.com/documentation/bundleresources/information-property-list/cfbundleversion) mluví o verzi buildu: jedno až tři celá čísla, jen číslice a tečky.

| Položka      | Klíč v iOS                 | Kdo ji vidí     | Pole v Expu       |
| ------------ | -------------------------- | --------------- | ----------------- |
| Verze        | CFBundleShortVersionString | Tvoji zákazníci | `version`         |
| Číslo buildu | CFBundleVersion            | Ty a Apple      | `ios.buildNumber` |

Smyšlený příklad: pro verzi 1.4.0 během testování nahraješ buildy 12, 13 a 14 a pak jeden z nich vybereš pro review. [Nápověda App Store Connect](https://developer.apple.com/help/app-store-connect/manage-builds/upload-builds) to shrnuje takhle: verze build přiřazuje k jeho záznamu, číslo buildu ho identifikuje všude v systému.

## Pravidla Applu pro zvyšování čísel

1. **Dvojice musí být unikátní.** Podle [dokumentace Xcode Cloud](https://developer.apple.com/documentation/xcode/setting-the-next-build-number-for-xcode-cloud-builds) App Store Connect vyžaduje unikátní kombinaci verze a čísla buildu. Appka pro iPhone tedy může u nové verze začít znovu od 1. Appka pro Mac ne: její číslo musí pořád růst.
2. **Schválená verze je uzavřená.** Jakmile Apple schválí verzi 1.4.0, už k ní nemůžeš přidat build. Další musí mít vyšší číslo.
3. **Každé číslo se porovnává jako celé číslo.** 1.10 je až po 1.9, protože 10 je víc než 9. Verze 1.9 nahraná po schválené 1.20 bude zamítnuta.

Moje rada: **drž si celočíselné číslo buildu, které pořád roste, a nevracej ho na 1.** Začít znovu od 1 je na iPhonu povolené, ale unikátní číslo po celý život appky ti ušetří zmatek se dvěma buildy v TestFlightu. Přesně to vidím u svých appek ve vzdáleném režimu: počítadlo pokračuje z verze na verzi.

## Verze a build s Expem a EAS

[Stránka Expa o verzích](https://docs.expo.dev/build-reference/app-versions/), aktualizovaná 25. září 2026, role odděluje. Verze (`version` v app.json) zůstává na tobě: měníš ji, když chystáš nové vydání. Číslo buildu (`ios.buildNumber`) můžeš svěřit EAS. Expo mimochodem uvádí, že zapomenuté zvýšení je častý důvod odmítnutí při nahrávání.

Všechno se nastavuje v eas.json:

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

- **`"remote"`**: číslo buildu drží servery EAS. Od EAS CLI 12 je to doporučené chování. Počítadlo začne od hodnoty z tvé konfigurace, nebo od 1, a pak se `ios.buildNumber` ignoruje.
- **`"local"`**: rozhoduje tvoje konfigurace. S `autoIncrement` EAS upraví `ios.buildNumber` v tvém souboru a tu změnu musíš při každém buildu commitnout.
- **`autoIncrement`**: [reference eas.json](https://docs.expo.dev/eas/json/) přijímá `true` nebo `"buildNumber"` pro build a `"version"` pro zvýšení poslední číslice verze. Expo upozorňuje, že ve vzdáleném režimu `"version"` podporované není.

U mě jsou TradaZen a Nolera v `remote`. Solys zůstala v `local`: její číslo buildu žije v app.json a každý produkční build ho v souboru zvýší. **Fungují oba režimy, ale vzdálený odstraňuje riziko zapomenutého commitu.**

Celé to doplňují dva příkazy. `eas build:version:set` inicializuje vzdálené počítadlo: zadej poslední číslo, které jsi poslal Applu. `eas build:version:sync` zkopíruje vzdálené hodnoty do tvého projektu, což se hodí, pokud někdy budeš kompilovat v Xcode. S EAS Update vzdálený režim nefunguje s politikou `nativeVersion`: Expo doporučuje `appVersion`.

## ITMS-90062: verze už je schválená

Zpráva vypadá zhruba takhle (smyšlená čísla):

```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 už verzi 1.4.0 schválil: build k ní přidat nemůžeš. **Zvyš verzi v app.json, třeba na 1.4.1, a spusť build znovu.** Změnit jen číslo buildu nestačí.

Pokud se chyba vrací, i když je `version` aktuální, hledej pole `ios.version`. Podle [reference konfigurace Expa](https://docs.expo.dev/versions/latest/config/app/) má pro iOS přednost před `version`. Stejné řešení platí pro příbuznou chybu ITMS-90186, „Invalid Pre-Release Train“, která hlásí verzi uzavřenou pro nové buildy.

## ITMS-90189: Redundant Binary Upload

Tady se zasekne číslo buildu:

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

Dvojice 1.4.0 (12) už u Applu existuje. S Expem se opakují čtyři příčiny:

- **Použitý profil nemá `autoIncrement`.** Pokud si vytvoříš samostatný profil pro TestFlight, jako ten u Nolery, přidej do něj tu volbu znovu.
- **Vzdálené počítadlo je pozadu.** Na `remote` jsi přešel po ručních nahráních: spusť `eas build:version:set` s posledním číslem, které Apple zná.
- **V lokálním režimu jsi zapomněl commit.** Další build pak začne ze starého čísla.
- **Posíláš znovu stejnou binárku.** U `eas submit` vyber nový build, ne ten starý.

**Oprava je vždycky stejná: nový build s vyšším číslem.**

## „No builds available“: tvůj build se neobjevuje

Build odešel, ale tvůj záznam ho nenabízí. Zkontroluj v tomhle pořadí.

1. **Pořád se zpracovává.** Apple každý build před zobrazením zpracuje a na konci ti pošle e-mail. [Expo](https://docs.expo.dev/submit/ios/) obvykle mluví o 10 až 15 minutách. [Podle Applu](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata) je potřeba po víc než 24 hodinách zpracování otevřít ticket ve Feedback Assistantu.
2. **Čeká na tvoje prohlášení o šifrování.** To je stav Missing Compliance, popsaný níž.
3. **Verze nesedí.** Build ve verzi 1.4.1 se nezařadí pod záznam připravený pro 1.5.0 v App Store Connect. Sjednoť je.
4. **Mezitím vyšla nějaká verze.** Podle [nápovědy k výběru buildu](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit) seznam pak ukazuje jen buildy nahrané od tohoto vydání.
5. **Nevidí ho tester.** V appce TestFlight „no builds available“ často znamená, že build není v žádné skupině, čeká na beta review nebo vypršel. Podrobnosti najdeš v článku [TestFlight pro testování tvé appky pro iPhone](https://devoria.fr/cs/blog/testflight-testovani-iphone-aplikace).

### Stavy, které je dobré znát

Stavy, které nejčastěji vysvětlují chybějící build, podle [seznamu Applu](https://developer.apple.com/help/app-store-connect/reference/app-build-statuses). Processing a Failed v něm nejsou: jsou to stavy nahrávání popsané v [přehledu buildů](https://developer.apple.com/help/app-store-connect/manage-builds/view-builds-and-metadata).

| Stav               | Co znamená                    | Tvoje oprava                |
| ------------------ | ----------------------------- | --------------------------- |
| Processing         | Apple build zpracovává        | Počkat na e-mail            |
| Failed             | Chyba při zpracování          | Přečíst chybu, poslat znovu |
| Missing Compliance | Šifrování nebylo deklarováno  | Odpovědět nebo Info.plist   |
| Invalid Binary     | Nahrání nesplňuje pravidla    | Opravit, nový build         |
| Expired            | Překročeno 90 dní             | Nový build                  |
| Ready to Submit    | Připraven na test nebo review | Přidat do skupiny           |

### Deklaruj šifrování jednou provždy

Bez klíče `ITSAppUsesNonExemptEncryption` se tě [Apple](https://developer.apple.com/documentation/bundleresources/information-property-list/itsappusesnonexemptencryption) na otázky ohledně souladu ptá u každé nové verze. V Expu se pole jmenuje `ios.config.usesNonExemptEncryption`:

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

`false` znamená: žádné šifrování, nebo jen šifrování s výjimkou. [Apple upřesňuje](https://developer.apple.com/documentation/security/complying-with-encryption-export-regulations), že šifrování zabudované v systému, jako připojení přes HTTPS, má obvykle výjimku a že odpověď se týká i tvých knihoven. Všechny tři moje appky deklarují `false`. **`false` nastav jen tehdy, když to pro tvoji appku platí: za prohlášení odpovídáš.**

## Dá se změnit číslo už nahraného buildu?

Ne. Číslo je zapsané v podepsané binárce: pro opravu potřebuješ nový build.

Změnit můžeš build přiřazený k tvé verzi. Apple povoluje jen jeden build na verzi, ale [můžeš ho vyměnit, kolikrát chceš](https://developer.apple.com/help/app-store-connect/manage-builds/choose-a-build-to-submit), dokud ho nepošleš na review:

1. Otevři verzi v App Store Connect, sekce Build.
2. Najeď myší na aktuální build a klikni na tlačítko odebrání, znaménko minus.
3. Klikni na tlačítko přidání, znaménko plus, vyber správný build a ulož.

Odebráním buildu z verze ho ze svého účtu nesmažeš. Pokud už verze je v review, [nejdřív stáhni odeslání](https://developer.apple.com/help/app-store-connect/manage-submissions-to-app-review/remove-a-submission-from-review): review pak začne od nuly.

## Před dalším nahráním

Číslo buildu je jen jedna z kontrol při nahrávání. Image buildu může vyvolat [ITMS-90725](https://devoria.fr/cs/blog/itms-90725-sdk-version-issue-expo) a podepisování má vlastní pasti, popsané v článku [vývojářský certifikát iOS a provisioning profile](https://devoria.fr/cs/blog/ios-certifikat-vyvojare-provisioning-profile-expo). Celý řetězec od buildu po TestFlight najdeš v článku [vydání iOS appky bez Macu](https://devoria.fr/cs/blog/publikace-ios-aplikace-bez-macu-expo-eas) a doby review v článku [jak dlouho trvá schválení v App Storu](https://devoria.fr/cs/blog/jak-dlouho-trva-schvaleni-aplikace-app-store). Všechny kroky jsou pohromadě na stránce [jak vydat aplikaci v App Storu](https://devoria.fr/cs/expertise/jak-vydat-aplikaci-v-app-store).

Pokud chystáš své první vydání, [udělej si bezplatnou diagnostiku](https://devoria.fr/cs/diagnostic): řekne ti, co v projektu blokuje, a pošle ti můj checklist proti zamítnutí od Applu. Na stavbu appky, napojení předplatného a vydání tě [iOS & Android Kit](https://devoria.fr/cs/kits/ios) provede ve čtyřech krocích se Starter Code mých appek, vlastním tempem.

## Časté dotazy

### Jaký je rozdíl mezi verzí a build number v App Store Connect?

Verze je veřejné číslo tvého vydání, třeba 1.4.0. Build number identifikuje konkrétní binárku nahranou do Applu pro tuhle verzi. Pro jednu verzi můžeš nahrát víc buildů, každý s vlastním číslem.

### Musím číslo buildu měnit při každém nahrání?

Ano, u stejné verze. Apple odmítne druhé nahrání se stejnou dvojicí verze a čísla buildu, to je chyba ITMS-90189. S EAS to u každého produkčního buildu vyřeší `autoIncrement`.

### Má číslo buildu u každé verze začínat znovu od 1?

Není to povinné. Na iPhonu Apple u nové verze přijme i nižší číslo, protože unikátní musí být jen dvojice. Počítadlo, které pořád roste, se ale sleduje snáz.

### Jak změnit build number v App Store Connect?

Číslo už nahraného buildu změnit nemůžeš. Můžeš ale vyměnit build přiřazený k tvé verzi v sekci Build záznamu, dokud není v review. Pro nové číslo udělej nový build.

### Proč se můj build v App Store Connect neobjevuje?

Nejčastěji se ještě zpracovává nebo čeká na tvoje prohlášení o šifrování. Zkontroluj taky, že jeho verze odpovídá verzi tvého záznamu. Po víc než 24 hodinách zpracování Apple žádá otevřít ticket.


## Tvůj projekt

[Review Kit](https://devoria.fr/cs/kits/app-review): Můj checklist pro review v App Store, moje opravená zamítnutí od Applu, checklist pro Google Play a tři skilly pro Claude Code. 1 199 Kč.

[iOS & Android Kit](https://devoria.fr/cs/kits/ios): Vytvoř si aplikaci pro iPhone a Android s Claude Code: startovní kód mých aplikací, cesta až do obchodů a všechny kity. 2 399 Kč.

[Diagnostika: co tě dělí od tvé iPhone aplikace](https://devoria.fr/cs/diagnostic): 7 otázek, 60 sekund: zjistíš, co ti doopravdy brání vydat iPhone aplikaci, dostaneš cestu ve 4 krocích a kit přesně pro tebe.
