Builds et publication
L'application mobile n'a jamais été publiée sur l'App Store ni sur Google Play. Le dépôt contient la configuration Expo (app.json) et des profils EAS Build (eas.json), mais pas de projet EAS lié, pas d'identifiants de signature et aucune étape de build mobile dans la CI. Pendant le projet, l'application a été utilisée avec Expo Go ou un émulateur (voir Tester sur un téléphone). Cette page décrit la configuration existante, ce qui manque pour produire un binaire et la procédure à suivre.
Configuration Expo
Le projet utilise un fichier statique app.json. Il n'existe ni app.config.js ni app.config.ts : aucune valeur ne peut donc varier selon l'environnement au moment du build, en dehors des variables EXPO_PUBLIC_* intégrées au bundle JavaScript.
| Clé | Valeur | Rôle |
|---|---|---|
name |
BlockLucky EtherBay |
Nom affiché sous l'icône |
slug |
blocklucky-etherbay |
Identifiant du projet chez Expo |
version |
1.0.0 |
Version visible par l'utilisateur |
orientation |
portrait |
Rotation bloquée |
icon |
./assets/images/icon.png |
Icône 1024 × 1024 : le « B » encre sur fond jaune plein, sans transparence |
userInterfaceStyle |
automatic |
Autorise le mode sombre du système ; l'application ne le lit pas (voir Thème et composants) |
splash |
splash.png, contain, fond #F6F7FA |
Écran de lancement : le logo « B » centré sur le fond clair de la maquette |
scheme |
blocklucky |
Schéma d'URL de l'application, utilisé par le retour de la connexion Google ; aucun lien profond n'est routé vers un écran (voir Navigation et écrans) |
ios.bundleIdentifier |
fr.etherbay.blocklucky |
Identifiant iOS |
ios.supportsTablet |
true |
Installable sur iPad |
ios.config.usesNonExemptEncryption |
false |
Déclaration d'export : l'application n'utilise que le chiffrement standard du système |
android.package |
fr.etherbay.blocklucky |
Identifiant Android |
android.adaptiveIcon |
adaptive-icon.png, fond #FFDA38 |
Icône adaptative : le « B » seul sur fond transparent, réduit pour rester dans la zone sûre des masques ronds, posé sur le jaune de la charte |
android.allowBackup |
false |
Pas de sauvegarde des données de l'application par Android |
web |
favicon.png (logo « B », 48 × 48), bundler metro |
Cible web d'Expo ; react-native-web et react-dom sont installés, la cible n'est pas vérifiée par la CI |
plugins |
expo-secure-store, expo-font, expo-status-bar, expo-web-browser, expo-image-picker, expo-audio |
Modules configurés au prebuild ; expo-audio lit les sons de la roue et du compte à rebours (voir Thème et composants) |
Le plugin expo-image-picker fixe les deux textes affichés par le système quand l'application demande l'accès :
| Autorisation | Texte |
|---|---|
Photos (photosPermission) |
« BlockLucky accède à vos photos pour envoyer le recto et le verso de votre pièce d'identité à la Mairie. » |
Appareil photo (cameraPermission) |
« BlockLucky utilise l'appareil photo pour photographier votre pièce d'identité afin de vérifier votre âge. » |
Plusieurs clés habituelles d'un projet publié manquent :
| Clé absente | Conséquence |
|---|---|
extra.eas.projectId, owner |
Le projet n'est rattaché à aucun compte Expo ; la première commande EAS demandera de le créer |
runtimeVersion, updates.url |
Les mises à jour à distance (EAS Update) ne sont pas configurées |
ios.buildNumber, android.versionCode |
Normal ici : appVersionSource: "remote" confie ces numéros à EAS |
Plugin expo-notifications |
Pas de notifications push |
Profils EAS
eas.json exige EAS CLI 12 ou plus et déclare trois profils de build :
| Profil | Réglages | Usage prévu |
|---|---|---|
development |
developmentClient: true, distribution: internal, channel: development |
Client de développement installé sur les téléphones de l'équipe |
preview |
distribution: internal, channel: preview |
Binaire de recette partagé par lien (APK Android, distribution ad hoc iOS) |
production |
autoIncrement: true, channel: production |
Binaire pour les stores, numéro de build incrémenté à chaque build |
La section submit.production est vide : aucune information de compte App Store Connect ni de clé de service Google Play n'est fournie.
Attention
Deux réglages ne peuvent pas fonctionner avec les dépendances actuelles :
developmentClient: truesuppose le paquetexpo-dev-client, qui n'est pas installé. Un builddevelopmentproduirait une application sans le menu et le chargeur du client de développement.- Les canaux (
channel) ne servent qu'avec EAS Update, qui suppose le paquetexpo-updateset les clésruntimeVersionetupdates.url. Aucun n'est présent : les canaux sont aujourd'hui sans effet.
Variables d'environnement au build
EXPO_PUBLIC_API_URL et EXPO_PUBLIC_WS_URL sont lues au moment de la construction du bundle. Sans elles, l'application compilée pointe vers http://localhost:2053, c'est-à-dire vers le téléphone lui-même. La connexion Google demande en plus EXPO_PUBLIC_GOOGLE_IOS_CLIENT_ID et EXPO_PUBLIC_GOOGLE_ANDROID_CLIENT_ID : sans elles, le bouton Google du binaire reste désactivé.
eas.json ne déclare aucune section env, et le fichier .env est exclu de Git par .gitignore. Avant un build EAS, il faut donc fournir les URL de l'environnement visé, soit dans une section env de chaque profil, soit dans les variables d'environnement du projet EAS. Pour une version publique, ces URL doivent être en HTTPS : les applications iOS et Android récentes refusent par défaut le HTTP non chiffré hors développement, et app.json ne déclare aucune exception.
Procédure pour un premier build
Ces étapes n'ont pas été exécutées dans le projet. Elles utilisent EAS CLI, qui n'est pas une dépendance du dépôt.
- Créer ou choisir un compte Expo pour la Ville, puis lier le projet (
eas init), ce qui ajouteextra.eas.projectIddansapp.json. - Installer
expo-dev-clientsi le profildevelopmentdoit être utilisé, ou retirerdevelopmentClientdu profil. - Renseigner les URL de l'API et les identifiants client Google dans
eas.jsonou dans les variables du projet EAS, et déclarer ces identifiants dansGOOGLE_CLIENT_IDSdu backend. - Remplacer les images de
assets/images(icône, icône adaptative, splash) par des visuels conformes à la maquette ; les couleurs de fond deapp.jsonle sont déjà. - Lancer un build de recette, par exemple
eas build --profile preview --platform android, et l'installer sur un téléphone. - Pour iOS, fournir un compte Apple Developer pour l'identifiant
fr.etherbay.blocklucky: EAS génère alors les certificats et profils de provisionnement. - Pour les stores, compléter
submit.production, puiseas submit --profile production.
Avant toute publication, les défauts de l'application doivent être corrigés, en particulier la restauration de session (voir Authentification et stockage sécurisé). La liste de contrôle générale est dans Avant une mise en production.
Conformité des stores
Quelques points à préparer, propres à une application de loterie :
| Sujet | Situation |
|---|---|
| Jeux d'argent | Les tickets s'achètent en ethers fictifs sans valeur, mais les règles des stores sur les loteries et les crypto-actifs s'appliquent à la présentation ; voir Crypto-actifs et MiCA |
| Majorité | Vérification sur pièce d'identité par la Mairie avant tout achat ; la classification d'âge des stores devra être cohérente |
| Données personnelles | Fiche de confidentialité à remplir (email, adresse de portefeuille, identifiant de compte, photos de la pièce d'identité supprimées après décision, identifiant Google) ; voir RGPD |
| Connexion tierce | Seul Google est proposé depuis le retrait de Sign in with Apple ; les règles de l'App Store sur les connexions tierces (qui peuvent imposer une option équivalente) sont à vérifier avant la soumission iOS |
| Autorisations | Appareil photo et photos, avec les textes du plugin expo-image-picker ; le plugin expo-audio est déclaré sans options, ses autorisations par défaut sont à contrôler dans le binaire généré |
| Documents légaux | CGU, règlement, confidentialité, traceurs, mentions légales et charte de transparence consultables dans l'application (écran Legal, depuis Aide & Support et l'inscription) |
| Chiffrement | usesNonExemptEncryption: false déjà déclaré pour iOS |
| Suppression de compte | Exigée par les stores, disponible dans l'écran RGPD (anonymisation) |
Tests
Le dossier mobile-app/__tests__ contient trois fichiers écrits pour Jest :
| Fichier | Contenu |
|---|---|
components/CountdownTimer.test.tsx |
formatRemainingTime de date.util : découpage et bornage à zéro ; le composant CountdownTimer lui-même a été supprimé |
screens/BuyTicketScreen.test.tsx |
isValidEmail et isValidOtpCode |
utils/formatters.test.ts |
shortenWallet, formatPoints, formatEth, formatPercentage |
Malgré leurs noms, ils ne testent que des fonctions de src/utils et ne rendent aucun composant. Ils ne sont jamais exécutés : package.json n'a pas de script test et Jest n'est pas installé. ESLint les ignore (ignorePatterns de .eslintrc.js) et tsconfig.json ne les inclut pas.
Pour les activer, installer jest et jest-expo en dépendances de développement, ajouter un script "test": "jest" et la clé "jest": { "preset": "jest-expo" } dans package.json. React Native Testing Library sera nécessaire pour tester de vrais composants.
Intégration continue
Le job « Application mobile (typecheck, lint) » de .github/workflows/ci.yml s'exécute quand mobile-app/** change :
npm ci;npm audit --omit=dev --audit-level=high;npm run typecheck;npm run lint;npx expo config --type public, qui vérifie que la configuration Expo se résout sans erreur.
Aucun build natif ni EAS n'est lancé par la CI, et aucun test n'est exécuté. Le détail des jobs est dans Intégration continue.
Fichiers à ne pas versionner
Le dossier .expo/ est créé par Expo CLI sur chaque poste. Deux de ses fichiers (README.md et devices.json) sont pourtant suivis par Git, car .gitignore ne liste pas ce dossier. Il faudrait l'ajouter à .gitignore et retirer ces fichiers du dépôt.