# eas submit iOS: časté chyby a jak je opravit

> eas submit selhává? Skutečné hlášky EAS a App Store Connect, jejich příčina a oprava: ascAppId, API klíč, smlouva Apple, kódy ITMS.

Původní stránka: [eas submit iOS: časté chyby a jak je opravit](https://devoria.fr/cs/blog/eas-submit-ios-caste-chyby-oprava)
Autor: [Mehdi Azizi](https://devoria.fr/cs/mehdi-azizi)
Publikováno: 2026-11-04
Poslední revize obsahu: 2026-11-04


Když `eas submit --platform ios` selže, hláška skoro vždycky napoví, kam se podívat. **Buď je tvoje konfigurace EAS neúplná, nebo blokuje tvůj účet Apple, nebo Apple odmítá binárku.** První dva případy opravíš za pár minut, bez nového buildu. Třetí poznáš podle kódu ITMS a skoro vždycky vyžaduje nový build.

Své iOS aplikace, mimo jiné Solys, TradaZen a Nolera, publikuju s Expo a EAS. Hlášky, které tu cituju, jsou zkopírované ze zdrojového kódu EAS CLI v [oficiálním repozitáři Expo na GitHubu](https://github.com/expo/eas-cli), znovu zkontrolovaném 3. listopadu 2026. Staré fórum Expo teď přesměrovává na Discord: kód zůstává nejspolehlivějším zdrojem. Celý postup, od souboru `eas.json` až po odeslání ke kontrole, najdeš v článku [EAS Submit iOS: publikace aplikace Expo na App Store](https://devoria.fr/cs/blog/eas-submit-ios-publikovat-expo-app-app-store). Tady opravujeme.

## Co eas submit dělá a co k tomu potřebuje

Podle [dokumentace Expo](https://docs.expo.dev/deploy/submit-to-app-stores/) příkaz odešle tvůj soubor `.ipa` do App Store Connect. Build se objeví v TestFlightu poté, co ho Apple zpracuje, obvykle za 10 až 15 minut. **Neodesílá ale tvou aplikaci ke kontrole**: tenhle krok musíš udělat v App Store Connect.

[Stránka Expo o odesílání na iOS](https://docs.expo.dev/submit/ios/) uvádí tři předpoklady:

- **placený účet Apple Developer**, nutný pro jakékoli odeslání na App Store;
- **bundle identifier** v `ios.bundleIdentifier`;
- **nainstalované EAS CLI** přihlášené k tvému účtu Expo.

Pro odesílání bez interakce přidává stejná stránka dvě nastavení:

- **`ascAppId`** v profilu `submit` v `eas.json`, číslo tvé karty aplikace v App Store Connect;
- **API klíč App Store Connect**, spravovaný EAS nebo dodaný tebou. Jeho vytvoření, roli a zneplatnění rozebírám v článku [API klíč App Store Connect (.p8)](https://devoria.fr/cs/blog/klic-api-app-store-connect-p8-vytvoreni-pouziti).

Minimální profil se vejde na pár řádků. Hodnota je smyšlená:

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

Pokud EAS už tvůj API klíč uchovává, tenhle profil stačí. Tak to mám u většiny svých aplikací.

## Jak číst hlášku: tři skupiny chyb

Než začneš hledat opravu, zjisti, v jakém okamžiku se příkaz zastavil. Tuhle tabulku používám při každém selhání.

| Okamžik selhání                    | Skupina           | Nový build?   |
| ---------------------------------- | ----------------- | ------------- |
| Před jakýmkoli odesláním           | Konfigurace EAS   | Ne            |
| Připojení k Apple, vytvoření karty | Účet Apple        | Ne            |
| Po odeslání, kód ITMS-90xxx        | Odmítnutá binárka | Skoro vždycky |

Podrobnosti najdeš na stránce odeslání v dashboardu Expo. [Expo radí](https://docs.expo.dev/deploy/submit-to-app-stores/) přečíst si tam logy a najít bublinu „Build Annotations“, která upozorňuje na běžné příčiny selhání. V terminálu přepínač `--verbose` vždy zobrazí logy EAS Submit, podle [reference EAS CLI](https://docs.expo.dev/eas/cli/).

## Chyby konfigurace EAS

### „Set ascAppId in the submit profile (eas.json) or re-run this command in interactive mode.“

Spustil jsi příkaz s `--non-interactive`, třeba v CI, a tvůj profil neobsahuje `ascAppId`. [Kód EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) se pak zastaví: nemůže se tě na nic zeptat ani za tebe vytvořit kartu aplikace.

**Oprava: zkopíruj číslo své karty do `ascAppId`.** [Expo popisuje, kde ho najít](https://github.com/expo/fyi/blob/main/asc-app-id.md): v App Store Connect otevři svou aplikaci a pak App Information. Je to pole Apple ID pod General Information, číslo o zhruba deseti cifrách. Není to tvůj e-mail k Apple ani bundle identifier.

U Nolery si bez `ascAppId` příkaz pořád vyžadoval session Apple Developer, která vyprší. Od chvíle, kdy je číslo v `eas.json`, odeslání nic nechce.

> `ascAppId` přidej před buildem, ne po něm. Až do SDK 57 [otisk počítaný Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts) vždy zahrnuje `eas.json`. U Vigie, jejíž runtime verze se řídí politikou `fingerprint`, přidání tohohle čísla po buildu změnilo otisk: aktualizace publikovaná potom by se k nainstalovanému buildu nikdy nedostala. Od SDK 58 výchozí předvolba otisku, `balanced`, `eas.json` ignoruje, podle [changelogu Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/CHANGELOG.md).

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

Tvůj profil neobsahuje klíč a EAS nemá k tvé aplikaci připojený žádný. [Expo to upřesňuje](https://docs.expo.dev/submit/ios/): v neinteraktivním režimu si příkaz nemůže klíč vyžádat a selže s touhle hláškou.

Dvě možné opravy:

- **Nech EAS klíč vytvořit a uchovávat.** Spusť jednou `eas credentials --platform ios` v interaktivním režimu na svém počítači a nech ho nastavit API klíč App Store Connect pro tvou aplikaci.
- **Dodej vlastní klíč** v `ascApiKeyPath`, `ascApiKeyIssuerId` a `ascApiKeyId`. Podle [reference eas.json](https://docs.expo.dev/eas/json/) tahle tři pole přijímají proměnné prostředí, třeba `$ASC_API_KEY_PATH`.

U mé poslední aplikace chtěl přepínač `--auto-submit` Apple ID, aby si vytvořil klíč pro odeslání. Tři pole svého vlastního klíče jsem dal do profilu ve své pracovní kopii, nikdy necommitované. Pak jsem hotový build odeslal s `--id` a `--non-interactive`.

### „EXPO_APPLE_APP_SPECIFIC_PASSWORD must be in the format xxxx-xxxx-xxxx-xxxx, where x is a lowercase letter.“

Proměnná obsahuje něco jiného než heslo pro aplikaci, často přímo tvoje heslo k Apple. [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) tenhle formát kontroluje před jakýmkoli odesláním.

Podle [nápovědy Apple](https://support.apple.com/en-us/102654) se heslo pro aplikaci generuje na account.apple.com v sekci App-Specific Passwords, se zapnutým dvoufázovým ověřením. Zneplatní se, jakmile změníš heslo ke svému účtu Apple. **Expo považuje tuhle metodu za [méně bezpečnou než API klíč](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), svou výchozí a doporučenou metodu.**

## Chyby účtu Apple

### „… agree to the latest Program License Agreement in your developer account.“

Celá hláška začíná „You currently don't have access to this membership resource“. Na straně Apple může surová odpověď obsahovat „Unable to process request - PLA Update available“. Novější kroky odesílání v EAS spíš zobrazí „A required Apple agreement is missing or has expired“.

Příčina je stejná: Apple aktualizoval smlouvu a nikdo ji nepřijal. **Smlouvy může přijmout jen držitel účtu, Account Holder**, podle [tabulky rolí Apple](https://developer.apple.com/help/account/access/roles/). [Kód EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) ho posílá na stránku Business v App Store Connect a pak, pokud to Apple nabídne, do jeho účtu na developer.apple.com. Pak příkaz spusť znovu. Smlouva pro placené aplikace má svůj návod: [Paid Apps Agreement v App Store Connect](https://devoria.fr/cs/blog/paid-apps-agreement-stavy-w-8ben-prvni-vyplata).

### „App Store Connect rejected the API authentication credentials.“

Apple odpověděl chybou 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) uvádí tři příčiny: klíč, který už není aktivní, klíč z jiného účtu App Store Connect, nebo chybné Key ID, obsah klíče či Issuer ID.

Zkontroluj oba identifikátory v App Store Connect, menu Users and Access, záložka Integrations. Podle [Apple](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) se Issuer ID zobrazuje nahoře na stránce a Key ID v seznamu aktivních klíčů. **Zneplatněný klíč už nikdy znovu neaktivuješ.** [Apple ho zobrazuje](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 dní pod Revoked: musíš vygenerovat nový.

### „App Store Connect app for application identifier … was not found.“

Kartu, na kterou míří `ascAppId`, tvůj klíč nenajde. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) tě vyzve, abys to číslo ověřil a zkontroloval, že klíč má ke správné aplikaci ve správném účtu přístup. Dokonce vypíše pár aplikací, které jsou s tímhle klíčem vidět. S nástroji Apple pro odesílání se stejný problém zobrazí jako „No suitable application records were found“.

Opakují se tři příčiny, z toho dvě zmíněné v [tomhle vlákně na fórech Apple](https://developer.apple.com/forums/thread/106806):

- **Karta neexistuje.** Vytvoř ji v App Store Connect, nebo odstraň `ascAppId`, aby ji vytvořil příkaz.
- **Číslo je z jiného účtu.** Zkopíroval jsi `ascAppId` jiného týmu nebo jiného projektu.
- **Uživatel nemá k aplikaci přístup.** App Manager nebo Developer může být omezen na určité aplikace. Týmový klíč naopak [má přístup ke všem aplikacím](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) účtu.

### „… is not available to team“ nebo „… is not available to provider“

Tahle hláška se objeví, když EAS vytváří kartu za tebe, protože chybí `ascAppId`. Bundle identifier už má zabraný jiný tým. [EAS tě vyzve](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts), abys ho změnil v konfiguraci aplikace a spustil příkaz znovu.

### „App name "…" is already taken. Using generated name "…"“

Tohle není selhání. Když je název na App Store už zabraný, EAS přidá šest náhodných znaků a zkusí to znovu, až pětkrát. Kartu pak přejmenuješ v App Store Connect. Abys tomu předešel, vyplň před prvním odesláním v profilu `appName` a `language`: bez `language` [je hlavní jazyk `en-US`](https://docs.expo.dev/eas/json/).

## Chyby binárky: kódy ITMS

Po odeslání Apple build zpracuje. Pokud ho odmítne, log uvede jeden nebo víc kódů ITMS. Tady jsou ty, které [krok odesílání v EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) rozpozná a přeloží:

| Kód ITMS                   | Co Apple odmítá                         | Oprava                  |
| -------------------------- | --------------------------------------- | ----------------------- |
| 90189                      | Číslo buildu už je použité              | `autoIncrement`         |
| 90062, 90186, 90478        | Verze uzavřená nebo už překonaná        | Zvýšit `version`        |
| 90683                      | Chybí zdůvodnění oprávnění              | `ios.infoPlist`         |
| 90725                      | Příliš staré iOS SDK                    | iOS image nebo SDK Expo |
| 90054, 90055               | Bundle neodpovídá cílové kartě          | Opravit `ascAppId`      |
| 90022, 90023, 90391, 90713 | Chybějící nebo špatně deklarované ikony | Zkontrolovat ikony      |
| 90771                      | Chybí identifikátory úloh na pozadí     | `ios.infoPlist`         |

Tři upřesnění z těch hlášek:

- **Číslo buildu je v rámci verze unikátní.** U 90189 EAS doporučuje `"autoIncrement": true` v `eas.json`. Všechno najdeš v článku [číslo buildu a verze](https://devoria.fr/cs/blog/app-store-connect-build-number-verze-cislo-buildu).
- **U 90725** EAS radí vybrat v `eas.json` novější iOS image a případně přejít na podporované SDK Expo.
- **U 90771** tvůj Info.plist deklaruje režim na pozadí `processing`, ale ne klíč `BGTaskSchedulerPermittedIdentifiers`.

Kromě 90054 a 90055, kde stačí mířit na správnou kartu nebo jiný build, **se oprava týká binárky: udělej nový build a pošli ho znovu.** Dva kódy mají vlastní návod: [ITMS-90683 s Expo](https://devoria.fr/cs/blog/itms-90683-missing-purpose-string-expo) a [ITMS-90725](https://devoria.fr/cs/blog/itms-90725-sdk-version-issue-expo).

Na konci září 2026 byl build Solysu při doručení odmítnut kvůli ITMS-90683. Při úklidu konfiguračního souboru jsem odstranil zdůvodnění oprávnění k fotkám. Solys fotky nepoužívá, ale jedna knihovna v projektu volá iOS API Photos. **Apple analyzuje binárku, ne skutečné použití:** od té doby tahle zdůvodnění už nikdy neodstraňuju.

Stav Missing Compliance mimochodem není chyba odeslání. Chybí tvoje prohlášení o šifrování, vysvětlené v [návodu na publikaci s EAS](https://devoria.fr/cs/blog/eas-submit-ios-publikovat-expo-app-app-store).

## Můj checklist před každým odesláním

- `ascAppId` je v profilu `submit`, přidané před buildem.
- API klíč spravuje EAS, nebo jeho tři pole ukazují na `.p8` uložený mimo repozitář.
- Account Holder přijal nejnovější smlouvy v App Store Connect.
- `autoIncrement` je zapnutý, spolu s `"appVersionSource": "remote"`, [doporučeným Expo](https://docs.expo.dev/build-reference/app-versions/) od EAS CLI 12.
- `version` je vyšší než poslední schválená verze.
- Každé citlivé API přítomné v binárce má své zdůvodnění oprávnění.
- U nové aplikace jsou `appName` a `language` vyplněné před prvním odesláním.

## Jak odeslat svou první aplikaci a nezaseknout se

Příkaz je jen jeden krok. [iOS & Android Kit](https://devoria.fr/cs/kits/ios) vychází ze startovního kódu mých aplikací, včetně předplatných, a provede tě čtyřmi kroky až na App Store, tvým tempem.

Pokud chystáš své první vydání, [udělej si bezplatnou diagnostiku](https://devoria.fr/cs/diagnostic): řekne ti, co tě doopravdy brzdí, a pošle ti můj checklist proti zamítnutí od Apple. Kartu aplikace, screenshoty a schválení krok za krokem probírá stránka [publikace aplikace na App Store](https://devoria.fr/cs/expertise/jak-vydat-aplikaci-v-app-store).

## Časté dotazy

### Proč eas submit selhává jen v CI?

V režimu `--non-interactive` se tě příkaz nemůže na nic zeptat. Potřebuje `ascAppId` v profilu a API klíč už připojený k aplikaci, nebo jeho tři pole v `eas.json`. Na tvém počítači by se tě na tohle zeptal.

### Musím po chybě eas submit udělat nový build?

Jen pokud Apple odmítne binárku s kódem ITMS. Výjimka: u ITMS-90054 a 90055 mířil build na špatnou kartu, stačí ho poslat znovu na tu správnou. Chyby konfigurace a účtu opravíš v `eas.json`, v App Store Connect nebo ve svém účtu Apple. Pak pošleš stejný build znovu, třeba s `--latest` nebo `--id`.

### Kde najdu logy odeslání přes EAS Submit?

Na stránce odeslání v dashboardu Expo. Expo radí přečíst si tam logy a bublinu „Build Annotations“. V terminálu přidej `--verbose`, aby se logy zobrazily vždycky.

### Můžu používat eas submit s bezplatným účtem Apple?

Ne. Expo vyžaduje pro odeslání aplikace na App Store placený účet Apple Developer. Bezplatný účet ti umožní testovat na vlastním iPhonu, ne používat App Store Connect.

### Jakou roli dát API klíči pro eas submit?

Návod Expo dává klíči roli Admin. Podle tabulky rolí Apple můžou buildy odesílat i role App Manager a Developer. Moje buildy Expo běží s týmovým klíčem s rolí App Manager. Týmový klíč můžou vygenerovat jen Account Holder a Admini.

### Co znamená „Increment Build Number“ v EAS?

Apple odmítl build s kódem ITMS-90189: tohle číslo buildu už pro danou verzi existuje. Zapni `"autoIncrement": true` v `eas.json`, nebo zvyš `ios.buildNumber`, a udělej nový build.


## 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.
