EAS Submit iOS: jak publikovat Expo app na App Store
Autor: Mehdi Azizi
Publikováno , 8 min
EAS Submit pošle tvůj iOS build do App Store Connect, kde se objeví v TestFlightu. Odeslání ke kontrole ale musíš udělat sám v App Store Connect.
eas submit --platform ios pošle tvůj iOS build do App Store Connect, kde se po zpracování u Applu objeví v TestFlightu. Příkaz tvou appku neodešle ke kontrole u Applu: výběr buildu a odeslání ke kontrole musíš udělat v App Store Connect. Aby šlo odesílání automatizovat, potřebuje číslo tvého záznamu aplikace (ascAppId) a API klíč App Store Connect.
Své iOS appky, mezi nimi Solys, TradaZen a Nolera, publikuju přes Expo, EAS Build a EAS Submit. Tenhle návod vychází z dokumentace Expa k odesílání na iOS, kterou jsem znovu prošel 25. října 2026. Pokud nemáš Mac, celý postup najdeš v článku publikovat iOS appku bez Macu. Tady se soustředíme jen na odeslání.
Co potřebuješ před prvním příkazem
Expo uvádí tři předpoklady:
- Placený účet Apple Developer. Cenu a registraci najdeš v článku vývojářský účet Apple.
- Bundle identifier v
ios.bundleIdentifier. Podle reference konfigurace Expa si ho vymyslíš sám, ale musí být na App Storu unikátní. - Nainstalované EAS CLI a pak
eas loginse svým účtem Expo.
Potřebuješ taky podepsaný produkční build. EAS Build ho vyrobí s certifikátem a profilem, které za tebe spravuje, jak vysvětluje článek iOS certifikát a provisioning profile.
Záznam v App Store Connect: ty, nebo EAS?
EAS Submit posílá binárku do aplikace, která už musí v App Store Connect existovat.
Můžeš ho vytvořit sám. Nápověda Applu popisuje okno New App: platforma, název, primární jazyk, bundle identifier, SKU a přístup uživatelů. Potřebuješ roli Account Holder, Admin nebo App Manager.
EAS ho taky umí vytvořit při prvním odeslání. Podle stránky Expa o TestFlightu vytvoří eas submit záznam, když posíláš svůj první build. Podle reference eas.json se tenhle krok přeskočí, když vyplníš ascAppId. Název se vezme z appName, případně z name ve tvé konfiguraci. Primární jazyk se vezme z language, výchozí hodnota je en-US. Pokud tvoje appka vychází nejdřív ve francouzštině, vyplň language ještě před tímhle prvním odesláním.
Potom si číslo záznamu zkopíruj do ascAppId. Expo říká, kde ho najdeš: otevři svou appku v App Store Connect a pak App Information. Je to pole Apple ID v sekci General Information. Je to číslo, ne tvůj bundle identifier.
Proč API klíč a ne tvoje Apple ID
EAS Submit se k Applu připojuje buď přes tvoje Apple ID, nebo přes API klíč App Store Connect.
Apple ID narazí na dvoufázové ověření, které Apple vyžaduje od všech uživatelů App Store Connect: přihlášení musí potvrdit člověk. Heslo pro aplikaci, předané v EXPO_APPLE_APP_SPECIFIC_PASSWORD, tenhle krok obejde, ale Expo ho považuje za méně bezpečné než API klíč, který je jeho výchozí a doporučenou metodou. Klíč umožňuje ověření bez jakékoli interakce, a tedy i automatizaci odesílání.
Získat ho můžeš dvěma způsoby:
- Nech ho spravovat EAS. Spusť
eas credentials --platform ios, vyber profilproduction, přihlas se ke svému účtu Apple a pak vyber „App Store Connect: Manage your API Key“. - Použij vlastní klíč. V App Store Connect: Users and Access, záložka Integrations, App Store Connect API, Team Keys a pak Generate API Key. Potřebuješ účet s rolí Admin a návod Expa dává klíči roli Admin.
Ve druhém případě si poznamenej Key ID, které vidíš v seznamu aktivních klíčů, a Issuer ID nahoře na stránce Integrations. Hlavně si schovej soubor .p8: stáhnout ho můžeš jen jednou a Apple si žádnou kopii neuchovává.
Klíč s rolí Admin může podle Applu vytvářet a mazat uživatele tvého účtu. Apple žádá, abys klíč nikdy neukládal do repozitáře s kódem.
Minimální soubor eas.json ke zkopírování
Všechny hodnoty jsou smyšlené: nahraď je svými.
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890",
"appleTeamId": "ABCDE12345",
"ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
"ascApiKeyIssuerId": "your-issuer-id",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}
appVersionSourceaautoIncrement: servery EAS si drží číslo buildu a při každém produkčním buildu ho zvednou. Expo tenhle vzdálený režim doporučuje od EAS CLI 12.ascAppId: číslo tvého záznamu. Bez něj neinteraktivní režim selže.appleTeamId: identifikátor tvého týmu Apple Developer.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: tvůj API klíč. Všechna tři pole berou i proměnné prostředí. Přidej složkukeysdo svého.gitignore.
Pole appleId má smysl jen tehdy, když se přihlašuješ přes Apple ID. Pokud tvůj klíč už spravuje EAS, odstraň i ta tři pole ascApiKey. U mých tří appek, které jsem prošel 25. října, obsahuje produkční profil pro odesílání jen ascAppId, u Solys navíc appleTeamId: v souboru není žádný klíč.
Spuštění buildu a pak odeslání
eas build --platform ios --profile production
eas submit --platform ios
Bez dalších voleb tě eas submit nechá vybrat build k odeslání a při prvním spuštění se zeptá na tvoje Apple ID. Pokud existuje profil pro odesílání production, použije se automaticky. Reference EAS CLI uvádí volby, se kterými výběr odpadne:
| Volba | Co dělá |
|---|---|
--latest | Pošle poslední iOS build |
--id | Pošle konkrétní EAS build |
--path | Pošle lokální soubor .ipa |
--url | Pošle archiv z internetu |
--groups | Přidá build do interní skupiny |
--what-to-test | Vyplní „What to test“ |
Pokud chceš všechno spustit najednou, přidej k příkazu pro build --auto-submit. Podle stránky Expa o automatickém odesílání jde hotový build do EAS Submit s profilem pro odesílání, který se jmenuje stejně jako profil buildu. Jiný vybereš takhle: --auto-submit-with-profile=nazev. Build jde do TestFlightu, ne ke kontrole.
V CI přidej --non-interactive a token EXPO_TOKEN. Příkaz se tě pak nemůže na nic zeptat: potřebuje ascAppId v profilu a API klíč, buď ten, který EAS k appce připojil, nebo tvůj vlastní ve třech polích ascApiKey.
Co se děje po odeslání
1. Apple build zpracuje. Build musí tímhle zpracováním projít, než se objeví v App Store Connect, a Apple ti na konci pošle e-mail. Expo obvykle mluví o 10 až 15 minutách, než ho uvidíš v TestFlightu.
2. Exportní shoda. Stav Missing Compliance znamená, že chybí tvoje prohlášení o šifrování. App Store Connect se na tyhle otázky ptá u každé nové verze, pokud na ně už neodpovídá Info.plist. V Expu se ten klíč jmenuje ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Podle Applu je false v pořádku, pokud tvoje appka, včetně knihoven, nepoužívá žádné šifrování nebo jen šifrování, které je vyjmuté. Systémové šifrování, třeba HTTPS přes URLSession, vyjmuté obvykle je. false uváděj jen tehdy, když to pro tvou appku opravdu platí: za prohlášení odpovídáš. Jako každý klíč v Info.plist vyžaduje nový build.
3. TestFlight. Ve stavu Ready to Submit může build podle Applu jít k interním testerům, projít beta kontrolou pro externí testery, nebo jít ke kontrole pro App Store. Pole groups v profilu ho přidá do tvých interních skupin. Všechno ostatní najdeš v článku TestFlight pro testování appky.
Odeslání buildu není odeslání ke kontrole
Expo to píše jasně: build v TestFlightu se na App Storu automaticky nezveřejní. EAS Submit nevyplní tvůj záznam ani screenshoty. V App Store Connect tě čekají ještě čtyři kroky, popsané v nápovědě Applu k odeslání ke kontrole:
- Vyplň povinná metadata dané verze.
- Vyber build v sekci Build dané verze.
- Klikni na „Add for Review“. Verze přejde do stavu Ready for Review, ale ke kontrole ještě nic neodešlo.
- Klikni na „Submit for Review“. Jakmile kontrola začne, stav se změní na In Review.
Časté chyby a jak je opravit
| Zobrazená chyba | Příčina | Oprava |
|---|---|---|
| ITMS-90189 | Číslo buildu už je použité | autoIncrement |
| ITMS-90062 nebo 90186 | Verze je už uzavřená | Zvýšit version |
| „Set ascAppId“ | V CI chybí ascAppId | Přidat ascAppId |
| „API Keys cannot“ | Není připojený žádný klíč | eas credentials |
| ITMS-90683 | Chybí popis účelu přístupu | ios.infoPlist |
| ITMS-91053 | Neúplný manifest | ios.privacyManifests |
| ITMS-90725 | Příliš staré iOS SDK | Zvýšit Expo SDK |
| Missing Compliance | Šifrování není deklarované | usesNonExemptEncryption |
Podle Expa je už použité číslo buildu častým důvodem odmítnutí při odesílání: všechno najdeš v článku číslo buildu a verze. Tři chyby mají vlastní návod: ITMS-90683 v Expu, ITMS-91053 v Expu a ITMS-90725.
Obě hlášky v uvozovkách pocházejí z EAS a opravíš je v jeho konfiguraci. Missing Compliance vyřešíš i tak, že odpovíš na otázky v App Store Connect. U všech ostatních řádků se oprava týká binárky: udělej nový build a pošli ho znovu. Vzdálená aktualizace nezmění Info.plist, manifest ani čísla.
Pošli svou první appku bez tápání
Příkaz je jen jeden krok. iOS Kit vychází ze startovacího kódu mých appek, včetně předplatných, a vede tě čtyřmi kroky až na App Store, svý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 Applu. Záznam v obchodě, screenshoty a schválení pokrývá krok za krokem stránka publikovat aplikaci na App Store.
Časté dotazy
Jak publikovat Expo appku na App Store?
Spusť produkční build přes EAS Build a pak ho pošli příkazem eas submit --platform ios. Po zpracování u Applu se objeví v TestFlightu. V App Store Connect pak vyplň záznam aplikace, vyber tenhle build ve verzi a klikni na „Add for Review“ a „Submit for Review“.
Posílá EAS Submit moji appku ke kontrole u Applu?
Ne. EAS Submit pošle binárku do App Store Connect a build se objeví v TestFlightu. Odeslání ke kontrole uděláš ručně v App Store Connect, až budeš mít vyplněný záznam a vybraný build.
Kde najdu ascAppId své appky?
V App Store Connect otevři svou appku a pak App Information. Je to pole Apple ID v sekci General Information. Je to číslo, nepleť si ho se svým bundle identifierem.
Potřebuju Apple ID, abych mohl používat eas submit?
Při prvním spuštění se tě na něj příkaz zeptá. Potom, s ascAppId v profilu a API klíčem App Store Connect, může běžet bez interakce, i v CI. API klíč je výchozí a Expem doporučená metoda.
Jak dlouho trvá, než uvidím build v TestFlightu?
Expo obvykle mluví o 10 až 15 minutách zpracování u Applu, který ti na konci pošle e-mail. Pokud build zůstane ve stavu Missing Compliance, odpověz na otázky o šifrování a pak ho pro další buildy deklaruj ve své konfiguraci.