ES

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 en https://play.jumphp.net/mon-jeu/privacy.html (o el PRIVACY.md de 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) o games/mon-jeu/android/app.json (app nativa). Nunca dist/.
  • El nombre bajo el icono: pwa: {short_name: …} en game.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 .apk firmado 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.

  1. Crear la aplicación: nombre, idioma predeterminado, Juego, Gratis, las declaraciones.
  2. 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.
  3. 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.
  4. Ficha principal: título (30 caracteres), descripción corta (80), descripción completa (4000), icono 512 × 512 PNG (bin/jumphp build lo 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.