eas submit iOS: časté chyby a jak je opravit
Autor: Mehdi Azizi
Publikováno , 10 min
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.
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, 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. Tady opravujeme.
Co eas submit dělá a co k tomu potřebuje
Podle dokumentace Expo 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 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í:
ascAppIdv profilusubmitveas.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).
Minimální profil se vejde na pár řádků. Hodnota je smyšlená:
{
"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í 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.
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 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: 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.
ascAppIdpřidej před buildem, ne po něm. Až do SDK 57 otisk počítaný Expo vždy zahrnujeeas.json. U Vigie, jejíž runtime verze se řídí politikoufingerprint, 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.jsonignoruje, podle changelogu Expo.
„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: 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 iosv 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,ascApiKeyIssuerIdaascApiKeyId. Podle reference 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 tenhle formát kontroluje před jakýmkoli odesláním.
Podle nápovědy Apple 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íč, 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. Kód EAS 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.
„App Store Connect rejected the API authentication credentials.“
Apple odpověděl chybou 401, NOT_AUTHORIZED. EAS 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 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 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 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:
- 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
ascAppIdjiné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 úč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, 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.
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 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": trueveas.json. Všechno najdeš v článku číslo buildu a verze. - U 90725 EAS radí vybrat v
eas.jsonnově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 a ITMS-90725.
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.
Můj checklist před každým odesláním
ascAppIdje v profilusubmit, přidané před buildem.- API klíč spravuje EAS, nebo jeho tři pole ukazují na
.p8uložený mimo repozitář. - Account Holder přijal nejnovější smlouvy v App Store Connect.
autoIncrementje zapnutý, spolu s"appVersionSource": "remote", doporučeným Expo od EAS CLI 12.versionje 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
appNamealanguagevyplně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 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: ř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.
Č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.

