EAS Submit iOS: publicera en Expo-app på App Store
Av Mehdi Azizi
Publicerad , 8 min
EAS Submit skickar ditt iOS-bygge till App Store Connect, där det hamnar i TestFlight. Granskningen skickar du själv. Plus eas.json att kopiera och vanliga fel.
eas submit --platform ios skickar ditt iOS-bygge till App Store Connect, där det dyker upp i TestFlight när Apple har bearbetat det. Kommandot skickar inte in din app för Apples granskning: att välja bygge och skicka till granskning gör du själv i App Store Connect. För att automatisera det behöver kommandot numret på din app-post (ascAppId) och en API-nyckel för App Store Connect.
Jag publicerar mina iOS-appar, bland annat Solys, TradaZen och Nolera, med Expo, EAS Build och EAS Submit. Den här guiden följer Expos dokumentation om iOS-uppladdning, genomläst den 25 oktober 2026. Utan Mac hittar du hela vägen i publicera en iOS-app utan Mac. Här fokuserar vi på uppladdningen.
Det här behöver du före första kommandot
Expo listar tre krav:
- Ett betalt Apple Developer-konto. Pris och registrering hittar du i Apple-utvecklarkonto.
- Ett bundle-ID i
ios.bundleIdentifier. Enligt referensen för Expos konfiguration hittar du på det själv, men det måste vara unikt på App Store. - EAS CLI installerat, och sedan
eas loginmed ditt Expo-konto.
Du behöver också ett signerat produktionsbygge. EAS Build skapar det med certifikatet och profilen som det hanterar åt dig, som förklaras i iOS-certifikat och provisioning profile.
App-posten i App Store Connect: du eller EAS?
EAS Submit skickar en binärfil till en app som måste finnas i App Store Connect.
Du kan skapa den själv. Apples hjälp beskriver fönstret New App: plattform, namn, primärt språk, bundle-ID, SKU och användaråtkomst. Du behöver rollen Account Holder, Admin eller App Manager.
EAS kan också skapa den vid första uppladdningen. Enligt Expos sida om TestFlight skapar eas submit posten när du skickar ditt första bygge. Enligt referensen för eas.json hoppas det steget över om du anger ascAppId. Namnet kommer från appName, annars från name i din konfiguration. Det primära språket kommer från language, som är en-US som standard. Om din app först släpps på franska, ange language före den första uppladdningen.
Kopiera sedan postens nummer till ascAppId. Expo visar var du hittar det: öppna din app i App Store Connect, sedan App Information. Det är fältet Apple ID, under General Information. Det är ett nummer, inte ditt bundle-ID.
Varför en API-nyckel i stället för ditt Apple-ID
EAS Submit loggar in hos Apple med ditt Apple-ID eller med en API-nyckel för App Store Connect.
Apple-ID:t stöter på tvåfaktorsautentiseringen, som Apple kräver av alla App Store Connect-användare: en människa måste bekräfta inloggningen. Ett appspecifikt lösenord, som skickas i EXPO_APPLE_APP_SPECIFIC_PASSWORD, slipper det steget, men Expo anser att det är mindre säkert än API-nyckeln, som är standardmetoden och den rekommenderade. Med nyckeln kan du autentisera dig helt utan interaktion, och därmed automatisera uppladdningen.
Två sätt att få den:
- Låt EAS hantera den. Kör
eas credentials --platform ios, välj profilenproduction, logga in på ditt Apple-konto och välj sedan "App Store Connect: Manage your API Key". - Ta med din egen nyckel. I App Store Connect: Users and Access, fliken Integrations, App Store Connect API, Team Keys, sedan Generate API Key. Du behöver ett Admin-konto, och Expos guide ger nyckeln rollen Admin.
I det andra fallet, anteckna Key ID, som visas i listan över aktiva nycklar, och Issuer ID, högst upp på sidan Integrations. Spara framför allt filen .p8: du kan bara ladda ner den en gång, och Apple sparar ingen kopia.
En Admin-nyckel kan enligt Apple skapa och ta bort användare i ditt konto. Apple säger att du aldrig ska lägga nyckeln i ett kodrepo.
Den minimala eas.json-filen att kopiera
Alla värden är påhittade: byt ut dem mot dina egna.
{
"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"
}
}
}
}
appVersionSourceochautoIncrement: EAS servrar håller byggnumret och räknar upp det vid varje produktionsbygge. Expo rekommenderar det här fjärrläget sedan EAS CLI 12.ascAppId: numret på din app-post. Utan det misslyckas det icke-interaktiva läget.appleTeamId: ID:t för ditt Apple Developer-team.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: din API-nyckel. Alla tre fälten accepterar miljövariabler. Lägg till mappenkeysi din.gitignore.
Fältet appleId behövs bara om du loggar in med ditt Apple-ID. Om EAS redan hanterar din nyckel, ta också bort de tre ascApiKey-fälten. I mina tre appar, som jag gick igenom den 25 oktober, innehåller produktionsprofilen för uppladdning bara ascAppId, plus appleTeamId i Solys: ingen nyckel i filen.
Kör bygget och sedan uppladdningen
eas build --platform ios --profile production
eas submit --platform ios
Utan andra flaggor låter eas submit dig välja vilket bygge som ska skickas, och första gången frågar den efter ditt Apple-ID. Uppladdningsprofilen production används som standard om den finns. Referensen för EAS CLI listar flaggorna som slipper valet:
| Flagga | Vad den gör |
|---|---|
--latest | Skickar senaste iOS-bygget |
--id | Skickar ett visst EAS-bygge |
--path | Skickar en lokal .ipa-fil |
--url | Skickar ett arkiv från nätet |
--groups | Lägger till i en intern grupp |
--what-to-test | Fyller i "What to test" |
För att köra allt i ett svep, lägg till --auto-submit i byggkommandot. Enligt Expos sida om automatisk uppladdning skickas det färdiga bygget till EAS Submit med den uppladdningsprofil som heter samma sak som byggprofilen. För att välja en annan: --auto-submit-with-profile=namn. Bygget går till TestFlight, inte till granskning.
I CI lägger du till --non-interactive och en EXPO_TOKEN-token. Kommandot kan då inte fråga dig något: det behöver ascAppId i profilen och en API-nyckel, antingen den som EAS kopplat till appen eller din egen i de tre ascApiKey-fälten.
Vad som händer efter uppladdningen
1. Apple bearbetar bygget. Det måste gå igenom bearbetningen innan det syns i App Store Connect, och Apple skickar ett mejl när det är klart. Expo talar oftast om 10 till 15 minuter innan du ser det i TestFlight.
2. Exportefterlevnad. Statusen Missing Compliance betyder att din deklaration om kryptering saknas. App Store Connect ställer frågorna för varje ny version, om inte Info.plist redan svarar på dem. Med Expo heter nyckeln ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Enligt Apple passar false om din app, inklusive bibliotek, inte använder någon kryptering eller bara undantagen kryptering. Systemets kryptering, som HTTPS via URLSession, är oftast undantagen. Ange bara false om det stämmer för din app: deklarationen är bindande. Som alla nycklar i Info.plist kräver den ett nytt bygge.
3. TestFlight. Med statusen Ready to Submit kan bygget, enligt Apple, gå till interna testare, gå igenom betagranskningen för externa, eller skickas till App Store-granskning. Fältet groups i profilen lägger till det i dina interna grupper. Allt annat finns i TestFlight för att testa din app.
Uppladdning är inte detsamma som att skicka till granskning
Expo skriver det: ett TestFlight-bygge publiceras inte automatiskt på App Store. EAS Submit fyller inte i din app-sida eller dina skärmbilder. Det återstår fyra steg i App Store Connect, beskrivna i Apples hjälp om att skicka till granskning:
- Fyll i de obligatoriska metadata för versionen.
- Välj bygget i versionens Build-sektion.
- Klicka på "Add for Review". Versionen får statusen Ready for Review, men inget har skickats till granskning än.
- Klicka på "Submit for Review". Statusen blir In Review när granskningen börjar.
Vanliga fel och hur du rättar dem
| Felmeddelande | Orsak | Lösning |
|---|---|---|
| ITMS-90189 | Byggnumret redan använt | autoIncrement |
| ITMS-90062 eller 90186 | Versionen redan stängd | Höj version |
| "Set ascAppId" | ascAppId saknas i CI | Lägg till ascAppId |
| "API Keys cannot" | Ingen nyckel kopplad | eas credentials |
| ITMS-90683 | Användningstext saknas | ios.infoPlist |
| ITMS-91053 | Ofullständigt manifest | ios.privacyManifests |
| ITMS-90725 | För gammalt iOS SDK | Höj Expo SDK |
| Missing Compliance | Kryptering ej deklarerad | usesNonExemptEncryption |
Enligt Expo är ett redan använt byggnummer en vanlig orsak till att uppladdningen nekas: allt finns i byggnummer och version. Tre fel har en egen guide: ITMS-90683 med Expo, ITMS-91053 med Expo och ITMS-90725.
De två meddelandena inom citattecken kommer från EAS och rättas i dess konfiguration. Missing Compliance går också att lösa genom att svara på frågorna i App Store Connect. För alla andra rader påverkar rättningen binärfilen: bygg om och skicka igen. En fjärruppdatering ändrar varken Info.plist, manifestet eller numren.
Skicka din första app utan att famla
Kommandot är bara ett steg. iOS Kit utgår från startkoden för mina appar, prenumerationer inräknade, och följer fyra steg ända till App Store, i din egen takt.
Om du förbereder din första release, gör din kostnadsfria diagnos: den visar vad som verkligen stoppar dig och skickar dig min checklista mot avslag från Apple. För app-sidan, skärmbilderna och godkännandet täcker sidan publicera en app på App Store varje steg.
Vanliga frågor
Hur publicerar jag en Expo-app på App Store?
Kör ett produktionsbygge med EAS Build och skicka det sedan med eas submit --platform ios. När Apple har bearbetat det syns det i TestFlight. I App Store Connect fyller du sedan i app-sidan, väljer bygget i versionen och klickar på "Add for Review" och "Submit for Review".
Skickar EAS Submit min app till Apples granskning?
Nej. EAS Submit skickar binärfilen till App Store Connect, och bygget hamnar i TestFlight. Att skicka till granskning gör du manuellt i App Store Connect, när app-sidan är ifylld och bygget valt.
Var hittar jag min apps ascAppId?
Öppna din app i App Store Connect, sedan App Information. Det är fältet Apple ID, under General Information. Det är ett nummer och ska inte förväxlas med ditt bundle-ID.
Behöver jag ett Apple-ID för att använda eas submit?
Första gången frågar kommandot efter det. Därefter, med ascAppId i profilen och en API-nyckel för App Store Connect, kan det köras utan interaktion, även i CI. API-nyckeln är Expos standardmetod och den rekommenderade.
Hur lång tid tar det innan bygget syns i TestFlight?
Expo talar oftast om 10 till 15 minuters bearbetning hos Apple, som skickar ett mejl när det är klart. Om bygget fastnar på statusen Missing Compliance, svara på frågorna om kryptering och deklarera det sedan i din konfiguration för kommande byggen.