EAS Submit iOS: publicarea unei aplicații Expo pe App Store
De Mehdi Azizi
Publicat pe , 8 min.
EAS Submit trimite build-ul iOS în App Store Connect, unde apare în TestFlight. Trimiterea la review o faci tu în App Store Connect.
eas submit --platform ios trimite build-ul tău iOS în App Store Connect, unde apare în TestFlight după ce Apple îl procesează. Comanda nu trimite aplicația la review-ul Apple: alegerea build-ului și trimiterea la review le faci tot tu, în App Store Connect. Ca s-o automatizezi, are nevoie de numărul fișei aplicației (ascAppId) și de o cheie API App Store Connect.
Îmi public aplicațiile iOS, printre care Solys, TradaZen și Nolera, cu Expo, EAS Build și EAS Submit. Ghidul ăsta urmează documentația Expo despre trimiterea pe iOS, recitită pe 25 octombrie 2026. Dacă n-ai Mac, tot parcursul e în publicarea unei aplicații iOS fără Mac. Aici ne concentrăm pe trimitere.
Ce-ți trebuie înainte de prima comandă
Expo enumeră trei condiții:
- Un cont Apple Developer plătit. Prețul și înscrierea sunt în contul de dezvoltator Apple.
- Un bundle identifier în
ios.bundleIdentifier. Conform referinței configurației Expo, îl inventezi tu, dar trebuie să fie unic pe App Store. - EAS CLI instalat, apoi
eas logincu contul tău Expo.
Îți mai trebuie și un build de producție semnat. EAS Build îl face cu certificatul și profilul pe care le gestionează pentru tine, cum explic în certificat și provisioning profile iOS.
Fișa din App Store Connect: o creezi tu sau EAS?
EAS Submit trimite un binar către o aplicație care trebuie să existe deja în App Store Connect.
Poți s-o creezi singur. Ajutorul Apple descrie fereastra New App: platformă, nume, limbă principală, bundle identifier, SKU și accesul utilizatorilor. Ai nevoie de rolul Account Holder, Admin sau App Manager.
Poate s-o creeze și EAS la prima trimitere. Conform paginii Expo despre TestFlight, eas submit creează fișa când trimiți primul build. Conform referinței eas.json, dacă completezi ascAppId, pasul ăsta e sărit. Numele vine din appName sau, dacă lipsește, din name-ul din configurație. Limba principală vine din language, care e implicit en-US. Dacă aplicația ta iese întâi în franceză, completează language înainte de prima trimitere.
Apoi copiază numărul fișei în ascAppId. Expo îți spune unde-l găsești: deschide aplicația în App Store Connect, apoi App Information. E câmpul Apple ID, sub General Information. E un număr, nu bundle identifier-ul tău.
De ce o cheie API și nu Apple ID-ul tău
EAS Submit se conectează la Apple cu Apple ID-ul tău sau cu o cheie API App Store Connect.
Apple ID-ul se lovește de autentificarea în doi pași, pe care Apple o cere tuturor utilizatorilor App Store Connect: e nevoie de un om care să confirme conectarea. Parola specifică aplicației, pusă în EXPO_APPLE_APP_SPECIFIC_PASSWORD, ocolește pasul ăsta, dar Expo o consideră mai puțin sigură decât cheia API, metoda lor implicită și recomandată. Cheia permite autentificarea fără nicio interacțiune, deci poți automatiza trimiterea.
Două căi ca s-o obții:
- Lasă EAS s-o gestioneze. Rulează
eas credentials --platform ios, alege profilulproduction, conectează-te la contul Apple, apoi alege „App Store Connect: Manage your API Key". - Adu-ți propria cheie. În App Store Connect: Users and Access, tabul Integrations, App Store Connect API, Team Keys, apoi Generate API Key. Ai nevoie de un cont Admin, iar ghidul Expo îi dă cheii rolul Admin.
În al doilea caz, notează Key ID-ul, afișat în lista cheilor active, și Issuer ID-ul, sus pe pagina Integrations. Și mai ales păstrează fișierul .p8: îl poți descărca o singură dată, iar Apple nu păstrează nicio copie.
O cheie Admin poate, conform Apple, să creeze și să șteargă utilizatori din contul tău. Apple cere să nu pui niciodată cheia într-un repository de cod.
Fișierul eas.json minimal de copiat
Toate valorile sunt fictive: înlocuiește-le cu ale tale.
{
"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"
}
}
}
}
appVersionSourceșiautoIncrement: serverele EAS păstrează numărul de build și îl cresc la fiecare build de producție. Expo recomandă acest mod remote începând cu EAS CLI 12.ascAppId: numărul fișei tale. Fără el, modul non-interactiv eșuează.appleTeamId: identificatorul echipei tale Apple Developer.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: cheia ta API. Toate trei acceptă variabile de mediu. Adaugă folderulkeysîn.gitignore.
Câmpul appleId contează doar dacă te conectezi cu Apple ID-ul. Dacă EAS îți gestionează deja cheia, scoate și cele trei câmpuri ascApiKey. La cele trei aplicații ale mele, verificate pe 25 octombrie, profilul de trimitere de producție conține doar ascAppId, plus appleTeamId la Solys: nicio cheie în fișier.
Pornești build-ul, apoi trimiterea
eas build --platform ios --profile production
eas submit --platform ios
Fără alte opțiuni, eas submit te pune să alegi build-ul de trimis și, la prima rulare, îți cere Apple ID-ul. Profilul de trimitere production e folosit implicit dacă există. Referința EAS CLI listează opțiunile care te scutesc de alegere:
| Opțiune | Ce face |
|---|---|
--latest | Trimite ultimul build iOS |
--id | Trimite un anumit build EAS |
--path | Trimite un fișier .ipa local |
--url | Trimite o arhivă online |
--groups | Adaugă într-un grup intern |
--what-to-test | Completează „What to test" |
Ca să legi totul, adaugă --auto-submit la comanda de build. Conform paginii Expo despre trimiterea automată, build-ul terminat pleacă spre EAS Submit cu profilul de trimitere care are același nume ca profilul de build. Ca să alegi altul: --auto-submit-with-profile=nume. Build-ul pleacă în TestFlight, nu la review.
În integrare continuă, adaugă --non-interactive și un token EXPO_TOKEN. Comanda nu te mai poate întreba nimic: are nevoie de ascAppId în profil și de o cheie API, fie cea atașată aplicației de EAS, fie a ta în cele trei câmpuri ascApiKey.
Ce se întâmplă după trimitere
1. Apple procesează build-ul. Trebuie să treacă prin procesarea asta înainte să apară în App Store Connect, iar Apple îți trimite un e-mail la final. Expo vorbește de obicei de 10 până la 15 minute până îl vezi în TestFlight.
2. Conformitatea la export. Statusul Missing Compliance înseamnă că lipsește declarația ta despre criptare. App Store Connect pune întrebările astea la fiecare versiune nouă, dacă Info.plist nu le răspunde deja. Cu Expo, cheia se numește ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Conform Apple, false e potrivit dacă aplicația ta, inclusiv bibliotecile, nu folosește deloc criptare sau doar criptare scutită. Criptarea sistemului, cum e HTTPS prin URLSession, e în general scutită. Declară false doar dacă e adevărat pentru aplicația ta: declarația te angajează. Ca orice cheie din Info.plist, cere un build nou.
3. TestFlight. La statusul Ready to Submit, conform Apple, build-ul poate merge la testerii interni, poate trece prin review-ul beta pentru cei externi sau poate pleca la review-ul App Store. Câmpul groups din profil îl adaugă în grupurile tale interne. Restul e în TestFlight pentru testarea aplicației.
Trimiterea nu e același lucru cu trimiterea la review
Expo o spune: un build TestFlight nu e publicat automat pe App Store. EAS Submit nu-ți completează nici fișa, nici capturile de ecran. Mai ai patru pași în App Store Connect, descriși în ajutorul Apple despre trimiterea la review:
- Completează metadatele obligatorii ale versiunii.
- Alege build-ul în secțiunea Build a versiunii.
- Apasă „Add for Review". Versiunea trece în Ready for Review, dar încă n-a plecat nimic la review.
- Apasă „Submit for Review". Statusul trece în In Review când începe review-ul.
Erorile frecvente și cum le repari
| Eroare afișată | Cauză | Reparație |
|---|---|---|
| ITMS-90189 | Număr de build deja folosit | autoIncrement |
| ITMS-90062 sau 90186 | Versiune deja închisă | Crește version |
| „Set ascAppId" | ascAppId lipsă în CI | Adaugă ascAppId |
| „API Keys cannot" | Nicio cheie atașată | eas credentials |
| ITMS-90683 | Lipsește textul de justificare | ios.infoPlist |
| ITMS-91053 | Manifest incomplet | ios.privacyManifests |
| ITMS-90725 | SDK iOS prea vechi | Crește SDK-ul Expo |
| Missing Compliance | Criptare nedeclarată | usesNonExemptEncryption |
Conform Expo, numărul de build deja folosit e o cauză des întâlnită de respingere la trimitere: totul e în numărul de build și versiunea. Trei erori au propriul ghid: ITMS-90683 cu Expo, ITMS-91053 cu Expo și ITMS-90725.
Cele două mesaje între ghilimele vin de la EAS și se repară în configurația lui. Missing Compliance se rezolvă și răspunzând la întrebări în App Store Connect. Pentru toate celelalte rânduri, reparația atinge binarul: fă un build nou, apoi retrimite-l. O actualizare la distanță nu schimbă nici Info.plist, nici manifestul, nici numerele.
Trimite-ți prima aplicație fără să bâjbâi
Comanda e doar un pas. iOS Kit pornește de la codul de bază al aplicațiilor mele, cu abonamente cu tot, și te duce în patru pași până pe App Store, în ritmul tău.
Dacă pregătești prima lansare, fă-ți diagnosticul gratuit: îți spune ce te blochează de fapt și îți trimite checklist-ul meu anti-respingere Apple. Pentru fișă, capturi și validare, pagina publicarea unei aplicații pe App Store acoperă fiecare pas.
Întrebări frecvente
Cum public o aplicație Expo pe App Store?
Pornește un build de producție cu EAS Build, apoi trimite-l cu eas submit --platform ios. După procesarea Apple, apare în TestFlight. Apoi, în App Store Connect, completează fișa, alege build-ul în versiune și apasă „Add for Review" și „Submit for Review".
EAS Submit îmi trimite aplicația la review-ul Apple?
Nu. EAS Submit trimite binarul în App Store Connect, iar build-ul ajunge în TestFlight. Trimiterea la review o faci manual în App Store Connect, după ce ai completat fișa și ai ales build-ul.
Unde găsesc ascAppId-ul aplicației mele?
În App Store Connect, deschide aplicația, apoi App Information. E câmpul Apple ID, sub General Information. E un număr, nu-l confunda cu bundle identifier-ul.
Am nevoie de Apple ID ca să folosesc eas submit?
La prima rulare, comanda ți-l cere. După aceea, cu ascAppId în profil și o cheie API App Store Connect, poate rula fără interacțiune, chiar și în integrare continuă. Cheia API e metoda implicită și recomandată de Expo.
Cât durează până văd build-ul în TestFlight?
Expo vorbește de obicei de 10 până la 15 minute de procesare la Apple, care îți trimite un e-mail la final. Dacă build-ul rămâne în statusul Missing Compliance, răspunde la întrebările despre criptare, apoi declar-o în configurație pentru build-urile următoare.