O maior portal de MU Online do Brasil — desde 2003
Tutorial Intermediário Web

Como transformar o site do seu servidor de MU Online em um PWA instalável

Transforme o site do seu servidor de MU Online em um Progressive Web App instalável, com manifest, service worker, cache offline e notificações push para aumentar retenção de jogadores.

RO Rodrigo · Atualizado em 21 jan 2018 · ⏱ 14 min de leitura
Resposta rápida

O site de um servidor de MU Online normalmente concentra ranking, notícias, loja de VIP/WCoin e o painel de conta — mas a maioria ainda é consumida como um site comum, sem ícone na tela inicial e sem funcionar offline. Transformar esse site em um Progressive Web App (PWA) aproxima a experiência de u

O site de um servidor de MU Online normalmente concentra ranking, notícias, loja de VIP/WCoin e o painel de conta — mas a maioria ainda é consumida como um site comum, sem ícone na tela inicial e sem funcionar offline. Transformar esse site em um Progressive Web App (PWA) aproxima a experiência de um aplicativo nativo: o jogador instala o ícone no celular, recebe notificações push de eventos e acessa páginas já visitadas mesmo sem internet, tudo isso sem passar por loja de aplicativos. Este tutorial mostra o caminho completo — manifest, service worker, estratégia de cache e notificações — aplicado à realidade de um site de servidor de MU.

Por que vale a pena para um servidor de MU

Jogadores de MU acessam o site majoritariamente pelo celular para conferir ranking, horário de eventos (Devil Square, Castle Siege, Chaos Castle) e status da loja. Um PWA reduz a distância entre "lembrar que o servidor existe" e "abrir o site" para um único toque no ícone da tela inicial, e permite reengajar jogadores inativos via notificação push quando um evento importante está prestes a começar — uma vantagem de retenção que um site comum não oferece.

Pré-requisito obrigatório: HTTPS

Service workers só são registrados em contextos seguros. Se o domínio do seu servidor ainda serve o site em HTTP, configure um certificado (Let's Encrypt é gratuito e amplamente suportado por painéis como cPanel e Plesk) antes de qualquer outro passo deste tutorial — nenhuma das funcionalidades de PWA funcionará sem isso.

Passo 1 — Criar o arquivo manifest.json

O manifest descreve como o site se comporta quando instalado: nome, ícones, cor de tema e modo de exibição.

{
  "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 remove a barra de endereço do navegador, dando aparência de app nativo.
  • start_url com parâmetro UTM permite medir quantos acessos vêm do app instalado versus navegador comum.
  • Prepare os ícones em pelo menos duas resoluções (192x192 e 512x512), com a versão "maskable" recortável pelos diferentes formatos de ícone do Android.

Referencie o manifest no <head> de todas as páginas:

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

Passo 2 — Registrar o Service Worker

O service worker é o script que roda em segundo plano no navegador e intercepta requisições de rede, permitindo cache e funcionamento 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('Falha ao registrar SW:', err));
  });
}
</script>

Passo 3 — Definir a estratégia de cache

Nem todo conteúdo do site deve ser cacheado da mesma forma. Separe por tipo de conteúdo:

Tipo de conteúdoEstratégia recomendadaMotivo
CSS, JS, fontes, logosCache-first (usa cache, atualiza em segundo plano)Muda raramente, ganho de velocidade grande
Página de rankingNetwork-first com fallback para cacheDado dinâmico, mas útil ver a última versão offline
Página de notíciasStale-while-revalidateMostra rápido o que já tem em cache e atualiza silenciosamente
Login/painel/lojaNetwork-only, sem cacheEnvolve dados sensíveis e transações, nunca deve usar dado desatualizado

Passo 4 — Implementar o 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/painel/loja: 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;
  }

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

Crie uma página offline.html simples, com o logo do servidor e uma mensagem informando que a conexão caiu — ela aparece quando o jogador tenta acessar algo não cacheado sem internet.

Passo 5 — Configurar notificações push

Notificações push exigem um backend que gerencie inscrições e um serviço de envio (Firebase Cloud Messaging é o mais usado por sites PHP/Node por ter tier gratuito generoso). O fluxo básico:

  1. O navegador pede permissão de notificação ao jogador (Notification.requestPermission()).
  2. O service worker se inscreve em um endpoint push e recebe uma subscription única.
  3. Essa subscription é salva no banco de dados do painel, vinculada à conta do jogador.
  4. Quando um evento começa (Castle Siege, Boss especial), seu backend dispara a notificação para todas as subscriptions ativas.
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'
    })
  );
});

Passo 6 — Testar a instalabilidade

Use o Chrome DevTools (aba Application → Manifest e Application → Service Workers) para confirmar que o manifest é válido e o service worker está ativo. O Lighthouse (aba Lighthouse, categoria PWA) audita automaticamente os critérios de instalabilidade e aponta o que falta — ícones ausentes, falta de HTTPS, start_url inacessível offline são os problemas mais comuns detectados.

Diferenças de comportamento entre Android e iOS

AspectoAndroid (Chrome)iOS (Safari)
Prompt de instalaçãoAutomático, banner "Adicionar à tela inicial"Manual, via botão Compartilhar → Adicionar à Tela de Início
Notificações pushSuportadas nativamenteSuportadas apenas a partir do iOS 16.4+, e só após instalação manual
Ícone maskableSuportado, recorta conforme o launcherIgnorado, usa o ícone normal
Atualização do service workerAutomática em segundo planoPode exigir reabrir o app instalado

Métricas para acompanhar após o lançamento

Monitore, no Google Analytics ou ferramenta equivalente, o tráfego filtrado pelo parâmetro utm_source=pwa definido no start_url do manifest — isso isola quantos acessos vêm de jogadores que instalaram o app. Acompanhe também a taxa de opt-in em notificações push e a taxa de retorno de jogadores que receberam notificação de evento versus os que não instalaram o PWA; essa comparação costuma justificar rapidamente o investimento de tempo na implementação.

Erros comuns e soluções

SintomaCausa provávelSolução
Prompt de instalação não apareceSite sem HTTPS ou manifest inválidoCorrija o certificado e valide o manifest no DevTools
Login some ou trava com dado antigoService worker cacheando páginas de painel/lojaExclua essas rotas da estratégia de cache no sw.js
Ícone aparece cortado no AndroidÍcone sem versão maskableAdicione ícone 512x512 com purpose: maskable
Notificações não chegam no iOSVersão do iOS anterior a 16.4 ou app não instalado manualmenteOriente o jogador a instalar via Safari antes de habilitar notificações
Conteúdo desatualizado mesmo após updateCache antigo não invalidadoIncremente o nome do CACHE_NAME a cada deploy para forçar a limpeza

Checklist de lançamento do PWA

  • HTTPS ativo em todo o domínio do site.
  • manifest.json criado, referenciado e validado no DevTools.
  • Ícones 192x192 e 512x512 (incluindo versão maskable) publicados.
  • Service worker registrado com estratégia de cache por tipo de página.
  • Rotas de login/painel/loja excluídas do cache.
  • Página offline.html criada e testada sem conexão.
  • Notificações push configuradas e testadas em ao menos um evento real.
  • Auditoria do Lighthouse (categoria PWA) sem pendências críticas.

Com o PWA no ar, o próximo passo natural é integrar as notificações push ao seu calendário de eventos automatizado, avisando jogadores minutos antes de cada Castle Siege ou boss especial. Se o site ainda está em estágio inicial de estrutura, vale revisar o guia de criação de servidor de MU Online para alinhar o planejamento de infraestrutura web desde o começo. </content>

Perguntas frequentes

Preciso reescrever o site inteiro para virar um PWA?

Não. Um PWA é uma camada adicionada sobre o site que já existe — você inclui um arquivo manifest.json, registra um service worker e ajusta alguns detalhes de HTTPS e ícones. O HTML, CSS e backend continuam os mesmos.

O PWA funciona sem internet?

Parcialmente. Com um service worker bem configurado, páginas e recursos já visitados (ranking, notícias, itens estáticos) ficam disponíveis offline via cache. Ações que dependem do banco de dados em tempo real, como login ou compra na loja, continuam exigindo conexão.

Preciso publicar na Google Play ou App Store?

Não é obrigatório. Um PWA pode ser instalado direto do navegador (Chrome, Edge, Safari em iOS recente) sem passar por loja de aplicativos. Publicar em loja é opcional e exige um passo extra de empacotamento (TWA para Android, por exemplo).

PWA ajuda em quê na retenção de jogadores?

O ícone instalado na tela inicial do celular reduz a fricção de acesso — o jogador não precisa lembrar a URL nem buscar no navegador, só toca no ícone. Combinado com notificações push, isso aumenta significativamente o retorno de jogadores inativos aos eventos e novidades.

Preciso de HTTPS obrigatoriamente?

Sim, sem exceção. Service workers e a instalação de PWA só funcionam em conexões HTTPS (ou localhost para desenvolvimento). Se o site do seu servidor ainda roda em HTTP puro, esse é o primeiro pré-requisito a resolver.

RO
Fundador e editor-chefe

Rodrigo mantém o ViciadosMU desde os primórdios do portal. Especialista em criação e administração de servidores de MU Online, história do jogo e a evolução das seasons — escreveu boa parte do acervo antes de 2024.

Continue lendo

Artigos relacionados