Este guia de início rápido descreve como configurar o Firebase Cloud Messaging nos seus
apps cliente da Web e para dispositivos móveis para que você possa enviar mensagens de forma confiável. Para ambientes
de servidor, consulte O ambiente de servidor e
o FCM.
Configurar um app cliente do Firebase Cloud Messaging no Android
Dependendo da plataforma que você está segmentando, há algumas etapas de configuração adicionais necessárias.
iOS+
Swizzling de métodos
Para usar o plug-in do Flutter FCM em dispositivos Apple, o swizzling de métodos é obrigatório. Sem ele, os principais recursos do Firebase, como o processamento de tokens do FCM, não funcionam corretamente.
Android
Google Play Services
Para os clientes do FCM, é necessário que os dispositivos com o Android 4.4 ou versões mais recentes também tenham o Google Play Services instalado ou um emulador executando o Android 4.4 com APIs do Google. Não é necessário se limitar à Google Play Store para implantar apps Android.
Os apps que contam com o SDK do Google Play Services
devem sempre verificar se há um APK do Google Play Services compatível no dispositivo antes
de acessar os recursos. Recomenda-se fazer isso em dois lugares: no método
onCreate()
da atividade principal e no método onResume()
. Com a verificação de onCreate()
,
só é possível utilizar o app após uma verificação bem-sucedida. A verificação de onResume()
garante
que, se o usuário retornar ao app em execução por outro meio, como
pelo botão "Voltar", a verificação ainda será executada.
Se o dispositivo não tiver uma versão compatível do Google Play Services, o app poderá chamar
GoogleApiAvailability.makeGooglePlayServicesAvailable()
para que os usuários façam o download desse serviço na Play Store.
Web
Configurar credenciais da Web com FCM
A interface da Web do FCM usa credenciais da Web chamadas "Identificação voluntária do servidor de aplicativos" ou chaves "VAPID" para autorizar solicitações de envio a serviços de push da Web com suporte. Para inscrever seu app nas notificações push, é preciso associar um par de chaves ao projeto do Firebase. É possível gerar um novo par de chaves ou importar um existente no Console do Firebase
Instalar o plug-in FCM
Instale e inicialize os plug-ins do Firebase para Flutter, caso ainda não tenha feito isso.
Na raiz do seu projeto do Flutter, execute o seguinte comando para instalar o plug-in:
flutter pub add firebase_messaging
Após a conclusão, recrie seu aplicativo do Flutter:
flutter run
Acessar o token de registro
Para enviar uma mensagem a um dispositivo específico, é necessário saber o token de registro dele. Para recuperar o token de registro atual de uma instância de app, chame
getToken()
. Se a permissão de notificações não tiver sido concedida, esse método
solicitará essa permissão ao usuário. Caso contrário, ele retorna um token ou
rejeita a promessa devido a um erro.
// You may set the permission requests to "provisional" which allows the user to choose what type
// of notifications they would like to receive once the user receives a notification.
final notificationSettings = await FirebaseMessaging.instance.requestPermission(provisional: true);
// For apple platforms, make sure the APNS token is available before making any FCM plugin API calls
final apnsToken = await FirebaseMessaging.instance.getAPNSToken();
if (apnsToken != null) {
// APNS token is available, make FCM plugin API requests...
}
Nas plataformas da Web, transmita sua chave pública VAPID para getToken()
:
final fcmToken = await FirebaseMessaging.instance.getToken(vapidKey: "BKagOny0KF_2pCJQ3m....moL0ewzQ8rZu");
Para receber notificações sempre que o token for atualizado, inscreva-se no fluxo
onTokenRefresh
:
FirebaseMessaging.instance.onTokenRefresh
.listen((fcmToken) {
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new
// token is generated.
})
.onError((err) {
// Error getting token.
});
Impedir a inicialização automática
Quando um token de registro do FCM é gerado, a biblioteca faz upload dos dados de configuração e do identificador para o Firebase. Se você preferir evitar a geração automática de tokens, desative a inicialização automática no tempo de build.
iOS
No iOS, adicione um valor de metadados ao seu Info.plist
:
FirebaseMessagingAutoInitEnabled = NO
Android
No Android, desative a coleta do Analytics e a inicialização automática do FCM (é necessário
desativar ambos) adicionando estes valores de metadados ao seu AndroidManifest.xml
:
<meta-data
android:name="firebase_messaging_auto_init_enabled"
android:value="false" />
<meta-data
android:name="firebase_analytics_collection_enabled"
android:value="false" />
Reativar o início automático do FCM no tempo de execução
Para ativar a inicialização automática de uma instância de app específica, chame setAutoInitEnabled()
:
await FirebaseMessaging.instance.setAutoInitEnabled(true);
Depois de definido, esse valor persiste às reinicializações do app.
Enviar uma mensagem de notificação de teste
- Instale e execute o app no dispositivo de destino. Para dispositivos Apple, será necessário aceitar a solicitação de permissão para receber notificações remotas.
- Verifique se o app está em segundo plano no dispositivo.
- No Console do Firebase, abra a página "Mensagens".
- Se esta for sua primeira mensagem, selecione Criar primeira campanha.
- Selecione Mensagens do Firebase Notificações e clique em Criar.
- Se não for sua primeira mensagem, selecione Nova campanha e depois Notificações na guia Campanhas.
- Digite o texto da mensagem.
- Selecione Enviar mensagem de teste no painel à direita.
- No campo Adicionar um token de registro do FCM, insira seu token de registro.
- Selecione Testar.
Depois de selecionar Testar, o dispositivo cliente de destino com o app em segundo plano receberá a notificação.
Para saber mais sobre a entrega de mensagens ao seu app, consulte o painel de relatórios do FCM, que registra o número de mensagens enviadas e abertas em dispositivos Apple e Android, além de dados de impressões para apps Android.
Como processar interações
Quando os usuários tocam em uma notificação, o comportamento padrão no Android e no iOS é abrir o aplicativo. Se o aplicativo for encerrado, ele vai ser iniciado, e caso esteja em segundo plano, será colocado no primeiro plano.
Dependendo do conteúdo de uma notificação, recomendamos processar a interação do usuário quando o aplicativo for aberto. Por exemplo, se uma nova mensagem de chat for enviada via notificação, e o usuário tocar nela, recomendamos abrir a conversa específica quando o aplicativo for aberto.
O pacote firebase-messaging
oferece duas maneiras de processar essa interação:
getInitialMessage():
: se o aplicativo for aberto a partir de um estado encerrado, esse método retornará umFuture
contendo umRemoteMessage
. Depois de consumido, oRemoteMessage
será removido.onMessageOpenedApp
: umStream
que publica umRemoteMessage
quando o aplicativo é aberto a partir de um estado em segundo plano.
Para garantir uma experiência tranquila aos usuários, você precisa lidar com os dois casos. O exemplo de código abaixo descreve como isso pode ser feito:
class Application extends StatefulWidget { @override StatecreateState() => _Application(); } class _Application extends State { // In this example, suppose that all messages contain a data field with the key 'type'. Future setupInteractedMessage() async { // Get any messages which caused the application to open from // a terminated state. RemoteMessage? initialMessage = await FirebaseMessaging.instance.getInitialMessage(); // If the message also contains a data property with a "type" of "chat", // navigate to a chat screen if (initialMessage != null) { _handleMessage(initialMessage); } // Also handle any interaction when the app is in the background using a // Stream listener FirebaseMessaging.onMessageOpenedApp.listen(_handleMessage); } void _handleMessage(RemoteMessage message) { if (message.data['type'] == 'chat') { Navigator.pushNamed(context, '/chat', arguments: ChatArguments(message), ); } } @override void initState() { super.initState(); // Run code required to handle interacted messages in an async function // as initState() must not be async setupInteractedMessage(); } @override Widget build(BuildContext context) { return Text("..."); } }
A forma como você interage com as interações depende da configuração do aplicativo. O exemplo mostrado anteriormente
é um exemplo básico de como usar um StatefulWidget
.
Próximas etapas
Depois de concluir as etapas de configuração, veja a seguir algumas ações mais avançadas do FCM para Flutter:
- Enviar mensagens para dispositivos
- Receber mensagens em um app do Flutter
- Enviar mensagens a tópicos