EAS Submit iOS : publier une app Expo sur l'App Store
Par Mehdi Azizi
Publié le , 8 min
EAS Submit envoie ton build iOS à App Store Connect, où il arrive dans TestFlight. L'envoi en revue reste à faire dans App Store Connect. Le fichier eas.json à copier et les erreurs à connaître.
eas submit --platform ios envoie ton build iOS à App Store Connect, où il apparaît dans TestFlight après le traitement par Apple. La commande ne soumet pas ton app à la revue d'Apple : le choix du build et l'envoi en revue restent à faire dans App Store Connect. Pour l'automatiser, il lui faut le numéro de ta fiche (ascAppId) et une clé API App Store Connect.
Je publie mes apps iOS, dont Solys, TradaZen et Nolera, avec Expo, EAS Build et EAS Submit. Ce guide suit la documentation d'Expo sur l'envoi iOS, relue le 25 octobre 2026. Sans Mac, le parcours complet est dans publier une app iOS sans Mac. Ici, on se concentre sur l'envoi.
Ce qu'il te faut avant la première commande
Expo liste trois prérequis :
- Un compte Apple Developer payant. Le prix et l'inscription sont dans compte développeur Apple.
- Un identifiant de bundle dans
ios.bundleIdentifier. D'après la référence de la configuration Expo, tu l'inventes, mais il doit être unique sur l'App Store. - EAS CLI installé, puis
eas loginavec ton compte Expo.
Il te faut aussi un build de production signé. EAS Build le fabrique avec le certificat et le profil qu'il gère pour toi, comme l'explique certificat et provisioning profile iOS.
La fiche App Store Connect : toi ou EAS ?
EAS Submit envoie un binaire vers une app qui doit exister dans App Store Connect.
Tu peux la créer toi‑même. L'aide d'Apple décrit la fenêtre New App : plateforme, nom, langue principale, identifiant de bundle, SKU et accès des utilisateurs. Il faut le rôle Account Holder, Admin ou App Manager.
EAS peut aussi la créer au premier envoi. D'après la page d'Expo sur TestFlight, eas submit crée la fiche quand tu envoies ton premier build. Selon la référence d'eas.json, renseigner ascAppId fait sauter cette étape. Le nom vient de appName, ou à défaut du name de ta configuration. La langue principale vient de language, qui vaut en-US par défaut. Si ton app sort d'abord en français, renseigne language avant ce premier envoi.
Ensuite, recopie le numéro de la fiche dans ascAppId. Expo indique où le trouver : ouvre ton app dans App Store Connect, puis App Information. C'est le champ Apple ID, sous General Information. C'est un nombre, pas ton identifiant de bundle.
Pourquoi une clé API plutôt que ton identifiant Apple
EAS Submit se connecte à Apple avec ton identifiant Apple ou avec une clé API App Store Connect.
L'identifiant Apple bute sur la double authentification, qu'Apple exige de tous les utilisateurs d'App Store Connect : il faut une personne pour confirmer la connexion. Le mot de passe d'app, passé dans EXPO_APPLE_APP_SPECIFIC_PASSWORD, évite cette étape, mais Expo le juge moins sûr que la clé API, sa méthode par défaut et recommandée. La clé permet de s'authentifier sans aucune interaction, et donc d'automatiser l'envoi.
Deux chemins pour l'obtenir :
- Laisse EAS la gérer. Lance
eas credentials --platform ios, choisis le profilproduction, connecte-toi à ton compte Apple, puis choisis « App Store Connect : Manage your API Key ». - Apporte ta propre clé. Dans App Store Connect : Users and Access, onglet Integrations, App Store Connect API, Team Keys, puis Generate API Key. Il faut un compte Admin, et le guide d'Expo donne le rôle Admin à la clé.
Dans le second cas, note le Key ID, affiché dans la liste des clés actives, et l'Issuer ID, en haut de la page Integrations. Garde surtout le fichier .p8 : tu ne peux le télécharger qu'une fois, et Apple n'en garde aucune copie.
Une clé Admin peut, d'après Apple, créer et supprimer des utilisateurs de ton compte. Apple demande de ne jamais ranger la clé dans un dépôt de code.
Le fichier eas.json minimal à copier
Toutes les valeurs sont factices : remplace-les par les tiennes.
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"production": {
"autoIncrement": true
}
},
"submit": {
"production": {
"ios": {
"ascAppId": "1234567890",
"appleTeamId": "ABCDE12345",
"ascApiKeyPath": "./keys/AuthKey_XXXXXXXXXX.p8",
"ascApiKeyIssuerId": "ton-issuer-id",
"ascApiKeyId": "XXXXXXXXXX"
}
}
}
}
appVersionSourceetautoIncrement: les serveurs d'EAS gardent le numéro de build et le montent à chaque build de production. Expo recommande ce mode distant depuis EAS CLI 12.ascAppId: le numéro de ta fiche. Sans lui, le mode non interactif échoue.appleTeamId: l'identifiant de ton équipe Apple Developer.ascApiKeyPath,ascApiKeyIssuerId,ascApiKeyId: ta clé API. Les trois champs acceptent des variables d'environnement. Ajoute le dossierkeysà ton.gitignore.
Le champ appleId ne sert que si tu te connectes avec ton identifiant Apple. Si EAS gère déjà ta clé, retire aussi les trois champs ascApiKey. Sur mes trois apps, relues le 25 octobre, le profil d'envoi de production ne contient que ascAppId, plus appleTeamId sur Solys : aucune clé dans le fichier.
Lancer le build, puis l'envoi
eas build --platform ios --profile production
eas submit --platform ios
Sans autre option, eas submit te fait choisir le build à envoyer et, au premier lancement, te demande ton identifiant Apple. Le profil d'envoi production est pris par défaut s'il existe. La référence d'EAS CLI liste les options qui évitent le choix :
| Option | Ce qu'elle fait |
|---|---|
--latest | Envoie le dernier build iOS |
--id | Envoie un build EAS précis |
--path | Envoie un fichier .ipa local |
--url | Envoie une archive en ligne |
--groups | Ajoute à un groupe interne |
--what-to-test | Remplit « What to test » |
Pour tout enchaîner, ajoute --auto-submit à la commande de build. D'après la page d'Expo sur l'envoi automatique, le build terminé part vers EAS Submit avec le profil d'envoi du même nom que le profil de build. Pour en choisir un autre : --auto-submit-with-profile=nom. Le build part vers TestFlight, pas vers la revue.
En intégration continue, ajoute --non-interactive et un jeton EXPO_TOKEN. La commande ne peut alors rien te demander : il lui faut ascAppId dans le profil et une clé API, celle qu'EAS a rattachée à l'app ou la tienne dans les trois champs ascApiKey.
Ce qui se passe après l'envoi
1. Apple traite le build. Il doit passer par ce traitement avant d'apparaître dans App Store Connect, et Apple t'envoie un e-mail à la fin. Expo parle en général de 10 à 15 minutes avant de le voir dans TestFlight.
2. La conformité export. Le statut Missing Compliance veut dire qu'il manque ta déclaration sur le chiffrement. App Store Connect pose ces questions à chaque nouvelle version, sauf si l'Info.plist y répond déjà. Avec Expo, la clé s'appelle ios.config.usesNonExemptEncryption :
{
"expo": {
"ios": {
"config": {
"usesNonExemptEncryption": false
}
}
}
}
D'après Apple, false convient si ton app, bibliothèques comprises, n'utilise aucun chiffrement ou seulement un chiffrement exempté. Le chiffrement du système, comme le HTTPS par URLSession, l'est en général. Ne déclare false que si c'est vrai pour ton app : la déclaration t'engage. Comme toute clé de l'Info.plist, elle demande un nouveau build.
3. TestFlight. Au statut Ready to Submit, selon Apple, le build peut aller aux testeurs internes, passer la revue bêta pour les externes, ou partir en revue App Store. Le champ groups du profil l'ajoute à tes groupes internes. Tout le reste est dans TestFlight pour tester son app.
L'envoi n'est pas la soumission à la revue
Expo l'écrit : un build TestFlight n'est pas publié automatiquement sur l'App Store. EAS Submit ne remplit ni ta fiche, ni tes captures. Il reste quatre gestes dans App Store Connect, décrits dans l'aide d'Apple sur l'envoi en revue :
- Remplis les métadonnées obligatoires de la version.
- Choisis le build dans la section Build de la version.
- Clique « Add for Review ». La version passe en Ready for Review, mais rien n'est encore parti en revue.
- Clique « Submit for Review ». Le statut passe à In Review quand la revue commence.
Les erreurs fréquentes et leur correction
| Erreur affichée | Cause | Correction |
|---|---|---|
| ITMS-90189 | Numéro de build déjà pris | autoIncrement |
| ITMS-90062 ou 90186 | Version déjà fermée | Monter version |
| « Set ascAppId » | ascAppId absent en CI | Ajouter ascAppId |
| « API Keys cannot » | Aucune clé rattachée | eas credentials |
| ITMS-90683 | Phrase d'accès absente | ios.infoPlist |
| ITMS-91053 | Manifeste incomplet | ios.privacyManifests |
| ITMS-90725 | SDK iOS trop ancien | Monter le SDK Expo |
| Missing Compliance | Chiffrement non déclaré | usesNonExemptEncryption |
D'après Expo, le numéro de build déjà utilisé est une cause courante de refus à l'envoi : tout est dans numéro de build et version. Trois erreurs ont leur propre guide : ITMS-90683 avec Expo, ITMS-91053 avec Expo et ITMS-90725.
Les deux messages entre guillemets viennent d'EAS et se corrigent dans sa configuration. Missing Compliance se règle aussi en répondant aux questions dans App Store Connect. Pour toutes les autres lignes, la correction touche le binaire : refais un build, puis renvoie-le. Une mise à jour à distance ne change ni l'Info.plist, ni le manifeste, ni les numéros.
Envoyer ta première app sans tâtonner
La commande n'est qu'une étape. Le Kit iOS part du code de départ de mes apps, abonnements compris, et suit quatre étapes jusqu'à l'App Store, à ton rythme.
Si tu prépares ta première sortie, fais ton diagnostic gratuit : il te dit ce qui te bloque vraiment et t'envoie ma checklist anti-refus Apple. Pour la fiche, les captures et la validation, la page publier une application sur l'App Store couvre chaque étape.
Questions fréquentes
Comment publier une app Expo sur l'App Store ?
Lance un build de production avec EAS Build, puis envoie-le avec eas submit --platform ios. Après le traitement par Apple, il apparaît dans TestFlight. Dans App Store Connect, remplis ensuite la fiche, choisis ce build dans la version, puis clique « Add for Review » et « Submit for Review ».
EAS Submit envoie-t-il mon app en revue chez Apple ?
Non. EAS Submit envoie le binaire à App Store Connect, et le build arrive dans TestFlight. L'envoi en revue se fait à la main dans App Store Connect, une fois la fiche remplie et le build choisi.
Où trouver l'ascAppId de mon app ?
Dans App Store Connect, ouvre ton app, puis App Information. C'est le champ Apple ID, sous General Information. C'est un nombre, à ne pas confondre avec ton identifiant de bundle.
Faut-il un identifiant Apple pour utiliser eas submit ?
Au premier lancement, la commande te le demande. Ensuite, avec ascAppId dans le profil et une clé API App Store Connect, elle peut tourner sans interaction, même en intégration continue. La clé API est la méthode par défaut et recommandée par Expo.
Combien de temps avant de voir le build dans TestFlight ?
Expo parle en général de 10 à 15 minutes de traitement chez Apple, qui t'envoie un e-mail à la fin. Si le build reste au statut Missing Compliance, réponds aux questions sur le chiffrement, puis déclare-le dans ta configuration pour les builds suivants.