El mayor portal de MU Online de Brasil — desde 2003
Tutorial Intermedio Web

Cómo transformar el sitio de tu servidor de MU Online en un PWA instalable

Transforma el sitio de tu servidor de MU Online en una Progressive Web App instalable, con manifest, service worker, caché offline y notificaciones push para aumentar la retención de jugadores.

RO Rodrigo · Actualizado el 21 ene 2018 · ⏱ 14 min de lectura
Respuesta rápida

El sitio de un servidor de MU Online normalmente concentra ranking, noticias, tienda de VIP/WCoin y el panel de cuenta — pero la mayoría todavía se consume como un sitio común, sin ícono en la pantalla de inicio y sin funcionar offline. Transformar ese sitio en una Progressive Web App (PWA) acerca l

El sitio de un servidor de MU Online normalmente concentra ranking, noticias, tienda de VIP/WCoin y el panel de cuenta — pero la mayoría todavía se consume como un sitio común, sin ícono en la pantalla de inicio y sin funcionar offline. Transformar ese sitio en una Progressive Web App (PWA) acerca la experiencia a la de una aplicación nativa: el jugador instala el ícono en el celular, recibe notificaciones push de eventos y accede a páginas ya visitadas incluso sin internet, todo esto sin pasar por una tienda de aplicaciones. Este tutorial muestra el camino completo — manifest, service worker, estrategia de caché y notificaciones — aplicado a la realidad de un sitio de servidor de MU.

Por qué vale la pena para un servidor de MU

Los jugadores de MU acceden al sitio mayoritariamente desde el celular para consultar el ranking, el horario de eventos (Devil Square, Castle Siege, Chaos Castle) y el estado de la tienda. Un PWA reduce la distancia entre "recordar que el servidor existe" y "abrir el sitio" a un solo toque en el ícono de la pantalla de inicio, y permite reenganchar a jugadores inactivos vía notificación push cuando un evento importante está por comenzar — una ventaja de retención que un sitio común no ofrece.

Requisito obligatorio: HTTPS

Los service workers solo se registran en contextos seguros. Si el dominio de tu servidor todavía sirve el sitio en HTTP, configura un certificado (Let's Encrypt es gratuito y ampliamente compatible con paneles como cPanel y Plesk) antes de cualquier otro paso de este tutorial — ninguna de las funciones de PWA funcionará sin esto.

Paso 1 — Crear el archivo manifest.json

El manifest describe cómo se comporta el sitio cuando está instalado: nombre, íconos, color de tema y modo de visualización.

{
  "name": "ViciadosMU - Servidor de MU Online",
  "short_name": "ViciadosMU",
  "start_url": "/?utm_source=pwa",
  "display": "standalone",
  "background_color": "#0d0d1a",
  "theme_color": "#c9a24b",
  "orientation": "portrait",
  "icons": [
    { "src": "/assets/icons/icon-192.png", "sizes": "192x192", "type": "image/png" },
    { "src": "/assets/icons/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
  ]
}
  • display: standalone elimina la barra de direcciones del navegador, dando apariencia de app nativa.
  • start_url con parámetro UTM permite medir cuántos accesos provienen de la app instalada versus el navegador común.
  • Prepara los íconos en al menos dos resoluciones (192x192 y 512x512), con la versión "maskable" recortable según los diferentes formatos de ícono de Android.

Referencia el manifest en el <head> de todas las páginas:

<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#c9a24b">

Paso 2 — Registrar el Service Worker

El service worker es el script que corre en segundo plano en el navegador e intercepta solicitudes de red, permitiendo caché y funcionamiento offline.

<script>
if ('serviceWorker' in navigator) {
  window.addEventListener('load', () => {
    navigator.serviceWorker.register('/sw.js')
      .then(reg => console.log('SW registrado:', reg.scope))
      .catch(err => console.error('Error al registrar SW:', err));
  });
}
</script>

Paso 3 — Definir la estrategia de caché

No todo el contenido del sitio debe cachearse de la misma forma. Sepáralo por tipo de contenido:

Tipo de contenidoEstrategia recomendadaMotivo
CSS, JS, fuentes, logosCache-first (usa caché, actualiza en segundo plano)Cambia raramente, gran ganancia de velocidad
Página de rankingNetwork-first con fallback a cachéDato dinámico, pero útil ver la última versión offline
Página de noticiasStale-while-revalidateMuestra rápido lo que ya está en caché y actualiza en silencio
Login/panel/tiendaNetwork-only, sin cachéInvolucra datos sensibles y transacciones, nunca debe usar datos desactualizados

Paso 4 — Implementar el sw.js

const CACHE_NAME = 'viciadosmu-v1';
const ASSETS_ESTATICOS = [
  '/css/style.css',
  '/js/app.js',
  '/assets/icons/icon-192.png',
  '/offline.html'
];

self.addEventListener('install', (event) => {
  event.waitUntil(
    caches.open(CACHE_NAME).then((cache) => cache.addAll(ASSETS_ESTATICOS))
  );
  self.skipWaiting();
});

self.addEventListener('activate', (event) => {
  event.waitUntil(
    caches.keys().then((chaves) =>
      Promise.all(chaves.filter((c) => c !== CACHE_NAME).map((c) => caches.delete(c)))
    )
  );
});

self.addEventListener('fetch', (event) => {
  const url = new URL(event.request.url);

  // login/panel/tienda: nunca cachear
  if (url.pathname.startsWith('/painel') || url.pathname.startsWith('/loja')) {
    return;
  }

  // estáticos: cache-first
  if (ASSETS_ESTATICOS.some((a) => url.pathname.endsWith(a))) {
    event.respondWith(
      caches.match(event.request).then((resp) => resp || fetch(event.request))
    );
    return;
  }

  // demás páginas: network-first con fallback offline
  event.respondWith(
    fetch(event.request).catch(() => caches.match(event.request).then((r) => r || caches.match('/offline.html')))
  );
});

Crea una página offline.html simple, con el logo del servidor y un mensaje informando que la conexión se cayó — aparece cuando el jugador intenta acceder a algo no cacheado sin internet.

Paso 5 — Configurar notificaciones push

Las notificaciones push requieren un backend que gestione las suscripciones y un servicio de envío (Firebase Cloud Messaging es el más usado por sitios PHP/Node por tener un nivel gratuito generoso). El flujo básico:

  1. El navegador pide permiso de notificación al jugador (Notification.requestPermission()).
  2. El service worker se suscribe a un endpoint push y recibe una subscription única.
  3. Esa subscription se guarda en la base de datos del panel, vinculada a la cuenta del jugador.
  4. Cuando un evento comienza (Castle Siege, Boss especial), tu backend dispara la notificación a todas las subscriptions activas.
self.addEventListener('push', (event) => {
  const dados = event.data.json();
  event.waitUntil(
    self.registration.showNotification(dados.titulo, {
      body: dados.corpo,
      icon: '/assets/icons/icon-192.png',
      badge: '/assets/icons/badge-72.png'
    })
  );
});

Paso 6 — Probar la instalabilidad

Usa Chrome DevTools (pestaña Application → Manifest y Application → Service Workers) para confirmar que el manifest es válido y el service worker está activo. Lighthouse (pestaña Lighthouse, categoría PWA) audita automáticamente los criterios de instalabilidad y señala lo que falta — íconos faltantes, falta de HTTPS, start_url inaccesible offline son los problemas más comunes detectados.

Diferencias de comportamiento entre Android e iOS

AspectoAndroid (Chrome)iOS (Safari)
Prompt de instalaciónAutomático, banner "Agregar a la pantalla de inicio"Manual, vía botón Compartir → Agregar a la pantalla de inicio
Notificaciones pushCompatibles de forma nativaCompatibles solo desde iOS 16.4+, y solo tras instalación manual
Ícono maskableCompatible, se recorta según el launcherIgnorado, usa el ícono normal
Actualización del service workerAutomática en segundo planoPuede requerir reabrir la app instalada

Métricas para seguir después del lanzamiento

Monitorea, en Google Analytics o herramienta equivalente, el tráfico filtrado por el parámetro utm_source=pwa definido en el start_url del manifest — esto aísla cuántos accesos provienen de jugadores que instalaron la app. Sigue también la tasa de opt-in en notificaciones push y la tasa de retorno de jugadores que recibieron notificación de evento versus los que no instalaron el PWA; esta comparación suele justificar rápidamente la inversión de tiempo en la implementación.

Errores comunes y soluciones

SíntomaCausa probableSolución
El prompt de instalación no apareceSitio sin HTTPS o manifest inválidoCorrige el certificado y valida el manifest en DevTools
El login desaparece o se traba con datos antiguosService worker cacheando páginas de panel/tiendaExcluye esas rutas de la estrategia de caché en el sw.js
El ícono aparece recortado en AndroidÍcono sin versión maskableAgrega ícono 512x512 con purpose: maskable
Las notificaciones no llegan en iOSVersión de iOS anterior a 16.4 o app no instalada manualmenteIndica al jugador que instale vía Safari antes de habilitar notificaciones
Contenido desactualizado incluso después de una actualizaciónCaché antigua no invalidadaIncrementa el nombre del CACHE_NAME en cada despliegue para forzar la limpieza

Lista de verificación de lanzamiento del PWA

  • HTTPS activo en todo el dominio del sitio.
  • manifest.json creado, referenciado y validado en DevTools.
  • Íconos 192x192 y 512x512 (incluyendo versión maskable) publicados.
  • Service worker registrado con estrategia de caché por tipo de página.
  • Rutas de login/panel/tienda excluidas de la caché.
  • Página offline.html creada y probada sin conexión.
  • Notificaciones push configuradas y probadas en al menos un evento real.
  • Auditoría de Lighthouse (categoría PWA) sin pendientes críticos.

Con el PWA en funcionamiento, el siguiente paso natural es integrar las notificaciones push a tu calendario de eventos automatizado, avisando a los jugadores minutos antes de cada Castle Siege o boss especial. Si el sitio todavía está en etapa inicial de estructura, vale la pena revisar la guía de creación de servidor de MU Online para alinear la planificación de infraestructura web desde el comienzo. </content>

Preguntas frecuentes

¿Necesito reescribir todo el sitio para convertirlo en un PWA?

No. Un PWA es una capa que se agrega sobre el sitio que ya existe — incluyes un archivo manifest.json, registras un service worker y ajustas algunos detalles de HTTPS e íconos. El HTML, CSS y backend siguen siendo los mismos.

¿El PWA funciona sin internet?

Parcialmente. Con un service worker bien configurado, las páginas y recursos ya visitados (ranking, noticias, ítems estáticos) quedan disponibles offline vía caché. Las acciones que dependen de la base de datos en tiempo real, como el login o una compra en la tienda, siguen requiriendo conexión.

¿Necesito publicar en Google Play o App Store?

No es obligatorio. Un PWA puede instalarse directamente desde el navegador (Chrome, Edge, Safari en iOS reciente) sin pasar por una tienda de aplicaciones. Publicar en una tienda es opcional y exige un paso extra de empaquetado (TWA para Android, por ejemplo).

¿En qué ayuda el PWA a la retención de jugadores?

El ícono instalado en la pantalla de inicio del celular reduce la fricción de acceso — el jugador no necesita recordar la URL ni buscar en el navegador, solo toca el ícono. Combinado con notificaciones push, esto aumenta significativamente el regreso de jugadores inactivos a los eventos y novedades.

¿Necesito HTTPS obligatoriamente?

Sí, sin excepción. Los service workers y la instalación de PWA solo funcionan en conexiones HTTPS (o localhost para desarrollo). Si el sitio de tu servidor todavía funciona en HTTP puro, ese es el primer requisito a resolver.

RO
Fundador y editor jefe

Rodrigo mantiene ViciadosMU desde los inicios del portal. Especialista en creación y administración de servidores de MU Online, historia del juego y la evolución de las seasons — escribió buena parte del archivo antes de 2024.

Sigue leyendo

Artículos relacionados