Comunidade

Pare de Enviar Mensagens de Notificação: Por Que Seu Aplicativo Android Deveria Usar FCM com Dados Apenas

O uso de mensagens com apenas dados (data-only messages) no Firebase Cloud Messaging (FCM) é recomendado para aplicativos Android, pois permite ao desenvolvedor controlar completamente o ciclo de vida das notificações. Isso inclui a capacidade de redirecionar os usuários diretamente para conteúdo específico através de deep links, além de garantir que as notificações sejam consistentes em diferentes versões do Android e fabricantes de dispositivos.

Compartilhar
Medium

Pare de Enviar Mensagens de Notificação: Por Que Seu Aplicativo Android Deveria Usar FCM com Dados Apenas

As notificações push são uma das principais formas de comunicação em aplicativos Android modernos. Seja para notificar os usuários sobre novos conteúdos, mensagens, promoções ou atualizações da conta, o Firebase Cloud Messaging (FCM) torna a entrega de notificações direta e simples.

No entanto, um pequeno detalhe em sua carga de FCM pode afetar drasticamente o comportamento do seu aplicativo.

Muitos desenvolvedores gastam horas debugando problemas de notificações, apenas para descobrir que o problema não está em seu código Android — está na carga enviada pelo backend.

Neste artigo, exploraremos a diferença entre mensagens de notificação e mensagens com dados apenas, por que as mensagens com dados apenas são frequentemente uma melhor escolha para aplicativos Android e como implementá-las corretamente.

Entendendo os Tipos de Notificações do Firebase

O Firebase Cloud Messaging (FCM) suporta dois principais tipos de mensagens:

  1. Mensagens de Notificação
  2. Mensagens com Dados Apenas (Data-Only)

Embora possam parecer semelhantes, o Android lida com elas de maneira muito diferente.

Mensagens de Notificação

Uma mensagem de notificação contém um objeto notification.

Exemplo:

{
"message": {
"token": "<DEVICE_TOKEN>",",
"notification": {
"title": "Bem-vindo de volta!",
"body": "Confira o que há de novo hoje."
}
}
}

Como o Android Lida Com Isso

Quando o Android recebe esta carga:

  • Se o aplicativo está em primeiro plano, geralmente é invocado FirebaseMessagingService.onMessageReceived().
  • Se o aplicativo está em segundo plano ou encerrado, o Android exibe a notificação automaticamente.

Embora essa funcionalidade seja conveniente, também significa que o sistema — e não seu aplicativo — controla como a notificação é apresentada e o que acontece quando o usuário clica nela.

Isso é suficiente para aplicações simples, mas pode se tornar limitante para aplicativos que requerem comportamento de notificação personalizado.

Mensagens com Dados Apenas

Uma mensagem de dados apenas contém apenas a seção dados.

Exemplo:

{
"message": {
"token": "<DEVICE_TOKEN>",&
"android": {
"priority": "HIGH"
},
"data": {
"title": "Bem-vindo de volta!",
"body": "Confira o que há de novo hoje.",&
"deepLink": "myapp://profile"
}
}
}

Note que não há um objeto notificação.

Ao invés disso, tudo que o aplicativo precisa — incluindo o título da notificação, o corpo e as informações de navegação — é fornecido dentro do payload dados.

Por que Mensagens com Dados Apenas São Melhores

Com mensagens de dados apenas, seu aplicativo Android tem controle total sobre o ciclo de vida da notificação.

Ao invés de depender do sistema Android, seu aplicativo decide:

  • Quando exibir uma notificação
  • Como ela deve parecer
  • Qual canal de notificação usar
  • Se deve ser agrupada
  • Qual ícone ou imagem exibir
  • O que deve acontecer quando o usuário clica nela

Isso torna o comportamento da notificação consistente em diferentes versões do Android e fabricantes de dispositivos.

Links Profundos: Um Caso de Uso Poderoso

Um dos maiores benefícios das notificações apenas com dados é a capacidade de incluir um link profundo.

Em vez de sempre abrir a tela inicial do seu aplicativo, a notificação pode levar os usuários diretamente ao conteúdo que eles estão interessados.

Por exemplo, o backend pode enviar:

{
"deepLink": "myapp://profile"
}

ou

{
"deepLink": "https://example.com/profile"
}

Quando o usuário toca na notificação, o aplicativo lê o link profundo do payload e navega diretamente para a destinação apropriada.

Isto pode ser usado para:

  • Abra uma tela específica
  • Navegue até o perfil de um usuário
  • Exiba um artigo
  • Abrir uma conversa de chat
  • Navegar até a página de configurações
  • Lançar qualquer destino suportado pelo sistema de roteamento do seu aplicativo

Mantendo o link profundo dentro da carga útil data dá ao aplicativo controle total sobre a navegação em vez de depender do comportamento padrão do sistema Android.

Implementação no Android

Lidar com uma mensagem apenas com dados é simples.

override fun onMessageReceived(remoteMessage: RemoteMessage) {
val data = remoteMessage.data

val title = data["title"]
val body = data["body"]
val deepLink = data["deepLink"]

// Crie um Intent usando o link profundo
// Construa e exiba sua própria notificação
}

Como seu aplicativo cria a notificação por conta própria, você pode construir um PendingIntent personalizado que abre exatamente a tela desejada.

var mensagem = new Message
{
Token = deviceToken,

Data = new Dictionary<string, string>
{
{ "title", "Bem-vindo de volta!" },
{ "body", "Confira o que há de novo hoje." },
{ "deepLink", "myapp://profile" }
},

Android = new AndroidConfig
{
Priority = Priority.High
}
};

await FirebaseMessaging.DefaultInstance.SendAsync(mensagem);

O detalhe importante é o que está faltando.

Não inclua:

Notification = new Notification(...)

Adicionar um objeto Notification transforma a mensagem em uma mensagem de notificação, fazendo com que o Android assuma o controle da exibição das notificações quando o aplicativo está em segundo plano.REST API Exemplo

Enviando Mensagens com Dados Apenas usando a API HTTP v1 do Firebase

Se você estiver usando a API HTTP v1 diretamente, o payload ficará assim:

{
"message": {
"token": "<DEVICE_TOKEN>",",
"android": {
"priority": "HIGH"
},
"data": {
"title": "Bem-vindo de volta!",
"body": "Confira o que há de novo hoje.",
"deepLink": "myapp://profile"
}
}
}

Novamente:

  • ✅ dados
  • ✅ android.priority
  • ❌ sem notificação

Você pode enviar mensagens com dados apenas do console Firebase?A resposta depende de qual parte do console Firebase você está usando.

Se você usar o compositor de notificações (também chamado Firebase Notifications), o console cria automaticamente uma mensagem de notificação. Você não pode remover a carga útil da notificação lá.

No entanto, se você for para Engage → Messaging → Criar sua primeira campanha → Firebase Notification ou usar o fluxo de teste do console Test on device, ainda estará enviando mensagens de notificação.

Para verdadeiras mensagens com dados apenas, você deve usar uma das seguintes opções:

  • Seu backend
  • Firebase Admin SDK
  • Firebase HTTP v1 API
  • Postman
  • cURL

Essas abordagens permitem que você construa a carga por conta própria e inclua apenas o objeto data.

Um Erro Comum

Uma implementação comum do backend envia tanto notification quanto data.

{
"message": {
"token": "<DEVICE_TOKEN>","notification": {
"title": "Bem-vindo de volta!",
"body": "Confira o que há de novo hoje."
},
"data": {
"title": "Bem-vindo de volta!",
"body": "Confira o que há de novo hoje.",
"deepLink": "myapp://profile"
}
}
}

No primeiro momento, isso parece inofensivo, mas o Android trata isso como uma mensagem de notificação.

Como resultado, quando a aplicação está em segundo plano, o Android exibe automaticamente a notificação ao invés de permitir que a aplicação a construa.

Caso sua aplicação dependa de estilos personalizados de notificações, análises, roteamento ou links profundos, essa conduta pode levar a experiências inconsistentes do usuário.

Melhores Práticas

  • Use somente dados para notificações impulsionadas pela aplicação.
  • Manter toda a informação da notificação dentro do payload de data.
  • Incluir informações de navegação, como um link profundo, em vez de codificar lógica de roteamento.
  • Ajustar a prioridade do Android para HIGH para notificações com prazo.
  • Deixe que o aplicativo Android crie e exiba as notificações.
  • Mantenha a renderização da notificação e lógica de navegação dentro do aplicativo para comportamento previsível.

Conclusão

O Firebase Cloud Messaging oferece aos desenvolvedores várias maneiras de entregar notificações, mas a estrutura da carga determina quem controla a experiência do usuário.

Ao usar mensagens apenas com dados, o backend fornece à aplicação tudo que ela precisa — título, corpo e links profundos — enquanto deixa a criação e navegação por notificações inteiramente sob controle do app Android.

Esta abordagem resulta em um comportamento mais consistente, maior flexibilidade, manutenção mais fácil e uma melhor experiência do usuário geral.

Se você já se pegou debugando comportamentos estranhos de notificações, não inspecione apenas o código Android. Olhe de perto a carga que seu backend está enviando — pode ser a verdadeira fonte do problema.

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa