EAS Submit iOS: udgiv en Expo-app på App Store
Af Mehdi Azizi
Udgivet , 8 min.
EAS Submit sender dit iOS-build til App Store Connect og TestFlight. Indsendelsen til review sker stadig i App Store Connect. Her er eas.json og typiske fejl.
eas submit --platform ios sender dit iOS-build til App Store Connect, hvor det dukker op i TestFlight, når Apple har behandlet det. Kommandoen indsender ikke din app til Apples review: valget af build og indsendelsen til review skal du stadig selv klare i App Store Connect. Vil du automatisere det, skal den bruge nummeret på din app-side (ascAppId) og en App Store Connect API-nøgle.
Jeg udgiver mine iOS-apps, blandt andet Solys, TradaZen og Nolera, med Expo, EAS Build og EAS Submit. Denne guide følger Expos dokumentation om iOS-indsendelse, gennemlæst den 25. oktober 2026. Har du ikke en Mac, finder du hele forløbet i udgiv en iOS-app uden Mac. Her fokuserer vi på selve indsendelsen.
Det skal du have klar før første kommando
Expo nævner tre forudsætninger:
- En betalt Apple Developer-konto. Pris og tilmelding finder du i Apple-udviklerkonto.
- En bundle identifier i
ios.bundleIdentifier. Ifølge referencen for Expo-konfigurationen finder du selv på den, men den skal være unik på App Store. - EAS CLI installeret, og derefter
eas loginmed din Expo-konto.
Du skal også have et signeret produktionsbuild. EAS Build laver det med det certifikat og den profil, som den administrerer for dig, som forklaret i iOS-certifikat og provisioning profile.
App-siden i App Store Connect: dig eller EAS?
EAS Submit sender en binærfil til en app, der skal findes i App Store Connect.
Du kan oprette den selv. Apples hjælp beskriver vinduet New App: platform, navn, primært sprog, bundle identifier, SKU og brugeradgang. Det kræver rollen Account Holder, Admin eller App Manager.
EAS kan også oprette den ved første indsendelse. Ifølge Expos side om TestFlight opretter eas submit app-siden, når du sender dit første build. Ifølge referencen for eas.json springes det trin over, hvis du udfylder ascAppId. Navnet kommer fra appName eller, hvis det mangler, fra name i din konfiguration. Det primære sprog kommer fra language, som som standard er en-US. Hvis din app først udkommer på fransk, så udfyld language før den første indsendelse.
Kopiér derefter app-sidens nummer ind i ascAppId. Expo forklarer, hvor du finder det: åbn din app i App Store Connect og gå til App Information. Det er feltet Apple ID under General Information. Det er et tal, ikke din bundle identifier.
Hvorfor en API-nøgle frem for dit Apple-id
EAS Submit forbinder sig til Apple med dit Apple-id eller med en App Store Connect API-nøgle.
Apple-id'et støder på to-faktor-godkendelsen, som Apple kræver af alle App Store Connect-brugere: der skal en person til at bekræfte login. En app-specifik adgangskode, angivet i EXPO_APPLE_APP_SPECIFIC_PASSWORD, undgår det trin, men Expo vurderer den som mindre sikker end API-nøglen, som er Expos standard og anbefalede metode. Nøglen lader dig logge ind helt uden interaktion, og dermed kan du automatisere indsendelsen.
Der er to måder at få den på:
- Lad EAS administrere den. Kør
eas credentials --platform ios, vælg profilenproduction, log ind på din Apple-konto, og vælg "App Store Connect: Manage your API Key". - Brug din egen nøgle. I App Store Connect: Users and Access, fanen Integrations, App Store Connect API, Team Keys og så Generate API Key. Det kræver en Admin-konto, og Expos guide giver nøglen rollen Admin.
I det andet tilfælde skal du notere Key ID, som vises i listen over aktive nøgler, og Issuer ID, øverst på siden Integrations. Og pas især på .p8-filen: du kan kun downloade den én gang, og Apple gemmer ingen kopi.
Ifølge Apple kan en Admin-nøgle oprette og slette brugere på din konto. Apple beder dig om aldrig at lægge nøglen i et kode-repository.
Den minimale eas.json-fil til at kopiere
Alle værdier er fiktive: erstat dem med dine egne.
{
"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"
}
}
}
}
appVersionSourceogautoIncrement: EAS' servere holder styr på build-nummeret og tæller det op ved hvert produktionsbuild. Expo anbefaler denne remote-tilstand siden EAS CLI 12.ascAppId: nummeret på din app-side. Uden det fejler den ikke-interaktive tilstand.appleTeamId: id'et for dit Apple Developer-team.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: din API-nøgle. Alle tre felter accepterer miljøvariabler. Tilføj mappenkeystil din.gitignore.
Feltet appleId bruges kun, hvis du logger ind med dit Apple-id. Hvis EAS allerede administrerer din nøgle, så fjern også de tre ascApiKey-felter. I mine tre apps, gennemgået den 25. oktober, indeholder produktionsprofilen til indsendelse kun ascAppId, plus appleTeamId i Solys: ingen nøgle i filen.
Kør buildet og derefter indsendelsen
eas build --platform ios --profile production
eas submit --platform ios
Uden andre options beder eas submit dig vælge, hvilket build der skal sendes, og ved første kørsel spørger den om dit Apple-id. Indsendelsesprofilen production bruges som standard, hvis den findes. Referencen for EAS CLI viser de options, der springer valget over:
| Option | Hvad den gør |
|---|---|
--latest | Sender det seneste iOS-build |
--id | Sender et bestemt EAS-build |
--path | Sender en lokal .ipa-fil |
--url | Sender et online-arkiv |
--groups | Tilføjer til en intern gruppe |
--what-to-test | Udfylder "What to test" |
Vil du køre det hele i ét hug, så tilføj --auto-submit til build-kommandoen. Ifølge Expos side om automatisk indsendelse sendes det færdige build videre til EAS Submit med den indsendelsesprofil, der hedder det samme som build-profilen. Vil du vælge en anden: --auto-submit-with-profile=navn. Buildet går til TestFlight, ikke til review.
I continuous integration tilføjer du --non-interactive og et EXPO_TOKEN. Kommandoen kan så ikke spørge dig om noget: den skal have ascAppId i profilen og en API-nøgle, enten den EAS har knyttet til appen, eller din egen i de tre ascApiKey-felter.
Hvad der sker efter indsendelsen
1. Apple behandler buildet. Det skal igennem den behandling, før det dukker op i App Store Connect, og Apple sender dig en e-mail, når det er færdigt. Expo nævner typisk 10 til 15 minutter, før du kan se det i TestFlight.
2. Eksportoverholdelse. Statussen Missing Compliance betyder, at din erklæring om kryptering mangler. App Store Connect stiller de spørgsmål ved hver ny version, medmindre Info.plist allerede svarer på dem. Med Expo hedder nøglen ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Ifølge Apple passer false, hvis din app, inklusive biblioteker, ikke bruger nogen kryptering eller kun undtaget kryptering. Systemets kryptering, som HTTPS via URLSession, er det som regel. Erklær kun false, hvis det er sandt for din app: erklæringen forpligter dig. Som alle nøgler i Info.plist kræver den et nyt build.
3. TestFlight. Ved statussen Ready to Submit kan buildet ifølge Apple gå til interne testere, gennemgå beta-review for eksterne testere eller sendes til App Store-review. Feltet groups i profilen tilføjer det til dine interne grupper. Resten finder du i TestFlight til at teste din app.
Indsendelse er ikke det samme som at sende til review
Expo skriver det selv: et TestFlight-build bliver ikke automatisk udgivet på App Store. EAS Submit udfylder hverken din app-side eller dine screenshots. Der er fire trin tilbage i App Store Connect, beskrevet i Apples hjælp om indsendelse til review:
- Udfyld de obligatoriske metadata for versionen.
- Vælg buildet i versionens Build-sektion.
- Klik på "Add for Review". Versionen får status Ready for Review, men intet er sendt til review endnu.
- Klik på "Submit for Review". Statussen skifter til In Review, når reviewet går i gang.
Hyppige fejl og hvordan du retter dem
| Vist fejl | Årsag | Løsning |
|---|---|---|
| ITMS-90189 | Build-nummer allerede brugt | autoIncrement |
| ITMS-90062 eller 90186 | Version allerede lukket | Hæv version |
| "Set ascAppId" | ascAppId mangler i CI | Tilføj ascAppId |
| "API Keys cannot" | Ingen nøgle tilknyttet | eas credentials |
| ITMS-90683 | Purpose string mangler | ios.infoPlist |
| ITMS-91053 | Ufuldstændigt manifest | ios.privacyManifests |
| ITMS-90725 | For gammelt iOS SDK | Opgrader Expo SDK |
| Missing Compliance | Kryptering ikke erklæret | usesNonExemptEncryption |
Ifølge Expo er et build-nummer, der allerede er brugt, en almindelig årsag til afvisning ved indsendelse: alt om det står i build-nummer og version. Tre af fejlene har deres egen guide: ITMS-90683 med Expo, ITMS-91053 med Expo og ITMS-90725.
De to beskeder i anførselstegn kommer fra EAS og rettes i EAS-konfigurationen. Missing Compliance kan også løses ved at besvare spørgsmålene i App Store Connect. For alle de andre linjer rammer rettelsen selve binærfilen: lav et nyt build, og send det igen. En remote-opdatering ændrer hverken Info.plist, manifestet eller numrene.
Send din første app afsted uden at famle
Kommandoen er kun ét trin. iOS Kit tager udgangspunkt i startkoden fra mine apps, abonnementer inklusive, og følger fire trin helt frem til App Store, i dit eget tempo.
Hvis du forbereder din første udgivelse, så tag den gratis diagnose: den fortæller dig, hvad der reelt holder dig tilbage, og sender dig min tjekliste mod afvisninger fra Apple. For app-side, screenshots og godkendelse gennemgår siden udgiv en app på App Store hvert trin.
Ofte stillede spørgsmål
Hvordan udgiver jeg en Expo-app på App Store?
Kør et produktionsbuild med EAS Build, og send det derefter med eas submit --platform ios. Når Apple har behandlet det, dukker det op i TestFlight. I App Store Connect udfylder du så app-siden, vælger buildet i versionen og klikker på "Add for Review" og "Submit for Review".
Sender EAS Submit min app til review hos Apple?
Nej. EAS Submit sender binærfilen til App Store Connect, og buildet lander i TestFlight. Indsendelsen til review sker manuelt i App Store Connect, når app-siden er udfyldt og buildet valgt.
Hvor finder jeg min apps ascAppId?
Åbn din app i App Store Connect, og gå til App Information. Det er feltet Apple ID under General Information. Det er et tal, som ikke må forveksles med din bundle identifier.
Skal jeg bruge et Apple-id for at bruge eas submit?
Ved første kørsel spørger kommandoen om det. Derefter kan den, med ascAppId i profilen og en App Store Connect API-nøgle, køre uden interaktion, også i continuous integration. API-nøglen er Expos standard og anbefalede metode.
Hvor lang tid går der, før buildet kan ses i TestFlight?
Expo nævner typisk 10 til 15 minutters behandling hos Apple, som sender dig en e-mail, når det er færdigt. Hvis buildet bliver stående med statussen Missing Compliance, så besvar spørgsmålene om kryptering, og erklær det derefter i din konfiguration til de næste builds.