Publicar en Play Store, paso a paso
El manual completo para poner un juego JumPHP en Google Play y mantenerlo allí: qué hay que fabricar, qué hay que guardar, qué hay que comprobar en un móvil y Play Console de principio a fin. Vale para los dos tipos de app:
| La app web (En Google Play) | La app nativa (App de Android nativa) | |
|---|---|---|
| Comando | bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu |
bin/jumphp android mon-jeu |
| Qué es | la página del juego en Chrome, a pantalla completa | PHP, SDL y el juego dentro de la app, sin red |
| El juego se actualiza | con el sitio, al instante (sin app nueva) | con una nueva versión de la app |
Tu Claude conoce esta guía (está en el AGENTS.md de tu proyecto, y en docs/google-play.md): pídele
«pon mi juego en Google Play». Él se ocupa de lo técnico; las decisiones y los envíos siguen siendo tuyos (consulta el final).
0. Antes de empezar
- Una cuenta de desarrollador de Google Play: play.google.com/console, 25 $ una sola vez, con una verificación de identidad. Es tu cuenta: eres tú quien acepta las condiciones de Google.
- Una cuenta personal nueva debe hacer una prueba cerrada con al menos 12 testers durante 14 días antes de poder publicar en producción. Empieza pronto.
- El nombre del paquete (
io.github.<tu cuenta de github>.<mi_juego>): el identificador de la app en Google Play. No cambia nunca más. El comando lo pregunta la primera vez. - La licencia del SDK de Android: tú la aceptas, en tu terminal, la primera vez (el SDK, ~1 GB,
va a
~/.jumphp). Tu Claude te pide que ejecutes tú mismo el comando (! bin/jumphp twa …). - Una política de privacidad en una dirección pública: Google la pide aunque el juego no recopile nada.
Basta una página corta: el juego no recopila, envía ni comparte ningún dato personal; sin cuenta, sin
publicidad, sin seguimiento; los ajustes y las partidas guardadas se quedan en el dispositivo; una dirección de contacto.
Ponla en el sitio del juego,
games/mon-jeu/site/privacy.html: se sirve enhttps://play.jumphp.net/mon-jeu/privacy.html(o elPRIVACY.mdde tu repositorio público). Abre la dirección una vez antes de dársela a Google: un error 404 bloquea la revisión.
1. Las claves: haz una copia de seguridad primero
La primera fabricación crea tu clave de subida: ~/.jumphp/android/keys/<paquete>.keystore y su contraseña
en <paquete>.env.
- Nunca en git, ni en una nota o un mensaje. Guarda los dos archivos en otro sitio (gestor de contraseñas, disco cifrado). Sin ellos, una nueva fabricación crea otra clave y Google Play rechaza la actualización.
- Con la firma de aplicaciones de Google Play (por defecto), Google guarda su propia clave, la que firma la app en los móviles. La tuya solo demuestra que los envíos vienen de ti; si la pierdes, Google puede sustituirla (Configuración > Firma de aplicaciones), pero lleva días.
- Hay por tanto dos huellas SHA-256: la de tu clave (la muestra el comando) y la de la clave de Google (Play Console > Configuración > Firma de aplicaciones, tras el primer envío).
2. Fabricar la app
bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu # la app web
bin/jumphp android mon-jeu # o la app nativa
- Cada fabricación hace número de versión + 1 (Google Play rechaza un número ya enviado; un intento fallido consume un número, no pasa nada).
- Haz el commit enseguida del archivo de versión:
games/mon-jeu/android/twa-manifest.json(app web) ogames/mon-jeu/android/app.json(app nativa). Nuncadist/. - El nombre bajo el icono:
pwa: {short_name: …}engame.yaml(12 caracteres se ven enteros). El icono:assets/icon.png.
3. Solo app web: el sitio avala la app
Android solo abre la página a pantalla completa si el sitio declara la app: el nombre del paquete y las dos
huellas (la tuya y la de Google). Solo con la tuya, la app instalada desde tu .apk funciona,
pero la instalada desde Google Play se abre con una barra de direcciones (o una opción «Abrir con»).
En el Studio, página del juego, apartado Aplicación Android (o tu Claude: update_project). El sitio las
publica en https://jumphp.net/.well-known/assetlinks.json. En tu propio servidor:
https://tu-dominio/.well-known/assetlinks.json.
4. Probarla en un móvil de verdad
Con la depuración USB activada y adb:
adb install -r games/mon-jeu/dist/android/mon-jeu-<version>.apk
adb shell pm get-app-links <paquete> # app web: «jumphp.net: verified»
adb exec-out screencap -p > capture.png # mira: el juego tiene que estar ahí
- La app debe abrirse en la pantalla de título del juego.
- Un
.apkfirmado con tu clave no se instala encima de la misma app procedente de Google Play (INSTALL_FAILED_UPDATE_INCOMPATIBLE): desinstala primero (se pierden las partidas guardadas de la app). - La app web se abre y se cierra enseguida, con una opción «Abrir con»: el móvil tiene dos Chrome, normalmente por un espacio clon / segundo espacio / app dual (Xiaomi, Samsung…). La app de JumPHP pide el Chrome del perfil principal, lo que lo resuelve para los jugadores; en tu móvil de pruebas, eliminar el espacio clon borra todas las apps que contiene.
- Que el juego se abra en Chrome no demuestra que la app funcione: prueba la app.
5. Play Console, la primera vez
La lista «Configura tu aplicación» del panel (X de 11) muestra lo que queda por hacer; «Enviar a revisión» sigue en gris mientras falte algo.
- Crear la aplicación: nombre, idioma predeterminado, Juego, Gratis, las declaraciones.
- Contenido de la aplicación (Políticas > Contenido de la aplicación), cada declaración:
- Política de privacidad: la dirección pública del paso 0;
- Anuncios: sin publicidad (JumPHP no añade ninguna);
- Acceso a la aplicación: todo es accesible sin acceso especial (sin cuenta);
- Público objetivo: las edades para las que se ha hecho el juego. Elegir edades de menos de 13 años mete la app en el programa Familias (reglas más estrictas, menos visibilidad): hazlo solo si el juego está realmente hecho para niños;
- Clasificación del contenido (cuestionario IARC): categoría Juego; responde con sinceridad para tu juego (violencia de dibujos animados o fantástica, sangre, miedo, juegos de azar, contenido creado por los jugadores, intercambios entre jugadores, ubicación, compras);
- Seguridad de los datos: un juego JumPHP sin cuenta ni estadísticas no recopila ni comparte ningún dato (las partidas guardadas se quedan en el dispositivo; si tu juego llama a un servicio web, decláralo);
- ID de publicidad: no se usa;
- Apps gubernamentales, funciones financieras, salud: no.
- Ajustes de Play Store (Crecer > Presencia en Play Store > Ajustes): la categoría (Arcade, Acción, Puzles…) y el correo electrónico de contacto. Ambos son obligatorios: sin ellos, «Your app cannot be published yet». El correo es público.
- Ficha principal: título (30 caracteres), descripción corta (80), descripción completa (4000), icono
512 × 512 PNG (
bin/jumphp buildlo crea:dist/web/icon-512.png), imagen de 1024 × 500, al menos 2 capturas de móvil (bin/jumphp shot mon-jeu, ampliadas con un factor entero, o hechas en un móvil). Guarda las imágenes en el juego (games/mon-jeu/store/) para rehacerlas en las versiones siguientes. - Pruebas: Probar y publicar > Pruebas > Pruebas internas (o Prueba cerrada para los 12 testers de una cuenta
nueva) > Crear versión > el
.aab> notas de la versión > Guardar > Revisar > Iniciar el despliegue. Los testers: una lista de direcciones; cada uno abre el enlace de invitación con esa cuenta de Google y toca Ser tester. - App web: tras este primer envío, añade la huella de la clave de Google (paso 3), instala desde el enlace de prueba y comprueba la pantalla completa.
- Producción: Producción > Países / regiones > Añadir, selecciona, Guardar (una versión sin países
se rechaza), y después Crear versión > el
.aab> notas > Siguiente > Guardar. - Resumen de publicación > Enviar a revisión, confirma. La revisión tarda de unas horas a 7 días; la consola y el correo de la cuenta avisan cuando la app está online.
6. Las notas de la versión
Un bloque por idioma, con las etiquetas en su propia línea:
<es-ES>
Primera versión.
</es-ES>
<en-US>
First release.
</en-US>
7. Las versiones siguientes
- App web: el juego se actualiza con el sitio (haces push y se publica): no hay app nueva. Una
app nueva solo si cambian el nombre, el icono, los colores, la dirección de inicio o el paquete:
bin/jumphp twa mon-jeu. - App nativa: cada cambio del juego es una app nueva:
bin/jumphp android mon-jeu --version-name 1.1.
Después: haz el commit del archivo de versión, prueba el .apk en un móvil y luego Play Console > la misma pista >
Crear versión > el nuevo .aab > notas > Enviar a revisión. Las declaraciones siguen siendo válidas, salvo que el
juego cambie lo que describen (juego online, compras, datos): actualízalas antes.
8. Las trampas encontradas
| Síntoma | Causa, solución |
|---|---|
| La app se abre con una barra de direcciones | falta una huella (la de Google) o el paquete en el sitio: paso 3 |
| La app web se abre y se cierra enseguida | dos Chrome en el móvil (espacio clon): paso 4 |
INSTALL_FAILED_UPDATE_INCOMPATIBLE |
la app instalada viene de Google Play (otra clave): desinstala primero |
| «El código de versión ya se ha usado» | vuelve a fabricar (versión + 1) |
| Google Play rechaza la clave de la actualización | clave de subida perdida o recreada: restaura la copia de seguridad, o pide a Google que la restablezca |
| «Your app cannot be published yet» | Ajustes de Play Store: categoría y correo de contacto |
| «Enviar a revisión» en gris | falta un paso de «Configura tu aplicación»; una versión sin países |
| «Sube al menos 1 recurso» | la imagen está en la biblioteca pero no adjunta a la ficha: añádela desde el panel de la biblioteca |
| No se añade un tester | escribe la dirección y pulsa Intro (la etiqueta), luego Guardar y confirmar |
| Se rechaza la política de privacidad | su dirección da 404 o no es pública: ábrela en una ventana de incógnito |
Lo que tu Claude no hace sin ti
- aceptar la licencia del SDK de Android, las condiciones de Google, o responder al cuestionario de clasificación sin decirte sus respuestas;
- elegir el público objetivo (decir que el juego es «para niños» cambia las reglas y la visibilidad);
- enviar a producción sin tu acuerdo para ese envío en concreto;
- eliminar un espacio clon o desinstalar una app de tu móvil (se pierden datos);
- poner las claves, las contraseñas o
dist/en git.