Por que o push não funciona quando o navegador está fechado?
Essa pergunta é coesa, em grande parte porque há alguns cenários que a tornam difícil de entender e entender.
Vamos começar com o Android. O SO Android foi projetado para detectar mensagens push e, ao receber uma, ativar o app Android apropriado para processar a mensagem push, independentemente de o app estar fechado ou não.
O mesmo acontece com qualquer navegador no Android. O navegador será ativado quando uma mensagem push for recebida e, em seguida, o navegador ativará o service worker e enviará o evento push.
Em sistemas operacionais para computadores, há mais nuances e é mais fácil de explicar no Mac OS X, porque há um indicador visual que ajuda a explicar os diferentes cenários.
No Mac OS X, uma marcação abaixo do ícone do app na base permite identificar se um programa está em execução ou não.
Se você comparar os dois ícones do Chrome na base a seguir, o da esquerda vai estar em execução, conforme ilustrado pela marcação abaixo do ícone, enquanto o Chrome à direita não está em execução. Por isso, não há a marcação abaixo dele.
![Exemplo de OS X](https://web.dev/static/articles/push-notifications-faq/image/example-os-x-72bc3d5fa52ff.png?authuser=5&hl=pt)
No contexto de receber mensagens push no computador, você receberá mensagens quando o navegador estiver em execução, ou seja, tiver a marcação abaixo do ícone.
Isso significa que o navegador não pode ter janelas abertas, e você ainda receberá a mensagem de push no service worker, porque o navegador está sendo executado em segundo plano.
A única vez que um push não é recebido é quando o navegador está completamente fechado, ou seja, não está em execução (sem marcação). O mesmo se aplica ao Windows, embora seja um pouco mais complicado determinar se o Chrome está sendo executado em segundo plano.
Como faço meu app da Web na tela inicial abrir em tela cheia com um push?
No Chrome para Android, um app da Web pode ser adicionado à tela inicial e, quando ele é aberto da tela inicial, ele pode ser iniciado em modo de tela cheia sem a barra de URL, como mostrado abaixo.
![Ícone da tela inicial em tela inicial](https://web.dev/static/articles/push-notifications-faq/image/home-screen-icon-fullscr-e034b276ccc7e.png?authuser=5&hl=pt)
Para manter essa experiência consistente, os desenvolvedores querem que as notificações clicadas abram o app da Web em tela cheia também.
Isso foi implementado pelo Chrome, embora você possa considerá-lo não confiável e difícil de entender. Os detalhes de implementação relevantes são:
Isso significa que, a menos que o usuário esteja visitando seu site pelo ícone da tela inicial com regularidade, suas notificações serão abertas na interface normal do navegador.
Esse problema vai ser resolvido mais a fundo.
Por que ele é melhor do que soquetes da Web?
Um service worker pode ganhar vida quando a janela do navegador for fechada. Um soquete da Web funciona apenas enquanto o navegador e a página da Web são mantidos abertos.
O que está acontecendo com o GCM, FCM, push na Web e Chrome?
Essa pergunta envolve vários aspectos, e a maneira mais fácil de explicar é analisar o histórico de push da Web e do Chrome. Não se preocupe, ela é curta.
Dezembro de 2014
Quando o Chrome implementou o push da Web pela primeira vez, o navegador usou o Google Cloud Messaging (GCM) para viabilizar o envio de mensagens push do servidor para o navegador.
Não foi push da Web. Há alguns motivos para essa configuração inicial do Chrome e do GCM não ter sido um push da Web "real".
- O GCM exige que os desenvolvedores configurem uma conta no Google Developers Console.
- O Chrome e o GCM precisavam que um ID de remetente especial fosse compartilhado por um app da Web para configurar as mensagens corretamente.
- Os servidores do GCM aceitaram uma solicitação de API personalizada que não era um padrão da Web.
Julho de 2016
Em julho, chegou um novo recurso no push da Web: as Chaves do servidor de aplicativos (ou VAPID, como a especificação é conhecida). Quando o Chrome adicionou suporte a essa nova API, ele usou o Firebase Cloud Messaging (também conhecido como FCM) em vez do GCM como um serviço de mensagens. Isso é importante por alguns motivos:
- O Chrome e as chaves de servidor de aplicativos não precisam que nenhum tipo de projeto seja configurado com o Google ou o Firebase. Isso vai funcionar.
- O FCM é compatível com o protocolo de push da Web, que é a API compatível com todos os serviços de push da Web. Isso significa que, independentemente do serviço de push usado pelo navegador, você apenas fará o mesmo tipo de solicitação e ele enviará a mensagem.
Por que isso está confuso hoje?
Há muita confusão agora que o conteúdo foi escrito sobre o tópico de push da Web, e muitos deles referenciam o GCM ou o FCM. Se o conteúdo faz referência ao GCM, você provavelmente deve tratá-lo como um sinal de que é um conteúdo antigo OU está se concentrando demais no Chrome. Sou culpado de fazer isso em várias postagens antigas.
Em vez disso, considere que o envio por push da Web consiste em um navegador, que usa um serviço de push para gerenciar o envio e o recebimento de mensagens. Nele, o serviço de push aceita uma solicitação de "protocolo de push da Web". Se você pensar nesses termos, ignore qual navegador e qual serviço de push ele está usando e comece a trabalhar.
Este guia foi escrito com foco na abordagem padrão de push na Web e ignora qualquer outra coisa propositalmente.
O Firebase tem um SDK para JavaScript. O que e por quê?
Se você descobriu o SDK da Web do Firebase e notou que ele tem uma API de mensagens para JavaScript, talvez se pergunte qual é a diferença entre ele e o push da Web.
O SDK de mensagens, conhecido como SDK do Firebase Cloud Messaging para JS, faz alguns truques nos bastidores para facilitar a implementação de push da Web.
- Em vez de se preocupar com um
PushSubscription
e os vários campos, você só precisa se preocupar com um token do FCM (uma string). - Com os tokens de cada usuário, é possível utilizar a API FCM reservada para acionar mensagens push. A API não requer a criptografia de payloads. É possível enviar um payload de texto simples no corpo de uma solicitação POST.
- A API reservada do FCM oferece suporte a recursos personalizados, por exemplo, Tópicos do FCM. Ela também funciona na Web, embora esteja mal documentada.
- Por fim, como o FCM é compatível com Android, iOS e Web, para algumas equipes é mais fácil trabalhar em projetos que já existem.
Ele usa push da Web em segundo plano, mas o objetivo é abstrair essas informações.
Como eu disse na pergunta anterior, se você considera o push da Web apenas como um navegador e um serviço de push, considere o SDK de mensagens no Firebase como uma biblioteca para simplificar a implementação de push da Web.
A seguir
- Visão geral das notificações push da Web
- Como funciona o envio por push
- Como inscrever um usuário
- UX de permissão
- Como enviar mensagens com bibliotecas push da Web
- Protocolo push da Web
- Como processar eventos push
- Exibir uma notificação
- Comportamento das notificações
- Padrões comuns de notificação
- Perguntas frequentes sobre notificações push
- Problemas comuns e como informar bugs