Começar a usar o Firebase Cloud Messaging


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

  1. Instale e inicialize os plug-ins do Firebase para Flutter, caso ainda não tenha feito isso.

  2. Na raiz do seu projeto do Flutter, execute o seguinte comando para instalar o plug-in:

    flutter pub add firebase_messaging
    
  3. 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

  1. 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.
  2. Verifique se o app está em segundo plano no dispositivo.
  3. No Console do Firebase, abra a página "Mensagens".
  4. Se esta for sua primeira mensagem, selecione Criar primeira campanha.
    1. Selecione Mensagens do Firebase Notificações e clique em Criar.
  5. Se não for sua primeira mensagem, selecione Nova campanha e depois Notificações na guia Campanhas.
  6. Digite o texto da mensagem.
  7. Selecione Enviar mensagem de teste no painel à direita.
  8. No campo Adicionar um token de registro do FCM, insira seu token de registro.
  9. 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:

  1. getInitialMessage():: se o aplicativo for aberto a partir de um estado encerrado, esse método retornará um Future contendo um RemoteMessage. Depois de consumido, o RemoteMessage será removido.
  2. onMessageOpenedApp: um Stream que publica um RemoteMessage 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
  State createState() => _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: