# eas submit iOS: časté chyby a ako ich opraviť

> eas submit zlyháva? Skutočné hlásenia EAS a App Store Connect, ich príčina a oprava: ascAppId, API kľúč, zmluva Apple, kódy ITMS.

Pôvodná stránka: [eas submit iOS: časté chyby a ako ich opraviť](https://devoria.fr/sk/blog/eas-submit-ios-caste-chyby-oprava)
Autor: [Mehdi Azizi](https://devoria.fr/sk/mehdi-azizi)
Zverejnenie: 2026-11-04
Posledná revízia obsahu: 2026-11-04


Keď `eas submit --platform ios` zlyhá, hlásenie ti takmer vždy povie, kam sa pozrieť. **Buď je tvoja konfigurácia EAS neúplná, alebo blokuje tvoj účet Apple, alebo Apple odmieta binárku.** Prvé dva prípady opravíš za pár minút, bez nového buildu. Tretí spoznáš podľa kódu ITMS a takmer vždy si vyžaduje nový build.

Svoje iOS appky, medzi nimi Solys, TradaZen a Nolera, publikujem cez Expo a EAS. Hlásenia, ktoré tu citujem, sú skopírované zo zdrojového kódu EAS CLI z [oficiálneho GitHub repozitára Expo](https://github.com/expo/eas-cli), skontrolované 3. novembra 2026. Staré fórum Expo teraz presmerúva na Discord, takže kód zostáva najspoľahlivejším zdrojom. Celý postup, od súboru `eas.json` až po odoslanie na review, nájdeš v článku [EAS Submit iOS: publikovanie Expo appky na App Store](https://devoria.fr/sk/blog/eas-submit-ios-publikovat-expo-appku-app-store). Tu opravujeme.

## Čo eas submit robí a čo potrebuje

Podľa [dokumentácie Expo](https://docs.expo.dev/deploy/submit-to-app-stores/) príkaz pošle tvoj súbor `.ipa` do App Store Connect. Build sa objaví v TestFlighte po spracovaní na strane Apple, zvyčajne za 10 až 15 minút. **Neodosiela tvoju appku na review**: tento krok musíš urobiť v App Store Connect.

[Stránka Expo o odosielaní na iOS](https://docs.expo.dev/submit/ios/) uvádza tri predpoklady:

- **platený účet Apple Developer**, povinný pre každé odoslanie do App Store;
- **bundle identifier** v `ios.bundleIdentifier`;
- **nainštalované EAS CLI** prihlásené do tvojho účtu Expo.

Na odosielanie bez interakcie pridáva tá istá stránka dve nastavenia:

- **`ascAppId`** v profile `submit` v `eas.json`, číslo tvojej appky v App Store Connect;
- **API kľúč App Store Connect**, spravovaný cez EAS alebo dodaný tebou. Jeho vytvorenie, rolu a zrušenie podrobne popisujem v článku [API kľúč App Store Connect (.p8)](https://devoria.fr/sk/blog/app-store-connect-api-kluc-p8-vytvorenie-pouzitie).

Minimálny profil má pár riadkov. Hodnota je vymyslená:

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

Ak EAS už tvoj API kľúč uchováva, tento profil stačí. Tak to mám pri väčšine svojich appiek.

## Ako čítať hlásenie: tri skupiny chýb

Kým začneš hľadať opravu, zisti, v ktorom momente sa príkaz zastavil. Túto tabuľku používam pri každom zlyhaní.

| Moment zlyhania                      | Skupina            | Nový build? |
| ------------------------------------ | ------------------ | ----------- |
| Pred akýmkoľvek odoslaním            | Konfigurácia EAS   | Nie         |
| Pripojenie k Apple, vytvorenie appky | Účet Apple         | Nie         |
| Po odoslaní, kód ITMS-90xxx          | Odmietnutá binárka | Takmer vždy |

Detaily nájdeš na stránke odoslania v dashboarde Expo. [Expo odporúča](https://docs.expo.dev/deploy/submit-to-app-stores/) prečítať si tam logy a nájsť bublinu „Build Annotations“, ktorá upozorňuje na bežné príčiny zlyhania. V termináli prepínač `--verbose` vždy zobrazí logy EAS Submit, podľa [referencie EAS CLI](https://docs.expo.dev/eas/cli/).

## Chyby konfigurácie EAS

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

Spustil si príkaz s `--non-interactive`, napríklad v CI, a tvoj profil neobsahuje `ascAppId`. [Kód EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) sa vtedy zastaví: nemôže sa ťa nič spýtať ani za teba vytvoriť appku.

**Oprava: skopíruj číslo svojej appky do `ascAppId`.** [Expo hovorí, kde ho nájdeš](https://github.com/expo/fyi/blob/main/asc-app-id.md): v App Store Connect otvor svoju appku a potom App Information. Je to pole Apple ID v časti General Information, číslo s asi desiatimi číslicami. Nie je to tvoj e-mail Apple ani bundle identifier.

Pri Nolere si odo mňa príkaz bez `ascAppId` pýtal session Apple Developer, ktorá expiruje. Odkedy je číslo v `eas.json`, odoslanie už nič nepýta.

> Pridaj `ascAppId` pred buildom, nie po ňom. Až po SDK 57 [fingerprint, ktorý počíta Expo](https://github.com/expo/expo/blob/main/packages/@expo/fingerprint/src/sourcer/Expo.ts), vždy zahŕňa `eas.json`. Pri Vigie, ktorej runtime verzia sa riadi politikou `fingerprint`, pridanie tohto čísla po builde zmenilo fingerprint: update publikovaný potom by sa nikdy nedostal k nainštalovanému buildu. Od SDK 58 predvolený preset fingerprintu, `balanced`, ignoruje `eas.json`, podľa [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.“

Tvoj profil neobsahuje kľúč a EAS nemá k tvojej appke priradený žiadny. [Expo to upresňuje](https://docs.expo.dev/submit/ios/): v neinteraktívnom režime ťa príkaz nemôže požiadať o kľúč a zlyhá s týmto hlásením.

Dve možné opravy:

- **Nechaj EAS vytvoriť a uchovávať kľúč.** Raz spusti `eas credentials --platform ios` v interaktívnom režime na svojom počítači a nechaj ho nastaviť API kľúč App Store Connect pre tvoju appku.
- **Dodaj vlastný kľúč** v `ascApiKeyPath`, `ascApiKeyIssuerId` a `ascApiKeyId`. Podľa [referencie eas.json](https://docs.expo.dev/eas/json/) tieto tri polia akceptujú premenné prostredia, napríklad `$ASC_API_KEY_PATH`.

Pri mojej poslednej appke chcel prepínač `--auto-submit` Apple ID, aby vytvoril svoj kľúč na odosielanie. Tri polia vlastného kľúča som dal do profilu v pracovnej kópii, nikdy necommitnutej. Potom som hotový build poslal 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.“

Premenná obsahuje niečo iné než heslo pre appku, často samotné heslo k tvojmu účtu Apple. [EAS CLI](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/submit/ios/IosSubmitCommand.ts) tento formát kontroluje pred akýmkoľvek odoslaním.

Podľa [nápovedy Apple](https://support.apple.com/en-us/102654) sa heslo pre appku generuje na account.apple.com v sekcii App-Specific Passwords so zapnutým dvojfaktorovým overením. Zruší sa, hneď ako zmeníš heslo k účtu Apple. **Expo túto metódu považuje za [menej bezpečnú ako API kľúč](https://github.com/expo/fyi/blob/main/apple-app-specific-password.md), ktorý je jeho predvolenou a odporúčanou metódou.**

## Chyby účtu Apple

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

Celé hlásenie začína „You currently don't have access to this membership resource“. Surová odpoveď Apple môže obsahovať „Unable to process request - PLA Update available“. Novšie kroky odosielania v EAS zobrazujú skôr „A required Apple agreement is missing or has expired“.

Príčina je rovnaká: Apple aktualizoval zmluvu a nikto ju neprijal. **Zmluvy môže prijať iba majiteľ účtu, Account Holder**, podľa [tabuľky 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 posiela na stránku Business v App Store Connect a potom, ak to Apple ponúkne, do jeho účtu na developer.apple.com. Potom príkaz spusti znova. Zmluva pre platené appky má vlastný návod: [Paid Apps Agreement v App Store Connect](https://devoria.fr/sk/blog/paid-apps-agreement-w-8ben-prva-platba).

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

Apple odpovedal chybou 401, `NOT_AUTHORIZED`. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiClient.ts) uvádza tri príčiny: kľúč, ktorý už nie je aktívny, kľúč z iného účtu App Store Connect, alebo chybné Key ID, obsah kľúča či Issuer ID.

Over oba identifikátory v App Store Connect, menu Users and Access, záložka Integrations. Podľa [Apple](https://developer.apple.com/documentation/appstoreconnectapi/generating-tokens-for-api-requests) sa Issuer ID zobrazuje v hornej časti stránky a Key ID v zozname aktívnych kľúčov. **Zrušený kľúč sa už nikdy nedá znova aktivovať.** [Apple ho zobrazuje](https://developer.apple.com/documentation/appstoreconnectapi/revoking-api-keys) 30 dní v časti Revoked: musíš vygenerovať nový.

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

Appku, na ktorú mieri `ascAppId`, sa s tvojím kľúčom nedá nájsť. [EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/utils/ios/AscApiUtils.ts) ťa žiada overiť toto číslo a to, či má kľúč prístup k appke v správnom účte. Dokonca vypíše niekoľko appiek, ktoré s týmto kľúčom vidí. V nástrojoch Apple na odosielanie sa ten istý problém zobrazí ako „No suitable application records were found“.

Opakujú sa tri príčiny, z toho dve spomenuté v [tomto vlákne na fórach Apple](https://developer.apple.com/forums/thread/106806):

- **Appka neexistuje.** Vytvor ju v App Store Connect alebo odstráň `ascAppId`, aby ju vytvoril príkaz.
- **Číslo je z iného účtu.** Skopíroval si `ascAppId` z iného tímu alebo iného projektu.
- **Používateľ nemá prístup k appke.** App Manager alebo Developer môže mať prístup obmedzený len na niektoré appky. Tímový kľúč naopak [má prístup ku všetkým appkám](https://developer.apple.com/documentation/appstoreconnectapi/creating-api-keys-for-app-store-connect-api) v účte.

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

Toto hlásenie sa objaví, keď EAS vytvára appku za teba, lebo chýba `ascAppId`. Bundle identifier už používa iný tím. [EAS ťa žiada](https://github.com/expo/eas-cli/blob/main/packages/eas-cli/src/credentials/ios/appstore/ensureAppExists.ts), aby si ho zmenil v konfigurácii appky a príkaz spustil znova.

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

Toto nie je zlyhanie. Keď je názov na App Store už obsadený, EAS pridá šesť náhodných znakov a skúsi to znova, najviac päťkrát. Appku neskôr premenuješ v App Store Connect. Aby si tomu predišiel, vyplň `appName` a `language` v profile pred prvým odoslaním: bez `language` je [primárny jazyk `en-US`](https://docs.expo.dev/eas/json/).

## Chyby binárky: kódy ITMS

Po odoslaní Apple build spracuje. Ak ho odmietne, log uvedie jeden alebo viac kódov ITMS. Tu sú tie, ktoré [krok odosielania v EAS](https://github.com/expo/eas-cli/blob/main/packages/build-tools/src/steps/functions/uploadToAsc.ts) rozpozná a preloží:

| Kód ITMS                   | Čo Apple odmieta                      | Oprava                   |
| -------------------------- | ------------------------------------- | ------------------------ |
| 90189                      | Číslo buildu je už použité            | `autoIncrement`          |
| 90062, 90186, 90478        | Verzia je uzavretá alebo už prekonaná | Zvýšiť `version`         |
| 90683                      | Chýba text žiadosti o povolenie       | `ios.infoPlist`          |
| 90725                      | Príliš staré iOS SDK                  | iOS image alebo Expo SDK |
| 90054, 90055               | Bundle sa líši od cieľovej appky      | Opraviť `ascAppId`       |
| 90022, 90023, 90391, 90713 | Chýbajúce alebo zle deklarované ikony | Skontrolovať ikony       |
| 90771                      | Chýbajú identifikátory úloh na pozadí | `ios.infoPlist`          |

Tri upresnenia z týchto hlásení:

- **Číslo buildu je jedinečné v rámci verzie.** Pri 90189 EAS odporúča `"autoIncrement": true` v `eas.json`. Všetko nájdeš v článku [číslo buildu a verzia](https://devoria.fr/sk/blog/app-store-connect-build-number-verzia-cislo-buildu).
- **Pri 90725** EAS radí vybrať v `eas.json` novší iOS image a v prípade potreby prejsť na podporované Expo SDK.
- **Pri 90771** tvoj Info.plist deklaruje režim na pozadí `processing`, ale nie kľúč `BGTaskSchedulerPermittedIdentifiers`.

Okrem 90054 a 90055, kde stačí mieriť na správnu appku alebo iný build, **sa oprava týka binárky: urob nový build a pošli ho znova.** Dva kódy majú vlastný návod: [ITMS-90683 s Expo](https://devoria.fr/sk/blog/itms-90683-missing-purpose-string-expo) a [ITMS-90725](https://devoria.fr/sk/blog/itms-90725-sdk-version-issue-expo).

Koncom septembra 2026 bol build Solys pri doručení odmietnutý kvôli ITMS-90683. Pri upratovaní konfiguračného súboru som odstránil text žiadosti o povolenie k fotkám. Solys fotky nepoužíva, ale jedna knižnica v projekte volá iOS API Photos. **Apple analyzuje binárku, nie skutočné použitie:** odvtedy tieto texty už nikdy neodstraňujem.

Stav Missing Compliance nie je chyba odoslania. Chýba tvoje vyhlásenie o šifrovaní, vysvetlené v [návode na publikovanie s EAS](https://devoria.fr/sk/blog/eas-submit-ios-publikovat-expo-appku-app-store).

## Môj checklist pred každým odoslaním

- `ascAppId` je v profile `submit`, pridané pred buildom.
- API kľúč spravuje EAS, alebo jeho tri polia ukazujú na `.p8` uložený mimo repozitára.
- Account Holder prijal najnovšie zmluvy v App Store Connect.
- `autoIncrement` je zapnutý, spolu s `"appVersionSource": "remote"`, ktorý [Expo odporúča](https://docs.expo.dev/build-reference/app-versions/) od EAS CLI 12.
- `version` je vyššia ako posledná schválená verzia.
- Každé citlivé API v binárke má svoj text žiadosti o povolenie.
- Pri novej appke sú `appName` a `language` vyplnené pred prvým odoslaním.

## Ako poslať prvú appku bez zaseknutia

Príkaz je len jeden krok. [iOS & Android Kit](https://devoria.fr/sk/kits/ios) vychádza zo štartovacieho kódu mojich appiek, vrátane predplatného, a v štyroch krokoch ťa dovedie až na App Store, tvojím tempom.

Ak chystáš svoje prvé vydanie, [sprav si bezplatnú diagnostiku](https://devoria.fr/sk/diagnostic): povie ti, čo ťa naozaj brzdí, a pošle ti môj checklist proti zamietnutiu od Apple. Pre stránku appky, screenshoty a schválenie prechádza každým krokom stránka [publikovanie aplikácie na App Store](https://devoria.fr/sk/expertise/zverejnit-aplikaciu-v-app-store).

## Často kladené otázky

### Prečo eas submit zlyháva iba v CI?

V režime `--non-interactive` sa ťa príkaz nemôže nič spýtať. Potrebuje `ascAppId` v profile a API kľúč už priradený k appke, alebo jeho tri polia v `eas.json`. Na tvojom počítači by sa ťa na tieto veci spýtal.

### Treba po chybe eas submit urobiť nový build?

Iba ak Apple odmietne binárku s kódom ITMS. Výnimka: pri ITMS-90054 a 90055 build mieril na nesprávnu appku, stačí ho poslať znova na správnu. Chyby konfigurácie a účtu opravíš v `eas.json`, v App Store Connect alebo vo svojom účte Apple. Potom pošleš ten istý build, napríklad s `--latest` alebo `--id`.

### Kde nájdem logy odoslania cez EAS Submit?

Na stránke odoslania v dashboarde Expo. Expo odporúča prečítať si tam logy a bublinu „Build Annotations“. V termináli pridaj `--verbose`, aby sa logy vždy zobrazili.

### Dá sa eas submit použiť s bezplatným účtom Apple?

Nie. Expo vyžaduje platený účet Apple Developer na odoslanie appky do App Store. Bezplatný účet umožňuje testovať na vlastnom iPhone, ale nie používať App Store Connect.

### Akú rolu dať API kľúču pre eas submit?

Návod Expo dáva kľúču rolu Admin. Podľa tabuľky rolí Apple môžu buildy odosielať aj roly App Manager a Developer. Moje Expo buildy bežia s tímovým kľúčom s rolou App Manager. Tímový kľúč môžu vygenerovať iba Account Holder a Admini.

### Čo znamená „Increment Build Number“ v EAS?

Apple odmietol build s kódom ITMS-90189: toto číslo buildu už pre danú verziu existuje. Zapni `"autoIncrement": true` v `eas.json` alebo zvýš `ios.buildNumber` a potom urob nový build.


## Tvoj projekt

[Review Kit](https://devoria.fr/sk/kits/app-review): Môj checklist na App Store review, moje opravené zamietnutia od Apple, checklist pre Google Play a tri skilly pre Claude Code. 49 €.

[iOS & Android Kit](https://devoria.fr/sk/kits/ios): Vytvor si appku pre iPhone a Android s Claude Code: štartovací kód mojich appiek, cesta až do obchodov a všetky kity. 99 €.

[Diagnostika: čo ťa delí od tvojej iPhone appky](https://devoria.fr/sk/diagnostic): 7 otázok, 60 sekúnd: zistíš, čo ti naozaj bráni zverejniť tvoju iPhone appku, dostaneš cestu v 4 krokoch a kit, ktorý ti sedí.
