Una lista remota sin servidor para «Más juegos»: un archivo JSON en GitHub Pages
Por Nesim Razon, desarrollador Android independiente · 2026-11-14
Cada uno de mis juegos tiene una ventana «Más juegos» que promociona a los demás. Durante un tiempo esa lista estaba metida en cada app, lo que significaba que publicar un juego nuevo obligaba a actualizar todos los antiguos. La sustituí por un único archivo JSON en GitHub Pages. Así funciona y estos son los límites que lo mantienen seguro.
El problema de una lista dentro de la app
Una lista incorporada en la app es fácil de escribir y dolorosa de mantener. Cada juego nuevo significaba código nuevo, iconos nuevos y una versión nueva de cada juego antiguo, y cada una de esas versiones pasa por revisión. Con una docena de juegos, la ventana de promoción era la parte más lenta de cada lanzamiento.
Un archivo en GitHub Pages
La lista es ahora un archivo estático junto a mi web, más un pequeño icono por juego. Cada entrada tiene una clave corta, el nombre del juego, el nombre de paquete de Android, una ruta de icono y una descripción por idioma. Las apps leen la descripción en el idioma del teléfono y recurren al inglés si falta.
Un pequeño script construye el archivo. Tiene una línea por juego, redimensiona cada icono a un tamaño pequeño fijo y escribe todo. Añadir un juego es añadir una línea, ejecutar el script y enviar. Ninguna de las apps antiguas necesita una versión para eso.
Cómo la usa la app
Como máximo una vez cada 48 horas, la app descarga la lista en un hilo en segundo plano y la guarda en el teléfono. La ventana lee siempre la copia guardada. Si el teléfono nunca ha estado en línea, o el archivo está dañado, la app recurre a una copia de la lista y de los iconos que viene dentro de la propia app.
Una entrada cuyo icono no está disponible se omite en lugar de mostrar un cuadrado gris, y el juego nunca se lista a sí mismo.
Comprobaciones que lo mantienen seguro
La lista solo puede abrir una página de tienda, pero aun así la trato como entrada no fiable.
- Las descargas solo se aceptan por https y solo desde mi propio sitio.
- La lista no puede pesar más de 64 KB ni un icono más de 256 KB.
- Se leen como máximo 40 entradas.
- Cada clave y cada nombre de paquete deben cumplir un patrón estricto antes de usarse.
- Un archivo dañado nunca reemplaza a uno que funciona: los errores de análisis recurren a la copia incluida.
Escribir en el orden correcto
La app descarga y guarda primero los iconos y solo después guarda el archivo de la lista. Así la lista guardada nunca apunta a un icono que falta. Al guardarse la lista nueva cambia un pequeño contador para que una ventana abierta se actualice sola, lo que arregló el caso en que la primera apertura mostraba una ventana vacía.
Qué seguiría cambiando
Un juego nuevo aparece tras la siguiente actualización, que puede tardar hasta dos días más la próxima vez que se abra la ventana, así que no es instantáneo. La lista no cuenta usos por sí misma; los clics los cuentan las apps. Y todo depende de un único servidor, por eso importa la copia incluida.
Preguntas frecuentes
¿Añadir un juego nuevo exige actualizar las apps antiguas?
No. Las apps leen la lista de un archivo JSON en línea, así que basta añadir una línea al archivo y publicarlo.
¿Qué pasa cuando el teléfono está sin conexión?
La app usa la última copia guardada, o una copia incluida en la app si nunca ha descargado la lista.
¿Con qué frecuencia actualiza la app la lista?
Como máximo una vez cada 48 horas, en un hilo en segundo plano.
¿Se puede abusar de la lista para abrir algo dañino?
Solo puede abrir páginas de tienda, y las descargas, los tamaños, las claves y los nombres de paquete se comprueban antes de usarse.
Más del blog
- Por qué mi enlace de la App Store dio 404 y la página mostraba capturas de 2018
- Guía 2.1 de App Store «Information Needed»: lo que envié
- Capturas de App Store sin teléfono: Robolectric, un cargador de imágenes falso y un navegador sin interfaz
- Un código QR para dos tiendas de apps: una pequeña página de redirección
- Reescribir para Kotlin Multiplatform sin cambiar el comportamiento: el código antiguo como oráculo de pruebas
- Depurar un iPhone desde Windows por USB: capturas y registros con Python