Publiceren op de Play Store, stap voor stap
De complete handleiding om een JumPHP-game op Google Play te zetten en er te houden: wat je moet bouwen, wat je moet bewaren, wat je op een telefoon moet controleren, en de Play Console van begin tot eind. Ze geldt voor beide soorten app:
| De webapp (Op Google Play) | De native app (Native Android-app) | |
|---|---|---|
| Commando | bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu |
bin/jumphp android mon-jeu |
| Wat het is | de pagina van de game in Chrome, op volledig scherm | PHP, SDL en de game in de app, zonder netwerk |
| De game wordt bijgewerkt | met de site, meteen (geen nieuwe app) | met een nieuwe versie van de app |
Je Claude kent deze handleiding (ze staat in de AGENTS.md van je project, en docs/google-play.md): vraag hem
“zet mijn game op Google Play”. Hij doet het technische werk; de keuzes en de uploads blijven aan jou (zie het einde).
0. Voordat je begint
- Een Google Play-ontwikkelaarsaccount: play.google.com/console, eenmalig 25 $, met een identiteitscontrole. Het is jouw account: jij accepteert de voorwaarden van Google.
- Een nieuw persoonlijk account moet een gesloten test met minstens 12 testers gedurende 14 dagen doen voordat het in productie mag publiceren. Begin daar vroeg mee.
- De pakketnaam (
io.github.<je github-account>.<mon_jeu>): de identificatie van de app op Google Play. Hij verandert nooit meer. Het commando vraagt ernaar de eerste keer. - De licentie van de Android-SDK: jij accepteert die, in je terminal, de eerste keer (de SDK, ~1 GB,
komt in
~/.jumphp). Je Claude vraagt je het commando zelf uit te voeren (! bin/jumphp twa …). - Een privacybeleid op een openbaar adres: Google vraagt erom, ook als de game niets verzamelt.
Een korte pagina volstaat: de game verzamelt, verstuurt en deelt geen enkele persoonlijke data; geen account, geen
advertenties, geen tracking; instellingen en opgeslagen games blijven op het apparaat; een contactadres.
Zet haar in de site van de game,
games/mon-jeu/site/privacy.html: ze wordt geserveerd ophttps://play.jumphp.net/mon-jeu/privacy.html(of dePRIVACY.mdvan je openbare repository). Open het adres één keer voordat je het aan Google geeft: een 404-fout blokkeert de beoordeling.
1. De sleutels: maak er eerst een back-up van
De eerste build maakt je uploadsleutel aan: ~/.jumphp/android/keys/<pakket>.keystore en zijn wachtwoord
in <pakket>.env.
- Nooit in git, ook niet in een notitie of bericht. Bewaar beide bestanden elders (wachtwoordmanager, versleutelde schijf). Zonder hen maakt een nieuwe build een andere sleutel aan en weigert Google Play de update.
- Met de app-ondertekening door Google Play (standaard) bewaart Google zijn eigen sleutel, die de app op telefoons ondertekent. De jouwe bewijst alleen dat de uploads van jou komen; als je hem kwijtraakt, kan Google hem vervangen (Instellen > App-ondertekening), maar dat duurt dagen.
- Er zijn dus twee SHA-256-vingerafdrukken: die van je sleutel (getoond door het commando) en die van de sleutel van Google (Play Console > Instellen > App-ondertekening, na de eerste upload).
2. De app bouwen
bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu # de webapp
bin/jumphp android mon-jeu # of de native app
- Elke build verhoogt het versienummer met 1 (Google Play weigert een al geüpload nummer; een mislukte poging verbruikt een nummer, dat is niet erg).
- Commit het versiebestand meteen:
games/mon-jeu/android/twa-manifest.json(webapp) ofgames/mon-jeu/android/app.json(native app). Nooitdist/. - De naam onder het pictogram:
pwa: {short_name: …}ingame.yaml(12 tekens zijn volledig zichtbaar). Het pictogram:assets/icon.png.
3. Alleen webapp: de site staat borg voor de app
Android opent de pagina alleen op volledig scherm als de site de app declareert: de pakketnaam en beide
vingerafdrukken (de jouwe en die van Google). Met alleen de jouwe werkt de app die vanuit je .apk is geïnstalleerd,
maar die vanuit Google Play geïnstalleerd is opent met een adresbalk (of een keuze “Openen met”).
In de Studio, pagina van de game, bij Android-app (of je Claude: update_project). De site publiceert ze
in https://jumphp.net/.well-known/assetlinks.json. Op je eigen server:
https://jouw-domein/.well-known/assetlinks.json.
4. Uitproberen op een echte telefoon
Met USB-foutopsporing aan en adb:
adb install -r games/mon-jeu/dist/android/mon-jeu-<version>.apk
adb shell pm get-app-links <pakket> # webapp: “jumphp.net: verified”
adb exec-out screencap -p > capture.png # kijk: de game moet er zijn
- De app moet openen op het titelscherm van de game.
- Een
.apkondertekend met je sleutel installeert niet over dezelfde app heen die van Google Play komt (INSTALL_FAILED_UPDATE_INCOMPATIBLE): verwijder eerst de bestaande app (de opgeslagen games van de app gaan verloren). - De webapp opent en sluit meteen weer, met een keuze “Openen met”: de telefoon heeft twee Chromes, meestal door een kloonruimte / tweede ruimte / dubbele app (Xiaomi, Samsung…). De app van JumPHP vraagt de Chrome van het hoofdprofiel, wat het geval voor spelers oplost; op je testtelefoon wist het verwijderen van de kloonruimte alle apps die erin staan.
- Dat de game in Chrome opent bewijst niet dat de app werkt: probeer de app.
5. De Play Console, de eerste keer
De lijst “Je app instellen” van het dashboard (X van 11) toont wat er nog te doen is; “Verzenden voor beoordeling” blijft grijs zolang er iets ontbreekt.
- De app maken: naam, standaardtaal, Game, Gratis, de verklaringen.
- App-content (Beleid > App-content), elke verklaring:
- Privacybeleid: het openbare adres uit stap 0;
- Advertenties: geen advertenties (JumPHP voegt er geen toe);
- Toegang tot de app: alles is toegankelijk zonder bijzondere toegang (geen account);
- Doelgroep: de leeftijden waarvoor de game is gemaakt. Leeftijden onder 13 kiezen brengt de app in het programma Gezinnen (strengere regels, minder zichtbaarheid): doe dat alleen als de game echt voor kinderen is gemaakt;
- Contentclassificatie (IARC-vragenlijst): categorie Game; antwoord eerlijk voor je game (tekenfilm- of fantasygeweld, bloed, angst, gokken, door spelers gemaakte content, uitwisseling tussen spelers, locatie, aankopen);
- Gegevensbeveiliging: een JumPHP-game zonder account of statistieken verzamelt en deelt geen enkele data (opgeslagen games blijven op het apparaat; als je game een webservice aanroept, geef dat dan aan);
- Advertentie-ID: niet gebruikt;
- Overheidsapps, financiële functies, gezondheid: nee.
- Play Store-instellingen (Groeien > Aanwezigheid in de Play Store > Instellingen): de categorie (Arcade, Actie, Puzzel…) en het contact-e-mailadres. Beide zijn verplicht: zonder hen, “Your app cannot be published yet”. Het adres is openbaar.
- Hoofdvermelding: titel (30 tekens), korte beschrijving (80), volledige beschrijving (4000), pictogram
512 × 512 PNG (
bin/jumphp buildmaakt het:dist/web/icon-512.png), afbeelding van 1024 × 500, minstens 2 screenshots voor telefoon (bin/jumphp shot mon-jeu, vergroot met een geheel getal, of gemaakt op een telefoon). Bewaar de afbeeldingen in de game (games/mon-jeu/store/) om ze bij volgende versies opnieuw te maken. - Tests: Testen en publiceren > Tests > Interne tests (of Gesloten test voor de 12 testers van een nieuw
account) > Release maken > de
.aab> releaseopmerkingen > Opslaan > Beoordelen > Uitrol starten. De testers: een lijst met adressen; iedereen opent de uitnodigingslink ingelogd met dat Google-account en tikt op Tester worden. - Webapp: voeg na deze eerste upload de vingerafdruk van de sleutel van Google toe (stap 3), installeer via de testlink en controleer het volledige scherm.
- Productie: Productie > Landen / regio's > Toevoegen, selecteer, Opslaan (een release zonder landen wordt
geweigerd), daarna Release maken > de
.aab> opmerkingen > Volgende > Opslaan. - Overzicht van de publicatie > Verzenden voor beoordeling, bevestig. De beoordeling duurt enkele uren tot 7 dagen; de console en de e-mail van het account laten weten wanneer de app online staat.
6. De releaseopmerkingen
Eén blok per taal, de tags elk op hun eigen regel:
<fr-FR>
Première version.
</fr-FR>
<en-US>
First release.
</en-US>
<nl-NL>
Eerste versie.
</nl-NL>
7. De volgende versies
- Webapp: de game wordt bijgewerkt met de site (jij pusht, hij wordt gepubliceerd): geen nieuwe app. Alleen een
nieuwe app als de naam, het pictogram, de kleuren, het startadres of het pakket veranderen:
bin/jumphp twa mon-jeu. - Native app: elke wijziging van de game is een nieuwe app:
bin/jumphp android mon-jeu --version-name 1.1.
Daarna: commit het versiebestand, probeer de .apk op een telefoon, dan Play Console > hetzelfde spoor >
Release maken > de nieuwe .aab > opmerkingen > Verzenden voor beoordeling. De verklaringen blijven geldig, tenzij de
game verandert wat ze beschrijven (online game, aankopen, data): werk ze dan eerst bij.
8. De valkuilen die we tegenkwamen
| Symptoom | Oorzaak, oplossing |
|---|---|
| De app opent met een adresbalk | er ontbreekt een vingerafdruk (die van Google) of het pakket in de site: stap 3 |
| De webapp opent en sluit meteen weer | twee Chromes op de telefoon (kloonruimte): stap 4 |
INSTALL_FAILED_UPDATE_INCOMPATIBLE |
de geïnstalleerde app komt van Google Play (andere sleutel): verwijder hem eerst |
| “Versiecode al gebruikt” | bouw opnieuw (versie + 1) |
| Google Play weigert de sleutel van de update | uploadsleutel kwijt of opnieuw gemaakt: herstel de back-up, of vraag Google hem opnieuw in te stellen |
| “Your app cannot be published yet” | Play Store-instellingen: categorie en contact-e-mail |
| “Verzenden voor beoordeling” grijs | een stap van “Je app instellen” ontbreekt; een release zonder landen |
| “Upload minstens 1 asset” | de afbeelding staat in de bibliotheek maar is niet aan de vermelding gekoppeld: voeg haar toe vanuit het paneel van de bibliotheek |
| Een tester wordt niet toegevoegd | typ het adres en dan Enter (het label), daarna Opslaan en bevestigen |
| Het privacybeleid wordt geweigerd | het adres geeft 404 of is niet openbaar: open het in een privévenster |
Wat je Claude niet zonder jou doet
- de licentie van de Android-SDK accepteren, de voorwaarden van Google, of de classificatievragenlijst beantwoorden zonder je zijn antwoorden te vertellen;
- de doelgroep kiezen (zeggen dat de game “voor kinderen” is verandert de regels en de zichtbaarheid);
- naar productie sturen zonder jouw akkoord voor precies die upload;
- een kloonruimte verwijderen of een app van je telefoon verwijderen (er gaat data verloren);
- de sleutels, wachtwoorden of
dist/in git zetten.