Notificações Push em PWA

PWA
Tempo de leitura: 4 minutos

As Notificações Push são o recurso final que permite que um Progressive Web App (PWA) transcenda a experiência de navegação e se integre ao sistema operacional. Elas possibilitam que seu PWA receba mensagens em tempo real e alerta o usuário sobre novos conteúdos ou eventos, mesmo quando o aplicativo está fechado ou o navegador não está ativo.

Esta funcionalidade é totalmente habilitada pelo Service Worker (SW).

1. ⚙️ Arquitetura das Notificações Push

O sistema de Notificações Push envolve quatro componentes principais que trabalham em conjunto:

  1. A PWA (Cliente): O código JavaScript que solicita permissão e gera a chave de assinatura.
  2. Service Worker (SW): O ouvinte em segundo plano que intercepta a mensagem push e a exibe como uma notificação.
  3. Serviço Push: O servidor de mensagens do navegador (ex: FCM do Google, APNs da Apple), que recebe a mensagem do seu servidor e a entrega ao dispositivo.
  4. Servidor da Aplicação: O seu backend (API) que armazena a chave de assinatura do usuário e envia a mensagem de notificação para o Serviço Push.

2. 🔑 Habilitando Notificações: Inscrição e Permissão

O processo de envio de uma notificação começa com a inscrição do usuário e a solicitação de permissão.

A. Solicitando Permissão

O acesso à API de Notificações Push requer a permissão explícita do usuário. Esta solicitação deve ser feita de forma contextualizada (após o usuário demonstrar interesse).

JavaScript

// Frontend JavaScript (no lado da aplicação)
function subscribeUser() {
  if ('Notification' in window) {
    Notification.requestPermission().then(permission => {
      if (permission === 'granted') {
        // Prossegue para a inscrição
        subscribeToPushService(); 
      } else {
        console.log('Permissão de notificação negada.');
      }
    });
  }
}

B. Inscrição e Chave VAPID

Após a permissão ser concedida, o PWA usa o Service Worker para se inscrever no Serviço Push do navegador, gerando um objeto PushSubscription.

Este objeto contém o endpoint (o endereço único do Serviço Push) e a chave pública de criptografia, essenciais para enviar a mensagem.

JavaScript

// O Service Worker é a base para a inscrição
function subscribeToPushService() {
  navigator.serviceWorker.ready.then(registration => {
    // Chave VAPID pública (necessária para autenticação)
    const applicationServerKey = urlBase64ToUint8Array('SUA_CHAVE_VAPID_PUBLICA'); 

    registration.pushManager.subscribe({
      userVisibleOnly: true, // Requisito: a notificação deve ser visível
      applicationServerKey: applicationServerKey
    })
    .then(subscription => {
      // 1. Envie este objeto 'subscription' (endpoint e keys) para o seu servidor
      sendSubscriptionToServer(subscription); 
      console.log('Usuário inscrito com sucesso:', subscription);
    });
  });
}

3. 🛡️ Interceptando e Exibindo a Notificação

O Service Worker é o único componente que pode interceptar o evento push do servidor, mesmo quando o PWA está fechado.

A. O Evento push (No Service Worker)

O SW ouve o evento push. Quando a mensagem do servidor chega:

JavaScript

// service-worker.js
self.addEventListener('push', (event) => {
  // O payload da mensagem push (dados do seu servidor)
  const data = event.data.json(); 
  
  const title = data.title || 'Nova Mensagem';
  const options = {
    body: data.body || 'Você tem uma atualização.',
    icon: '/icons/icon-192x192.png', // Ícone exibido na notificação
    badge: '/icons/badge.png', // Ícone exibido na barra de status (Android)
    data: { url: data.url } // Dados adicionais para usar no clique
  };

  // Exibe a notificação na tela do usuário
  event.waitUntil(self.registration.showNotification(title, options));
});

B. O Evento notificationclick (No Service Worker)

Quando o usuário clica na notificação, o SW intercepta o evento e pode executar ações, como abrir o PWA em uma URL específica.

JavaScript

// service-worker.js
self.addEventListener('notificationclick', (event) => {
  event.notification.close(); // Fecha a notificação

  // Recupera a URL de destino
  const targetUrl = event.notification.data.url || '/'; 

  event.waitUntil(
    // Abre ou foca a janela do PWA na URL de destino
    clients.openWindow(targetUrl) 
  );
});

4. 🚀 Enviando a Mensagem (Lado do Servidor)

O servidor da sua aplicação é responsável por:

  1. Armazenar as chaves de inscrição (PushSubscription) de todos os usuários.
  2. Usar uma biblioteca (como web-push em Node.js) para enviar a mensagem (o payload) para o Serviço Push (usando o endpoint e as chaves de criptografia).
  3. A mensagem deve ser enviada com autenticação VAPID (Voluntary Application Server Identification), garantindo que apenas seu servidor possa enviar mensagens ao seu PWA.

5. 🍏 Considerações Específicas do iOS/Safari

Historicamente, o suporte para Notificações Push em PWAs instaladas no iOS era limitado.

  • iOS 16.4 e superior: A Apple introduziu suporte para Notificações Push em PWAs instaladas no iOS e iPadOS. Isso funciona de forma semelhante ao Android, exigindo o uso da mesma arquitetura Push API e Service Worker.
  • Requisito iOS: O PWA deve ser instalado na tela inicial para receber Notificações Push.

✅ Conclusão Notificações Push

Notificações Push: As Notificações Push são a funcionalidade final para elevar um PWA ao nível de um aplicativo nativo em termos de engajamento. O processo requer a cooperação de quatro partes – o PWA solicita permissão, o Service Worker se inscreve e ouve, o Serviço Push entrega a mensagem, e seu Servidor envia o payload criptografado. Ao implementar corretamente os eventos push e notificationclick no seu Service Worker, você garante que seu PWA pode alertar e reengajar os usuários de forma eficaz, mesmo quando o aplicativo não está em uso.

Toda jornada tem um início, e o início para se tornar um desenvolvedor web é dominar as seguintes tecnologias, que você encontra aqui mesmo:

HTML
HTML
CSS
CSS
Javascript
JavaScript

E se você gosta do nosso conteúdo, não deixe de contribuir adquirindo os serviços e produtos dos nossos apoiadores e empresas que somos associados:

Hospedagem Hostinger
Ofertas Amazon
Amazon Prime
Author: Thiago Rossi
Com mais de 20 anos de jornada na tecnologia, minha trajetória evoluiu do ensino técnico à arquitetura de sistemas complexos. Hoje, foco minha expertise no desenvolvimento de soluções de Inteligência Artificial nativa e análise de dados públicos, utilizando o ecossistema PHP para transformar dados brutos em transparência e eficiência. Como autor e desenvolvedor, acredito na democratização do conhecimento. Essa visão resultou em uma biblioteca de mais de 530 artigos gratuitos, cobrindo desde a base do WebDev e Infraestrutura até os bastidores da indústria de Jogos e IA. No universo de Game Design, sou autor do livro "GDD – O Guia Definitivo" e documento ativamente meus processos através de DevLogs, unindo rigor técnico e criatividade em projetos desenvolvidos com GDevelop 5. Meu compromisso é conectar engenharia de ponta com as reais oportunidades do mercado de tecnologia.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *