Publier sur le Play Store, pas à pas

Le mode d'emploi complet pour mettre un jeu JumPHP sur Google Play et l'y garder : ce qu'il faut fabriquer, ce qu'il faut garder, ce qu'il faut vérifier sur un téléphone, et la Play Console de bout en bout. Il vaut pour les deux sortes d'appli :

L'appli web (Sur Google Play) L'appli native (Appli Android native)
Commande bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu bin/jumphp android mon-jeu
Ce que c'est la page du jeu dans Chrome, en plein écran PHP, SDL et le jeu dans l'appli, sans réseau
Le jeu se met à jour avec le site, tout de suite (pas de nouvelle appli) avec une nouvelle version de l'appli

Votre Claude connaît ce guide (il est dans le AGENTS.md de votre projet, et docs/google-play.md) : demandez-lui « mets mon jeu sur Google Play ». Il fait la technique ; les choix et les envois restent les vôtres (voir la fin).

0. Avant de commencer

  • Un compte développeur Google Play : play.google.com/console, 25 $ une fois, avec une vérification d'identité. C'est votre compte : c'est vous qui acceptez les conditions de Google.
  • Un nouveau compte personnel doit faire un test fermé avec au moins 12 testeurs pendant 14 jours avant de pouvoir publier en production. Lancez-le tôt.
  • Le nom du paquet (io.github.<votre compte github>.<mon_jeu>) : l'identifiant de l'appli sur Google Play. Il ne change plus jamais. La commande le demande la première fois.
  • La licence du SDK Android : c'est vous qui l'acceptez, dans votre terminal, la première fois (le SDK, ~1 Go, va dans ~/.jumphp). Votre Claude vous demande de lancer la commande vous-même (! bin/jumphp twa …).
  • Une politique de confidentialité à une adresse publique : Google la demande même si le jeu ne collecte rien. Une page courte suffit : le jeu ne collecte, n'envoie et ne partage aucune donnée personnelle ; pas de compte, pas de publicité, pas de suivi ; les réglages et sauvegardes restent sur l'appareil ; une adresse de contact. Mettez-la dans le site du jeu, games/mon-jeu/site/privacy.html : elle est servie à https://play.jumphp.net/mon-jeu/privacy.html (ou le PRIVACY.md de votre dépôt public). Ouvrez l'adresse une fois avant de la donner à Google : une erreur 404 bloque l'examen.

1. Les clés : sauvegardez-les d'abord

La première fabrication crée votre clé d'envoi : ~/.jumphp/android/keys/<paquet>.keystore et son mot de passe dans <paquet>.env.

  • Jamais dans git, ni dans une note ou un message. Sauvegardez les deux fichiers ailleurs (gestionnaire de mots de passe, disque chiffré). Sans eux, une nouvelle fabrication crée une autre clé et Google Play refuse la mise à jour.
  • Avec la signature d'application par Google Play (par défaut), Google garde sa propre clé, celle qui signe l'appli sur les téléphones. La vôtre prouve seulement que les envois viennent de vous ; perdue, Google peut la remplacer (Configuration > Signature de l'application), mais cela prend des jours.
  • Il y a donc deux empreintes SHA-256 : celle de votre clé (affichée par la commande) et celle de la clé de Google (Play Console > Configuration > Signature de l'application, après le premier envoi).

2. Fabriquer l'appli

bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu     # l'appli web
bin/jumphp android mon-jeu                                   # ou l'appli native
  • Chaque fabrication fait numéro de version + 1 (Google Play refuse un numéro déjà envoyé ; un essai raté consomme un numéro, ce n'est pas grave).
  • Committez tout de suite le fichier de version : games/mon-jeu/android/twa-manifest.json (appli web) ou games/mon-jeu/android/app.json (appli native). Jamais dist/.
  • Le nom sous l'icône : pwa: {short_name: …} dans game.yaml (12 caractères se voient en entier). L'icône : assets/icon.png.

3. Appli web seulement : le site se porte garant de l'appli

Android n'ouvre la page en plein écran que si le site déclare l'appli : le nom du paquet et les deux empreintes (la vôtre et celle de Google). Avec la vôtre seulement, l'appli installée depuis votre .apk marche, mais celle installée depuis Google Play s'ouvre avec une barre d'adresse (ou un choix « Ouvrir avec »).

Dans le Studio, page du jeu, partie Application Android (ou votre Claude : update_project). Le site les publie dans https://jumphp.net/.well-known/assetlinks.json. Sur votre propre serveur : https://votre-domaine/.well-known/assetlinks.json.

4. L'essayer sur un vrai téléphone

Avec le débogage USB activé et adb :

adb install -r games/mon-jeu/dist/android/mon-jeu-<version>.apk
adb shell pm get-app-links <paquet>          # appli web : « jumphp.net: verified »
adb exec-out screencap -p > capture.png      # regardez : le jeu doit être là
  • L'appli doit s'ouvrir sur l'écran titre du jeu.
  • Un .apk signé avec votre clé ne s'installe pas par-dessus la même appli venue de Google Play (INSTALL_FAILED_UPDATE_INCOMPATIBLE) : désinstallez d'abord (les sauvegardes de l'appli sont perdues).
  • L'appli web s'ouvre puis se ferme aussitôt, avec un choix « Ouvrir avec » : le téléphone a deux Chrome, en général à cause d'un espace clone / second espace / double appli (Xiaomi, Samsung…). L'appli de JumPHP demande le Chrome du profil principal, ce qui règle le cas pour les joueurs ; sur votre téléphone de test, supprimer l'espace clone efface toutes les applis qu'il contient.
  • Que le jeu s'ouvre dans Chrome ne prouve pas que l'appli marche : essayez l'appli.

5. La Play Console, la première fois

La liste « Configurer votre appli » du tableau de bord (X sur 11) montre ce qu'il reste à faire ; « Envoyer pour examen » reste grisé tant qu'il manque quelque chose.

  1. Créer l'application : nom, langue par défaut, Jeu, Gratuit, les déclarations.
  2. Contenu de l'application (Règles > Contenu de l'application), chaque déclaration :
    • Règles de confidentialité : l'adresse publique de l'étape 0 ;
    • Annonces : pas de publicité (JumPHP n'en ajoute pas) ;
    • Accès à l'application : tout est accessible sans accès particulier (pas de compte) ;
    • Public cible : les âges pour lesquels le jeu est fait. Choisir des âges de moins de 13 ans fait entrer l'appli dans le programme Familles (règles plus strictes, moins de visibilité) : ne le faites que si le jeu est vraiment fait pour les enfants ;
    • Classification du contenu (questionnaire IARC) : catégorie Jeu ; répondez honnêtement pour votre jeu (violence de dessin animé ou fantastique, sang, peur, jeux d'argent, contenus créés par les joueurs, échanges entre joueurs, localisation, achats) ;
    • Sécurité des données : un jeu JumPHP sans compte ni statistiques ne collecte et ne partage aucune donnée (les sauvegardes restent sur l'appareil ; si votre jeu appelle un service web, déclarez-le) ;
    • Identifiant publicitaire : non utilisé ;
    • Applications gouvernementales, fonctionnalités financières, santé : non.
  3. Paramètres du Play Store (Développer > Présence sur le Play Store > Paramètres) : la catégorie (Arcade, Action, Réflexion…) et l'adresse e-mail de contact. Les deux sont obligatoires : sans elles, « Your app cannot be published yet ». L'adresse est publique.
  4. Fiche principale : titre (30 caractères), description courte (80), description complète (4000), icône 512 × 512 PNG (bin/jumphp build la fait : dist/web/icon-512.png), image 1024 × 500, au moins 2 captures téléphone (bin/jumphp shot mon-jeu, agrandies d'un facteur entier, ou prises sur un téléphone). Gardez les images dans le jeu (games/mon-jeu/store/) pour les refaire aux versions suivantes.
  5. Tests : Tester et publier > Tests > Tests internes (ou Test fermé pour les 12 testeurs d'un nouveau compte) > Créer une release > le .aab > notes de version > Enregistrer > Examiner > Lancer le déploiement. Les testeurs : une liste d'adresses ; chacun ouvre le lien d'invitation connecté avec ce compte Google et touche Devenir testeur.
  6. Appli web : après ce premier envoi, ajoutez l'empreinte de la clé de Google (étape 3), installez depuis le lien de test et vérifiez le plein écran.
  7. Production : Production > Pays / régions > Ajouter, sélectionnez, Enregistrer (une release sans pays est refusée), puis Créer une release > le .aab > notes > Suivant > Enregistrer.
  8. Vue d'ensemble de la publication > Envoyer pour examen, confirmez. L'examen prend de quelques heures à 7 jours ; la console et l'e-mail du compte disent quand l'appli est en ligne.

6. Les notes de version

Un bloc par langue, les balises sur leur propre ligne :

<fr-FR>
Première version.
</fr-FR>
<en-US>
First release.
</en-US>

7. Les versions suivantes

  • Appli web : le jeu se met à jour avec le site (vous poussez, il est publié) : pas de nouvelle appli. Une nouvelle appli seulement si le nom, l'icône, les couleurs, l'adresse de départ ou le paquet changent : bin/jumphp twa mon-jeu.
  • Appli native : chaque changement du jeu est une nouvelle appli : bin/jumphp android mon-jeu --version-name 1.1.

Ensuite : committez le fichier de version, essayez l'.apk sur un téléphone, puis Play Console > la même piste > Créer une release > le nouveau .aab > notes > Envoyer pour examen. Les déclarations restent valables, sauf si le jeu change ce qu'elles décrivent (jeu en ligne, achats, données) : mettez-les à jour avant.

8. Les pièges rencontrés

Symptôme Cause, solution
L'appli s'ouvre avec une barre d'adresse il manque une empreinte (celle de Google) ou le paquet dans le site : étape 3
L'appli web s'ouvre et se ferme aussitôt deux Chrome sur le téléphone (espace clone) : étape 4
INSTALL_FAILED_UPDATE_INCOMPATIBLE l'appli installée vient de Google Play (autre clé) : désinstallez d'abord
« Code de version déjà utilisé » refabriquez (version + 1)
Google Play refuse la clé de la mise à jour clé d'envoi perdue ou recréée : restaurez la sauvegarde, ou demandez à Google de la réinitialiser
« Your app cannot be published yet » Paramètres du Play Store : catégorie et e-mail de contact
« Envoyer pour examen » grisé une étape de « Configurer votre appli » manque ; une release sans pays
« Importez au moins 1 ressource » l'image est dans la bibliothèque mais pas attachée à la fiche : ajoutez-la depuis le panneau de la bibliothèque
Un testeur n'est pas ajouté tapez l'adresse puis Entrée (la pastille), puis Enregistrer et confirmer
La politique de confidentialité est refusée son adresse répond 404 ou n'est pas publique : ouvrez-la en navigation privée

Ce que votre Claude ne fait pas sans vous

  • accepter la licence du SDK Android, les conditions de Google, ou répondre au questionnaire de classification sans vous dire ses réponses ;
  • choisir le public cible (dire que le jeu est « pour les enfants » change les règles et la visibilité) ;
  • envoyer en production sans votre accord pour cet envoi-là ;
  • supprimer un espace clone ou désinstaller une appli de votre téléphone (des données sont perdues) ;
  • mettre les clés, les mots de passe ou dist/ dans git.