EAS Submit iOS: Expo-App im App Store veröffentlichen
Von Mehdi Azizi
Veröffentlicht am , 8 Min.
EAS Submit schickt deinen iOS-Build an App Store Connect, wo er in TestFlight landet. Die Einreichung zur Prüfung machst du selbst in App Store Connect.
eas submit --platform ios schickt deinen iOS-Build an App Store Connect, wo er nach der Verarbeitung durch Apple in TestFlight erscheint. Der Befehl reicht deine App nicht zur Prüfung bei Apple ein: Build auswählen und zur Prüfung einreichen musst du weiterhin selbst in App Store Connect. Um das Hochladen zu automatisieren, braucht er die Nummer deines App-Eintrags (ascAppId) und einen App Store Connect API-Schlüssel.
Ich veröffentliche meine iOS-Apps, darunter Solys, TradaZen und Nolera, mit Expo, EAS Build und EAS Submit. Dieser Guide folgt der Expo-Dokumentation zum iOS-Upload, geprüft am 25. Oktober 2026. Ohne Mac findest du den kompletten Ablauf in iOS-App ohne Mac veröffentlichen. Hier geht es nur um den Upload.
Was du vor dem ersten Befehl brauchst
Expo nennt drei Voraussetzungen:
- Ein kostenpflichtiges Apple-Developer-Konto. Preis und Anmeldung findest du unter Apple-Entwicklerkonto.
- Eine Bundle-ID in
ios.bundleIdentifier. Laut Referenz der Expo-Konfiguration denkst du sie dir selbst aus, sie muss aber im App Store eindeutig sein. - EAS CLI installiert, danach
eas loginmit deinem Expo-Konto.
Außerdem brauchst du einen signierten Production-Build. EAS Build erstellt ihn mit dem Zertifikat und dem Profil, die es für dich verwaltet, wie in iOS-Zertifikat und Provisioning Profile erklärt.
Der App-Eintrag in App Store Connect: du oder EAS?
EAS Submit lädt ein Binary zu einer App hoch, die in App Store Connect existieren muss.
Du kannst sie selbst anlegen. Apples Hilfe beschreibt das Fenster New App: Plattform, Name, Primärsprache, Bundle-ID, SKU und Benutzerzugriff. Du brauchst dafür die Rolle Account Holder, Admin oder App Manager.
EAS kann sie auch beim ersten Upload anlegen. Laut Expo-Seite zu TestFlight erstellt eas submit den Eintrag, wenn du deinen ersten Build hochlädst. Laut Referenz zu eas.json überspringt ein gesetztes ascAppId diesen Schritt. Der Name kommt aus appName, sonst aus dem name deiner Konfiguration. Die Primärsprache kommt aus language, Standardwert en-US. Wenn deine App zuerst auf Französisch erscheint, setz language vor diesem ersten Upload.
Danach trägst du die Nummer des Eintrags in ascAppId ein. Expo sagt, wo du sie findest: Öffne deine App in App Store Connect, dann App Information. Es ist das Feld Apple ID unter General Information. Das ist eine Zahl, nicht deine Bundle-ID.
Warum ein API-Schlüssel statt deiner Apple-ID
EAS Submit verbindet sich mit Apple über deine Apple-ID oder einen App Store Connect API-Schlüssel.
Die Apple-ID scheitert an der Zwei-Faktor-Authentifizierung, die Apple von allen App-Store-Connect-Nutzern verlangt: Ein Mensch muss die Anmeldung bestätigen. Das app-spezifische Passwort in EXPO_APPLE_APP_SPECIFIC_PASSWORD umgeht diesen Schritt, aber Expo hält es für weniger sicher als den API-Schlüssel, seine Standard- und empfohlene Methode. Mit dem Schlüssel klappt die Authentifizierung ganz ohne Interaktion, und damit lässt sich der Upload automatisieren.
Zwei Wege, ihn zu bekommen:
- Lass EAS ihn verwalten. Führ
eas credentials --platform iosaus, wähl das Profilproduction, melde dich bei deinem Apple-Konto an und wähl dann „App Store Connect: Manage your API Key“. - Bring deinen eigenen Schlüssel mit. In App Store Connect: Users and Access, Tab Integrations, App Store Connect API, Team Keys, dann Generate API Key. Du brauchst ein Admin-Konto, und Expos Anleitung gibt dem Schlüssel die Rolle Admin.
Im zweiten Fall notierst du die Key ID aus der Liste der aktiven Schlüssel und die Issuer ID oben auf der Seite Integrations. Vor allem: Bewahr die .p8-Datei auf. Du kannst sie nur einmal herunterladen, und Apple behält keine Kopie.
Ein Admin-Schlüssel kann laut Apple Benutzer in deinem Konto anlegen und löschen. Apple verlangt, dass du den Schlüssel nie in einem Code-Repository ablegst.
Die minimale eas.json zum Kopieren
Alle Werte sind Platzhalter: Ersetz sie durch deine eigenen.
{
"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"
}
}
}
}
appVersionSourceundautoIncrement: Die EAS-Server speichern die Build-Nummer und erhöhen sie bei jedem Production-Build. Expo empfiehlt diesen Remote-Modus seit EAS CLI 12.ascAppId: die Nummer deines App-Eintrags. Ohne sie scheitert der nicht-interaktive Modus.appleTeamId: die ID deines Apple-Developer-Teams.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: dein API-Schlüssel. Alle drei Felder akzeptieren Umgebungsvariablen. Füg den Ordnerkeyszu deiner.gitignorehinzu.
Das Feld appleId brauchst du nur, wenn du dich mit deiner Apple-ID anmeldest. Wenn EAS deinen Schlüssel schon verwaltet, entfern auch die drei ascApiKey-Felder. Bei meinen drei Apps, geprüft am 25. Oktober, enthält das Production-Submit-Profil nur ascAppId, bei Solys zusätzlich appleTeamId: kein Schlüssel in der Datei.
Build starten, dann hochladen
eas build --platform ios --profile production
eas submit --platform ios
Ohne weitere Option lässt dich eas submit den Build auswählen und fragt beim ersten Start nach deiner Apple-ID. Das Submit-Profil production wird standardmäßig verwendet, wenn es existiert. Die EAS-CLI-Referenz listet die Optionen, die die Auswahl ersparen:
| Option | Was sie macht |
|---|---|
--latest | Lädt den neuesten iOS-Build hoch |
--id | Lädt einen bestimmten EAS-Build hoch |
--path | Lädt eine lokale .ipa-Datei hoch |
--url | Lädt ein Online-Archiv hoch |
--groups | Fügt zu einer internen Gruppe hinzu |
--what-to-test | Füllt „What to test“ aus |
Um alles zu verketten, häng --auto-submit an den Build-Befehl. Laut Expo-Seite zum automatischen Upload geht der fertige Build an EAS Submit, mit dem Submit-Profil, das genauso heißt wie das Build-Profil. Für ein anderes: --auto-submit-with-profile=name. Der Build geht an TestFlight, nicht zur Prüfung.
In der Continuous Integration fügst du --non-interactive und ein EXPO_TOKEN hinzu. Der Befehl kann dich dann nichts fragen: Er braucht ascAppId im Profil und einen API-Schlüssel, entweder den, den EAS mit der App verknüpft hat, oder deinen eigenen in den drei ascApiKey-Feldern.
Was nach dem Upload passiert
1. Apple verarbeitet den Build. Er muss diese Verarbeitung durchlaufen, bevor er in App Store Connect erscheint, und Apple schickt dir am Ende eine E-Mail. Expo spricht meist von 10 bis 15 Minuten, bis du ihn in TestFlight siehst.
2. Exportkonformität. Der Status Missing Compliance bedeutet, dass deine Angabe zur Verschlüsselung fehlt. App Store Connect stellt diese Fragen bei jeder neuen Version, außer die Info.plist beantwortet sie schon. Bei Expo heißt der Schlüssel ios.config.usesNonExemptEncryption:
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
Laut Apple passt false, wenn deine App inklusive Bibliotheken keine oder nur ausgenommene Verschlüsselung nutzt. Die Systemverschlüsselung, etwa HTTPS über URLSession, ist das in der Regel. Gib false nur an, wenn es für deine App stimmt: Die Angabe ist verbindlich. Wie jeder Info.plist-Schlüssel braucht sie einen neuen Build.
3. TestFlight. Im Status Ready to Submit kann der Build laut Apple an interne Tester gehen, die Beta-Prüfung für externe durchlaufen oder zur App-Store-Prüfung gehen. Das Feld groups im Profil fügt ihn deinen internen Gruppen hinzu. Alles Weitere steht in TestFlight zum Testen deiner App.
Hochladen ist nicht Einreichen zur Prüfung
Expo schreibt es: Ein TestFlight-Build wird nicht automatisch im App Store veröffentlicht. EAS Submit füllt weder deinen Store-Eintrag noch deine Screenshots aus. In App Store Connect bleiben vier Schritte, beschrieben in Apples Hilfe zur Einreichung:
- Füll die Pflicht-Metadaten der Version aus.
- Wähl den Build im Abschnitt Build der Version.
- Klick auf „Add for Review“. Die Version wechselt zu Ready for Review, aber noch ist nichts zur Prüfung unterwegs.
- Klick auf „Submit for Review“. Der Status wechselt zu In Review, sobald die Prüfung beginnt.
Häufige Fehler und ihre Lösung
| Angezeigter Fehler | Ursache | Lösung |
|---|---|---|
| ITMS-90189 | Build-Nummer schon vergeben | autoIncrement |
| ITMS-90062 oder 90186 | Version bereits geschlossen | version erhöhen |
| „Set ascAppId“ | ascAppId fehlt in der CI | ascAppId hinzufügen |
| „API Keys cannot“ | Kein Schlüssel verknüpft | eas credentials |
| ITMS-90683 | Purpose String fehlt | ios.infoPlist |
| ITMS-91053 | Manifest unvollständig | ios.privacyManifests |
| ITMS-90725 | iOS-SDK zu alt | Expo SDK aktualisieren |
| Missing Compliance | Verschlüsselung nicht angegeben | usesNonExemptEncryption |
Laut Expo ist eine schon verwendete Build-Nummer ein häufiger Grund für abgelehnte Uploads: Alles dazu in Build-Nummer und Version. Drei Fehler haben einen eigenen Guide: ITMS-90683 mit Expo, ITMS-91053 mit Expo und ITMS-90725.
Die beiden Meldungen in Anführungszeichen kommen von EAS und werden in dessen Konfiguration behoben. Missing Compliance lässt sich auch lösen, indem du die Fragen in App Store Connect beantwortest. Bei allen anderen Zeilen betrifft die Lösung das Binary: Mach einen neuen Build und lade ihn erneut hoch. Ein Remote-Update ändert weder die Info.plist noch das Manifest noch die Nummern.
Deine erste App ohne Herumprobieren hochladen
Der Befehl ist nur ein Schritt. Das iOS Kit basiert auf dem Starter Code meiner Apps, Abos inklusive, und führt dich in vier Schritten bis in den App Store, in deinem Tempo.
Wenn du deinen ersten Release vorbereitest, mach deine kostenlose Diagnose: Sie zeigt dir, was dich wirklich blockiert, und schickt dir meine Checkliste gegen Apple-Ablehnungen. Für Store-Eintrag, Screenshots und Freigabe deckt die Seite App im App Store veröffentlichen jeden Schritt ab.
Häufige Fragen
Wie veröffentliche ich eine Expo-App im App Store?
Starte einen Production-Build mit EAS Build und lade ihn dann mit eas submit --platform ios hoch. Nach der Verarbeitung durch Apple erscheint er in TestFlight. In App Store Connect füllst du dann den Store-Eintrag aus, wählst diesen Build in der Version und klickst auf „Add for Review“ und „Submit for Review“.
Reicht EAS Submit meine App zur Prüfung bei Apple ein?
Nein. EAS Submit lädt das Binary zu App Store Connect hoch, und der Build landet in TestFlight. Die Einreichung zur Prüfung machst du von Hand in App Store Connect, sobald der Eintrag ausgefüllt und der Build ausgewählt ist.
Wo finde ich die ascAppId meiner App?
Öffne deine App in App Store Connect, dann App Information. Es ist das Feld Apple ID unter General Information. Das ist eine Zahl, nicht zu verwechseln mit deiner Bundle-ID.
Brauche ich eine Apple-ID, um eas submit zu nutzen?
Beim ersten Start fragt der Befehl danach. Danach kann er mit ascAppId im Profil und einem App Store Connect API-Schlüssel ohne Interaktion laufen, auch in der Continuous Integration. Der API-Schlüssel ist die Standard- und empfohlene Methode von Expo.
Wie lange dauert es, bis der Build in TestFlight erscheint?
Expo spricht meist von 10 bis 15 Minuten Verarbeitung bei Apple, und Apple schickt dir am Ende eine E-Mail. Bleibt der Build im Status Missing Compliance, beantworte die Fragen zur Verschlüsselung und gib sie dann für die nächsten Builds in deiner Konfiguration an.