Chapitre 1215 minIntermédiaire
Générer l'APK et publier sur le Play Store et l'App Store
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- configurer l'identité et la version d'une application ;
- produire un APK de démonstration avec Expo Build ;
- décrire les étapes de publication sur Google Play et l'App Store ;
- choisir entre une nouvelle version et une mise à jour à distance.
3 exercices corrigés
Publier une application mobile, c'est la compiler en un fichier installable et signé (un APK ou un AAB pour Android, une IPA pour iOS), puis la soumettre au Google Play Store ou à l'App Store, qui la vérifient avant de la proposer au public. Avec Expo, la compilation se fait dans le cloud avec Expo Build (anciennement EAS Build), sans Android Studio ni Mac. Ce chapitre configure app.json, produit l'APK d'AppliFrais à installer pour une démonstration, explique la gestion des versions, puis les étapes de publication sur chaque magasin et les mises à jour à distance.
Du code à l'application installable
| Fichier | Système | Usage |
|---|---|---|
| APK (Android Package) | Android | S'installe directement sur un téléphone ou un émulateur : démonstration, test interne, distribution en entreprise |
| AAB (Android App Bundle) | Android | Le format exigé par Google Play : Google en tire un APK optimisé pour chaque appareil. Ne s'installe pas directement |
| IPA | iOS | S'installe par l'App Store, TestFlight, ou sur des iPhone enregistrés auprès d'Apple |
Toute application doit être signée avec une clé privée : la signature prouve que les mises à jour viennent du même éditeur. Sur Android, cette clé est rangée dans un fichier keystore ; si tu la perds, tu ne peux plus mettre à jour ton application sur un téléphone où elle est installée. Expo Build crée et conserve cette clé pour toi, sur ses serveurs ; Google Play, de son côté, re-signe les applications publiées avec sa propre clé (Play App Signing).
Configurer app.json
Avant la première compilation, complète l'identité de l'application dans app.json :
{
"expo": {
"name": "AppliFrais",
"slug": "applifrais-mobile",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "applifrais",
"userInterfaceStyle": "automatic",
"android": {
"package": "com.gsb.applifrais",
"adaptiveIcon": {
"foregroundImage": "./assets/images/android-icon-foreground.png",
"backgroundColor": "#E6F4FE"
}
},
"ios": {
"bundleIdentifier": "com.gsb.applifrais"
},
"plugins": ["expo-router", "expo-secure-store", "expo-sqlite"]
}
}
| Clé | Rôle | Attention |
|---|---|---|
name | Le nom affiché sous l'icône | Court : une dizaine de caractères tient sous l'icône |
slug | Le nom du projet chez Expo | Sans espace ni accent |
android.package, ios.bundleIdentifier | L'identifiant unique de l'application dans les magasins, en notation de domaine inversé | Définitif une fois publié : le changer crée une autre application |
version | Le numéro de version affiché aux utilisateurs | Suivre la gestion sémantique : 1.0.0, 1.1.0, 2.0.0 (publier une version) |
icon, adaptiveIcon, splash | Icône et écran de démarrage | Icône carrée de 1024 × 1024 pixels |
plugins | Les greffons de configuration et les messages de permission (chapitre 8) | Appliqués à la compilation seulement |
Compiler dans le cloud avec Expo Build
Expo Build compile l'application sur les serveurs d'Expo : tu n'as besoin ni d'Android Studio ni d'un Mac, même pour iOS. L'offre gratuite d'Expo inclut un nombre limité de compilations par mois, avec une file d'attente ; c'est largement suffisant pour un projet de BTS.
Les services d'Expo s'appelaient EAS (Expo Application Services) jusqu'en 2026, et ont été renommés : EAS Build est devenu Expo Build, EAS Submit Expo Submit, EAS Update Expo Update. Les commandes gardent le nom eas, et le fichier de configuration s'appelle toujours eas.json.
npm install --global eas-cli # ou préfixe chaque commande par npx eas-cli@latest
eas login # avec ton compte Expo
eas build:configure # crée eas.json et relie le projet à ton compte
eas.json définit des profils de compilation. Pour AppliFrais :
{
"cli": {
"appVersionSource": "remote"
},
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal",
"android": { "buildType": "apk" },
"env": { "EXPO_PUBLIC_API_URL": "https://recette-api.gsb.example/v1" }
},
"production": {
"autoIncrement": true,
"env": { "EXPO_PUBLIC_API_URL": "https://api.gsb.example/v1" }
}
}
}
| Profil | Produit | Pour qui |
|---|---|---|
development | Un development build, ta version d'Expo Go (chapitre 2) | Toi, pendant le développement |
preview | Un APK installable directement, qui appelle l'API de recette | Les testeurs, la démonstration de l'E6 |
production | Un AAB pour Google Play (et une IPA pour l'App Store), qui appelle l'API de production | Les magasins |
Les variables EXPO_PUBLIC_… de chaque profil remplacent celles du fichier .env : l'APK de recette et la version publiée n'appellent pas la même API. Les magasins exigent aussi un numéro de compilation (versionCode sur Android, buildNumber sur iOS), un entier qui augmente à chaque envoi, même pour la même version. Avec appVersionSource: "remote" et autoIncrement, il n'est plus dans app.json : Expo tient lui-même le compteur sur ses serveurs et l'augmente à chaque compilation de production. Tu ne peux plus oublier de le faire, et une valeur écrite dans app.json serait ignorée.
Pour produire l'APK de démonstration :
eas build --platform android --profile preview
La compilation prend une dizaine de minutes. À la fin, la commande affiche un lien et un QR code : ouvre-le sur le téléphone, télécharge l'APK et installe-le (Android demande d'autoriser l'installation d'applications de cette source). eas build:run -p android l'installe directement sur l'émulateur.
Compiler sur ta machine
Si tu as Android Studio, tu peux aussi compiler localement :
npx expo run:android --variant release
Expo génère alors le dossier android/ à partir d'app.json (la génération native continue : npx expo prebuild), puis lance Gradle, l'outil de compilation d'Android. Ce dossier est généré : ne le modifie pas à la main et ne le versionne pas, toute la configuration passe par app.json et les greffons. Depuis le SDK 58, les versions de publication Android passent aussi par R8, l'outil d'Android qui retire le code Java et Kotlin inutile et raccourcit ses noms internes. Pour iOS, la compilation locale demande un Mac avec Xcode.
Publier sur Google Play
- Créer un compte développeur Google Play : 25 dollars, payés une seule fois. Google vérifie l'identité du titulaire.
- Créer l'application dans la Play Console : nom, langue, gratuite ou payante.
- Remplir la fiche : description courte et longue, captures d'écran, icône, catégorie, adresse de contact.
- Remplir les déclarations : la politique de confidentialité (une adresse web obligatoire), le formulaire Sécurité des données (quelles données l'application collecte, pourquoi, si elles sont chiffrées et partagées), la classification du contenu, le public visé.
- Envoyer l'AAB de production, dans un canal de test d'abord.
- Passer en production après les tests ; Google examine l'application, de quelques heures à quelques jours.
| Canal | Testeurs | Rôle |
|---|---|---|
| Test interne | Jusqu'à 100, par adresse e-mail | Tester vite dans l'équipe |
| Test fermé | Une liste ou un groupe | Recette avec des utilisateurs choisis |
| Test ouvert | Tout le monde, sur inscription | Version bêta publique |
| Production | Tout le monde | La version publiée |
Google impose aussi une version Android cible récente : depuis le 31 août 2026, les nouvelles applications et les mises à jour doivent cibler Android 16 (niveau d'API 36). Le SDK 58 d'Expo cible déjà ce niveau : tenir son SDK à jour, c'est aussi rester publiable.
La commande eas submit -p android envoie le dernier AAB compilé vers la Play Console, après une première configuration (un compte de service Google, créé une fois).
Publier sur l'App Store
- Adhérer au programme Apple Developer : 99 dollars par an (99 € en France). Sans adhésion, ni publication ni TestFlight : un Mac avec Xcode permet seulement d'installer l'application sur ton propre iPhone, pour quelques jours.
- Compiler avec
eas build -p ios --profile production: Expo Build crée les certificats et les profils de signature à partir de ton compte Apple, sans Mac. - Envoyer la compilation avec
eas submit -p iosvers App Store Connect. - Tester avec TestFlight, l'outil de bêta d'Apple : jusqu'à 10 000 testeurs externes, qui installent l'application TestFlight.
- Remplir la fiche : captures pour chaque taille d'iPhone, description, politique de confidentialité, et les étiquettes de confidentialité (App Privacy) qui listent les données collectées.
- Soumettre à la revue : Apple vérifie l'application à la main, en général en un ou deux jours, selon ses règles (App Review Guidelines). Motifs de refus fréquents : un plantage, une fonction factice, un message de permission vague, un identifiant de démonstration manquant pour une application qui demande une connexion.
Les mises à jour : une nouvelle version ou une mise à jour à distance
Une nouvelle version passe par le magasin : compilation, envoi, examen, puis mise à jour sur les téléphones, sur plusieurs jours. Pour corriger un bogue dans le JavaScript, Expo propose une voie plus rapide : Expo Update (anciennement EAS Update), avec le module expo-updates. L'application télécharge le nouveau code JavaScript et les nouvelles images au démarrage, sans passer par le magasin.
npx expo install expo-updates
eas update:configure
eas update --channel production --message "Corrige le calcul du total"
| Changement | Mise à jour à distance possible ? |
|---|---|
| Correction dans un écran, un style, un texte, une image | Oui |
| Changement de la logique JavaScript | Oui, dans les limites des règles des magasins |
Ajout d'un module natif (expo-camera…), d'une permission, nouvelle version du SDK | Non : nouvelle compilation et nouvelle publication |
La version d'exécution (runtime version) garantit qu'une mise à jour n'est envoyée qu'aux compilations dont le code natif est compatible. Les magasins autorisent ces mises à jour pour corriger et améliorer, pas pour transformer l'application en une autre sans examen.
N'oublie pas l'autre bout du câble : des téléphones garderont l'ancienne version des mois. L'API doit rester compatible avec les versions encore en circulation, ce qui justifie son versionnement (/v1/, versionner une API). Et pour une faille grave, l'application doit pouvoir imposer la mise à jour : au démarrage, elle demande à l'API la version minimale acceptée et bloque l'accès si elle est plus ancienne (contrôle MASVS-CODE-2, chapitre 13).
Exercice 1 sur 3 Les identifiants de l'application Réussi À revoir
Avec l'eas.json du cours (appVersionSource: "remote", autoIncrement), dis pour chaque situation ce qu'il faut modifier dans app.json (version, package) ou s'il ne faut rien modifier, et ce que devient le versionCode.
- Tu corriges un bogue d'affichage et tu envoies une nouvelle compilation à Google Play.
- Tu ajoutes l'écran « Statistiques » : nouvelle fonctionnalité, compatible.
- Ton enseignant te demande de renommer le paquet
com.example.monappliencom.gsb.applifrais, alors que l'application est déjà publiée. - Tu publies une correction par Expo Update.
Voir la réponseMasquer la réponse de l'exercice 1
versionpasse de1.0.0à1.0.1(correctif). LeversionCoden'est plus dansapp.json: avecappVersionSource: "remote", Expo l'augmente à la compilation de production. Le magasin refuse unversionCodedéjà utilisé, d'où l'intérêt de ne pas le gérer à la main.versionpasse à1.1.0(nouvelle fonctionnalité compatible) ; leversionCode, lui, est augmenté par Expo à la compilation.- C'est impossible pour l'application publiée : un autre
packageest une autre application, avec une autre fiche, et les utilisateurs actuels ne recevront pas de mise à jour. Il faut publier une nouvelle application, et faire migrer les utilisateurs. D'où l'intérêt de choisir l'identifiant dès le départ. - Rien dans
app.json: la mise à jour à distance ne change niversionniversionCode, elle remplace le code JavaScript d'une compilation existante. Le message de l'eas updatesert de trace.
Tu avais trouvé ?
Exercice 2 sur 3 APK ou AAB ? Réussi À revoir
Quel fichier et quel profil eas.json produire pour : (1) l'installer sur le téléphone de la commission à l'E6 ; (2) l'envoyer à Google Play ; (3) le distribuer aux 40 visiteurs de GSB par la gestion de flotte de l'entreprise ?
Voir la réponseMasquer la réponse de l'exercice 2
- Un APK, profil
preview: il s'installe directement, et appelle l'API de recette. - Un AAB, profil
production: Google Play n'accepte plus que ce format pour les nouvelles applications. - Un APK signé, issu d'un profil de production qui appelle l'API de production (on peut ajouter
"android": { "buildType": "apk" }à un profil dédié). Une gestion de flotte installe des APK ; elle peut aussi passer par un canal privé de Google Play, qui utiliserait alors l'AAB.
Tu avais trouvé ?
Exercice 3 sur 3 Mise à jour à distance ou nouvelle version ? Réussi À revoir
- Le total d'une fiche est mal arrondi (code TypeScript de
format.ts). - Tu ajoutes la lecture de QR codes avec
expo-camera, absent jusque-là. - Le texte du bouton « Enregistrer » devient « Valider le frais ».
- Tu passes du SDK 58 au SDK 59.
Voir la réponseMasquer la réponse de l'exercice 3
- Mise à jour à distance : c'est du JavaScript.
- Nouvelle version :
expo-cameracontient du code natif et ajoute une permission ; il faut recompiler et republier. - Mise à jour à distance : un texte dans un composant.
- Nouvelle version : un nouveau SDK change le code natif (et la version d'exécution).
Tu avais trouvé ?