eas submit iOS: časté chyby a ako ich opraviť
Autor: Mehdi Azizi
Zverejnené , 10 min
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.
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, 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. Tu opravujeme.
Čo eas submit robí a čo potrebuje
Podľa dokumentácie Expo 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 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:
ascAppIdv profilesubmitveas.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).
Minimálny profil má pár riadkov. Hodnota je vymyslená:
{
"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 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.
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 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š: 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
ascAppIdpred buildom, nie po ňom. Až po SDK 57 fingerprint, ktorý počíta Expo, vždy zahŕňaeas.json. Pri Vigie, ktorej runtime verzia sa riadi politikoufingerprint, 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, ignorujeeas.json, podľa changelogu Expo.
„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: 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 iosv 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,ascApiKeyIssuerIdaascApiKeyId. Podľa referencie 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 tento formát kontroluje pred akýmkoľvek odoslaním.
Podľa nápovedy Apple 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ľúč, 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. Kód EAS 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.
„App Store Connect rejected the API authentication credentials.“
Apple odpovedal chybou 401, NOT_AUTHORIZED. EAS 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 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 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 ť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:
- 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
ascAppIdz 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 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, 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.
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 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": trueveas.json. Všetko nájdeš v článku číslo buildu a verzia. - Pri 90725 EAS radí vybrať v
eas.jsonnovší 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 a ITMS-90725.
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.
Môj checklist pred každým odoslaním
ascAppIdje v profilesubmit, pridané pred buildom.- API kľúč spravuje EAS, alebo jeho tri polia ukazujú na
.p8uložený mimo repozitára. - Account Holder prijal najnovšie zmluvy v App Store Connect.
autoIncrementje zapnutý, spolu s"appVersionSource": "remote", ktorý Expo odporúča od EAS CLI 12.versionje vyššia ako posledná schválená verzia.- Každé citlivé API v binárke má svoj text žiadosti o povolenie.
- Pri novej appke sú
appNamealanguagevyplnené pred prvým odoslaním.
Ako poslať prvú appku bez zaseknutia
Príkaz je len jeden krok. iOS & Android Kit 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: 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.
Č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.

