EAS Submit iOS: objava Expo aplikacije na App Store
Autor: Mehdi Azizi
Objavljeno , 8 min
EAS Submit šalje tvoj iOS build u App Store Connect, gdje stiže u TestFlight. Slanje na reviziju i dalje radiš sam u App Store Connectu.
eas submit --platform ios šalje tvoj iOS build u App Store Connect, gdje se pojavljuje u TestFlightu nakon što ga Apple obradi. Naredba ne šalje tvoju aplikaciju na Appleovu reviziju: odabir builda i slanje na reviziju i dalje radiš u App Store Connectu. Da bi to automatizirao, treba joj broj tvoje aplikacije (ascAppId) i App Store Connect API ključ.
Svoje iOS aplikacije, među njima Solys, TradaZen i Nolera, objavljujem s Expo, EAS Build i EAS Submit. Ovaj vodič prati Expovu dokumentaciju o slanju za iOS, provjerenu 25. listopada 2026. Ako nemaš Mac, cijeli put je u objavi iOS aplikacije bez Maca. Ovdje se bavimo samo slanjem.
Što ti treba prije prve naredbe
Expo navodi tri preduvjeta:
- Plaćeni Apple Developer račun. Cijena i registracija su u Apple developer računu.
- Bundle identifier u
ios.bundleIdentifier. Prema referenci Expo konfiguracije, sam ga smišljaš, ali mora biti jedinstven na App Storeu. - Instaliran EAS CLI, pa
eas loginsa svojim Expo računom.
Treba ti i potpisani produkcijski build. EAS Build ga radi s certifikatom i profilom kojima upravlja umjesto tebe, kako objašnjava iOS certifikat i provisioning profile.
Zapis u App Store Connectu: ti ili EAS?
EAS Submit šalje binarnu datoteku aplikaciji koja mora postojati u App Store Connectu.
Možeš je sam napraviti. Appleova pomoć opisuje prozor New App: platforma, naziv, primarni jezik, bundle identifier, SKU i pristup korisnika. Treba ti uloga Account Holder, Admin ili App Manager.
EAS je može napraviti i pri prvom slanju. Prema Expovoj stranici o TestFlightu, eas submit stvara zapis kad pošalješ svoj prvi build. Prema referenci za eas.json, ako upišeš ascAppId, taj se korak preskače. Naziv dolazi iz appName, a ako njega nema, iz name tvoje konfiguracije. Primarni jezik dolazi iz language, koji je prema zadanim postavkama en-US. Ako ti aplikacija prvo izlazi na hrvatskom, upiši language prije tog prvog slanja.
Zatim prepiši broj aplikacije u ascAppId. Expo kaže gdje ga naći: otvori aplikaciju u App Store Connectu, pa App Information. To je polje Apple ID, pod General Information. To je broj, a ne tvoj bundle identifier.
Zašto API ključ, a ne Apple ID
EAS Submit se spaja na Apple tvojim Apple ID-jem ili App Store Connect API ključem.
Apple ID zapinje na dvofaktorskoj autentifikaciji, koju Apple zahtijeva od svih korisnika App Store Connecta: netko mora potvrditi prijavu. Lozinka za aplikaciju, proslijeđena u EXPO_APPLE_APP_SPECIFIC_PASSWORD, zaobilazi taj korak, ali Expo je smatra manje sigurnom od API ključa, koji mu je zadana i preporučena metoda. Ključ omogućuje autentifikaciju bez ikakve interakcije, pa tako i automatizaciju slanja.
Dva načina da ga dobiješ:
- Neka njime upravlja EAS. Pokreni
eas credentials --platform ios, odaberi profilproduction, prijavi se na Apple račun, pa odaberi "App Store Connect: Manage your API Key". - Donesi vlastiti ključ. U App Store Connectu: Users and Access, kartica Integrations, App Store Connect API, Team Keys, pa Generate API Key. Treba ti Admin račun, a Expov vodič ključu daje ulogu Admin.
U drugom slučaju zapiši Key ID, prikazan na popisu aktivnih ključeva, i Issuer ID, na vrhu stranice Integrations. Najvažnije, sačuvaj .p8 datoteku: možeš je preuzeti samo jednom, a Apple ne čuva kopiju.
Admin ključ, prema Appleu, može stvarati i brisati korisnike tvog računa. Apple traži da ključ nikad ne spremaš u repozitorij koda.
Minimalni eas.json za kopiranje
Sve su vrijednosti izmišljene: zamijeni ih svojima.
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890",
"appleTeamId": "ABCDE12345",
"ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
"ascApiKeyIssuerId": "tvoj-issuer-id",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}
appVersionSourceiautoIncrement: EAS serveri čuvaju broj builda i povećavaju ga pri svakom produkcijskom buildu. Expo preporučuje ovaj udaljeni način od EAS CLI 12.ascAppId: broj tvoje aplikacije. Bez njega neinteraktivni način ne uspijeva.appleTeamId: identifikator tvog Apple Developer tima.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: tvoj API ključ. Sva tri polja prihvaćaju varijable okruženja. Dodaj mapukeysu svoj.gitignore.
Polje appleId treba ti samo ako se prijavljuješ Apple ID-jem. Ako EAS već upravlja tvojim ključem, makni i tri polja ascApiKey. U moje tri aplikacije, provjerene 25. listopada, produkcijski profil za slanje sadrži samo ascAppId, plus appleTeamId kod Solysa: nijednog ključa u datoteci.
Pokreni build, pa slanje
eas build --platform ios --profile production
eas submit --platform ios
Bez drugih opcija, eas submit te pita koji build poslati i, pri prvom pokretanju, traži tvoj Apple ID. Profil za slanje production uzima se prema zadanim postavkama ako postoji. Referenca EAS CLI-ja navodi opcije koje preskaču odabir:
| Opcija | Što radi |
|---|---|
--latest | Šalje zadnji iOS build |
--id | Šalje određeni EAS build |
--path | Šalje lokalnu .ipa datoteku |
--url | Šalje arhivu s interneta |
--groups | Dodaje u internu grupu |
--what-to-test | Popunjava "What to test" |
Da sve ide u jednom potezu, dodaj --auto-submit naredbi za build. Prema Expovoj stranici o automatskom slanju, gotov build ide u EAS Submit s profilom za slanje istog imena kao profil builda. Za neki drugi: --auto-submit-with-profile=ime. Build ide u TestFlight, ne na reviziju.
U kontinuiranoj integraciji dodaj --non-interactive i token EXPO_TOKEN. Naredba te tada ne može ništa pitati: treba joj ascAppId u profilu i API ključ, onaj koji je EAS povezao s aplikacijom ili tvoj u tri polja ascApiKey.
Što se događa nakon slanja
1. Apple obrađuje build. Mora proći tu obradu prije nego što se pojavi u App Store Connectu, a Apple ti na kraju šalje e-mail. Expo obično spominje 10 do 15 minuta dok ga ne vidiš u TestFlightu.
2. Izvozna usklađenost. Status Missing Compliance znači da nedostaje tvoja izjava o enkripciji. App Store Connect postavlja ta pitanja za svaku novu verziju, osim ako Info.plist već odgovara na njih. U Expu se ključ zove ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Prema Appleu, false odgovara ako tvoja aplikacija, uključujući biblioteke, ne koristi nikakvu enkripciju ili samo izuzetu enkripciju. Enkripcija sustava, poput HTTPS-a preko URLSessiona, obično je izuzeta. Upiši false samo ako to stvarno vrijedi za tvoju aplikaciju: izjava te obvezuje. Kao i svaki ključ u Info.plistu, traži novi build.
3. TestFlight. Sa statusom Ready to Submit, prema Appleu, build može ići internim testerima, proći beta reviziju za vanjske ili otići na App Store reviziju. Polje groups u profilu dodaje ga u tvoje interne grupe. Sve ostalo je u TestFlightu za testiranje aplikacije.
Slanje nije predaja na reviziju
Expo to piše: TestFlight build se ne objavljuje automatski na App Storeu. EAS Submit ne popunjava ni stranicu aplikacije ni snimke zaslona. U App Store Connectu ostaju četiri koraka, opisana u Appleovoj pomoći o slanju na reviziju:
- Popuni obavezne metapodatke verzije.
- Odaberi build u odjeljku Build verzije.
- Klikni "Add for Review". Verzija prelazi u Ready for Review, ali još ništa nije otišlo na reviziju.
- Klikni "Submit for Review". Status prelazi u In Review kad revizija počne.
Česte greške i kako ih ispraviti
| Prikazana greška | Uzrok | Ispravak |
|---|---|---|
| ITMS-90189 | Broj builda već zauzet | autoIncrement |
| ITMS-90062 ili 90186 | Verzija već zatvorena | Povećaj version |
| "Set ascAppId" | Nema ascAppId u CI-ju | Dodaj ascAppId |
| "API Keys cannot" | Nijedan ključ nije povezan | eas credentials |
| ITMS-90683 | Nedostaje purpose string | ios.infoPlist |
| ITMS-91053 | Nepotpun manifest | ios.privacyManifests |
| ITMS-90725 | Prestar iOS SDK | Povećaj Expo SDK |
| Missing Compliance | Enkripcija nije prijavljena | usesNonExemptEncryption |
Prema Expu, već iskorišten broj builda čest je razlog odbijanja pri slanju: sve je u broju builda i verziji. Tri greške imaju vlastiti vodič: ITMS-90683 s Expom, ITMS-91053 s Expom i ITMS-90725.
Dvije poruke pod navodnicima dolaze od EAS-a i ispravljaju se u njegovoj konfiguraciji. Missing Compliance rješavaš i odgovorima na pitanja u App Store Connectu. Za sve ostale retke ispravak dira binarnu datoteku: napravi novi build, pa ga ponovno pošalji. Ažuriranje na daljinu ne mijenja ni Info.plist, ni manifest, ni brojeve.
Pošalji svoju prvu aplikaciju bez lutanja
Naredba je samo jedan korak. iOS Kit kreće od početnog koda mojih aplikacija, uključujući pretplate, i vodi te kroz četiri koraka do App Storea, tvojim tempom.
Ako pripremaš svoje prvo izdanje, napravi besplatnu dijagnostiku: reći će ti što te stvarno koči i poslati ti moju checklistu protiv Appleovih odbijanja. Za stranicu aplikacije, snimke zaslona i odobrenje, stranica objava aplikacije na App Store pokriva svaki korak.
Česta pitanja
Kako objaviti Expo aplikaciju na App Store?
Pokreni produkcijski build s EAS Buildom, pa ga pošalji s eas submit --platform ios. Nakon Appleove obrade pojavljuje se u TestFlightu. U App Store Connectu zatim popuni stranicu aplikacije, odaberi taj build u verziji, pa klikni "Add for Review" i "Submit for Review".
Šalje li EAS Submit moju aplikaciju na Appleovu reviziju?
Ne. EAS Submit šalje binarnu datoteku u App Store Connect, a build stiže u TestFlight. Slanje na reviziju radiš ručno u App Store Connectu, kad popuniš stranicu aplikacije i odabereš build.
Gdje naći ascAppId svoje aplikacije?
U App Store Connectu otvori aplikaciju, pa App Information. To je polje Apple ID, pod General Information. To je broj, nemoj ga brkati sa svojim bundle identifierom.
Treba li mi Apple ID za eas submit?
Pri prvom pokretanju naredba ga traži. Poslije, s ascAppId u profilu i App Store Connect API ključem, može raditi bez interakcije, čak i u kontinuiranoj integraciji. API ključ je Expova zadana i preporučena metoda.
Koliko treba da se build pojavi u TestFlightu?
Expo obično spominje 10 do 15 minuta obrade kod Applea, koji ti na kraju šalje e-mail. Ako build ostane u statusu Missing Compliance, odgovori na pitanja o enkripciji, pa je prijavi u konfiguraciji za sljedeće buildove.