Enviando mensagens de Push com o Firebase Cloud Messaging (FCM)

Posted by rlecheta on julho 25, 2016
Android, Tutorial

Olá pessoal.

Esta é a 1ª parte do Tutorial. A 2ª parte está aqui.

No Google I/O 2016 o Google anunciou o Firebase, uma plataforma completa com diversos serviços comuns a aplicativos móveis como analytics, crash reports, notificações push, dentre outros.

firebase

Muito tem se falado do Firebase nos últimos meses, portanto serei rápido neste post. O mais importante que você precisa saber para seguir este tutorial é que ele deve levar no máximo 10 a 15 minutos, e as mensagens de Push do Firebase são gratuitas 🙂

No livro Google Android 5a ed, explico como enviar mensagens de Push no Android com o GCM (Google Cloud Message).

Capa_AndroidLecheta4ed_FINAL

Porém como o GCM foi migrado para o FCM (Firebase Cloud Messaging), é justo atualizar os leitores do meu livro com as novidades 🙂

Neste rápido tutorial vamos aprender a enviar mensagens de Push com a nova plataforma do Firebase, e o projeto que vamos fazer é baseado na documentação do Firebase, disponível neste link:

Set Up a Firebase Cloud Messaging Client App on Android

No github do Firebase você poderá encontrar diversos exemplos, inclusive o quickstart sobre o FCM. Os códigos deste tutorial, serão baseados neste quickstart.

https://github.com/firebase/quickstart-android/tree/master/messaging

Partiu pro código!

1) Passo 1 – Criar o projeto.

Crie um projeto no Android Studio conforme a figura abaixo. Eu escolhi o template Empty Activity.

Tenha atenção no nome do pacote que você vai escolher para o projeto, pois essa informação será necessária depois para configurar o Firebase.

001

2) Configurar o Firebase no Console.

Acesse a página do console do Firebase com sua conta do Google e clique no botão Create New Project.

https://console.firebase.google.com/

002

Escolha um nome para seu projeto, selecione o Brasil como país e prossiga.

Depois de criar seu projeto, você verá a página de administração do Firebase.

003

O Firebase possui APIs para Android, iOS e Web. Neste tutorial estamos criando um app Android, portanto clique no botão Add Firebase to your Android app para configurar o projeto.

No wizard insira o nome do seu pacote, o SHA1 do seu certificado e clique em Add App.

004

Siga o wizard, e no passo 2 faça o download do arquivo google-services.json conforme indicado na figura. Este arquivo contem as configurações da sua conta do Firebase e deve ficar dentro do módulo app do projeto, conforme indicado na figura.

005

No último passo do wizard, temos as instruções de como configurar o gradle. É só copiar o código e colar no local indicado. Veja que devemos alterar o arquivo build.gradle da raiz do projeto, e depois o arquivo app/build.gradle do módulo app.
006

Depois de fazer estas configurações, edite o arquivo app/build.gradle e adicione a dependência do Firebase no projeto:

 

No Android Studio, adicione a dependência FCM ao arquivo build.gradle de nível do aplicativo:

  • app/build.gradle

dependencies {
compile ‘com.google.firebase:firebase-messaging:9.6.1’
}

Pronto! Agora vamos voltar ao projeto Android.

3) Configuração do projeto Android.

Crie a classe MyFirebaseInstanceIDService conforme o código deste link:

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseInstanceIDService.java

Veja que vamos usar o próprio exemplo de quickstart do Firebase, assim não temos como errar :-).

Nesta classe, o método onTokenRefresh() é chamado quando o aplicativo receber um token (registration id). Como você aprendeu no livro Google Android 5ed, este token representa o identificador do dispositivo e precisa ser enviado ao seu servidor, pois com ele é possível enviar uma mensagem para este dispositivo.

 

@Override
 public void onTokenRefresh() {
 // Get updated InstanceID token.
 String refreshedToken = FirebaseInstanceId.getInstance().getToken();
 Log.d(TAG, "Refreshed token: " + refreshedToken);

// TODO: Implement this method to send any registration to your app's servers.
 sendRegistrationToServer(refreshedToken);
 }

Feito isso, crie a classe MyFirebaseMessagingService. Ela será responsável por receber as mensagens de push e criar notificações para avisar ao usuário.

Novamente, vamos copiar a classe de exemplo do quickstart do Firebase.

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java

O método onMessageReceived(msg) é chamado quando uma notificação de Push é recebida, simples assim 🙂


@Override
 public void onMessageReceived(RemoteMessage remoteMessage) {
 // Faça algo aqui como mostrar uma notificação.
 }

Depois de criar estes 2 serviços  do Firebase, é preciso cadastrá-los no AndroidManifest.xml, conforme mostra a figura abaixo.

b

c

Para ajudar, copie o trecho de código do manifest dos exemplos do Firebase.

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/AndroidManifest.xml

Ao rodar o aplicativo você verá a mensagem que o token deste dispositivo foi gerado com sucesso. Funciona mesmo no emulador do Android SDK.


I/FirebaseInitProvider: FirebaseApp initialization successful
07-23 21:04:53.633 16360-16514/br.com.livroandroid.hellofirebasemessaging D/MyFirebaseIIDService: <strong>Refreshed token</strong>: cJmLLI-dIR0:APA91bGtuSyWqc-T7kBx_eeC2ANJbBmyl2v1zlZ74afrRiqyJOC0Y7apmfdcDuuKL0JX2_gDpGW-xzROEQS3qKYRXNTfMOloSYoE8o3dqOJobeXTsLHG4jbSU1lQ5JV2-LEM9jN5B_BI

4) Enviando uma mensagem pelo console do Firebase.

Já temos tudo configurado, e só falta enviarmos uma mensagem para testar o Push. O legal do Firebase é que isso pode ser feito pela sua própria página de console.

No console do Firebase, acesse o menu Notifications e envie uma notificação. Basta preencher o campo Message text e selecionar o aplicativo com o seu pacote no campo Target.

d

Ao enviar uma mensagem com o aplicativo aberto, você verá no LogCat conforme indicado na figura abaixo 🙂

MyFirebaseMsgService: Message Notification Body: Hello Firebase!

e

Agora pressione o botão Home do Android e deixe o aplicativo em background. Neste caso ao enviar a mensagem o Firebase vai mostrar uma notificação automaticamente, conforme este print.

f

Veja que a notificação só foi exibida com o app em background, e este é o comportamento padrão do firebase.

Basicamente, existem 2 tipos de mensagens: data messages (pares de chave=valor) e notification messages.

1) As mensagens do tipo data messages são sempre recebidas no método onMessageReceived(removeMessage), independente se o app está aberto ou em background.

Para identificar se a mensagem é do tipo data message, basta verificar se o método getData() retorna um Map com registros (chave=valor).

if (remoteMessage.getData().size() > 0) {
   Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}

Neste caso o desenvolvedor é sempre responsável por mostrar uma notificação para o usuário, ou seja, é preciso programar para mostrar a notificação. No código de exemplo do firebase tem até um exemplo disso basta descomentar o código.

Para enviar uma mensagem do tipo data message pelo console do Firebase, entre em opções avançadas e preencha a estrutura de chave=valor, é bem simples. Depois no app você poderá ler os valores.

2) As mensagens do tipo notification messages possuem um comportamento um pouco diferente, e foi esta mensagem que enviamos, pois ela não continha nenhum parâmetro do tipo (chave=valor).

Neste tipo de mensagem, se o app está aberto o método onMessageReceived(removeMessage) é executado. Neste caso, o desenvolvedor é responsável por programar a leitura da mensagem e mostrar a notificação para o usuário. Porém, caso o app esteja em background o Firebase vai mostrar uma notificação automaticamente para o usuário. Ao clicar na notificação os dados da mensagem de push serão enviados para a activity principal do aplicativo, então é só fazer o tratamento ao abrir o app e pronto 🙂

Para maiores detalhes sobre os tipos de notificações veja esse link:

https://firebase.google.com/docs/cloud-messaging/concept-options

É isso pessoal 🙂 Espero que este breve tutorial tenha ajudado a entender um pouco sobre como enviar mensagens de Push com o Firebase. Vale lembrar que o Google ainda vai dar suporte para o GCM um bom tempo, até porque existem muitas aplicações que estão utilizando este serviço em produção. Mas para novos apps, recomenda-se utilizar o Firebase.

Uma dica é usar o Firebase também para aplicativos iOS, pois o serviço de Push do Google é bem mais simples que o serviço da APNS (Apple Push Notification Service) da Apple.

Se você gostou, confira a 2ª parte do tutorial aqui.

Abs

 

44 Comments to Enviando mensagens de Push com o Firebase Cloud Messaging (FCM)

  • Olá, Ricardo

    Gostaria de saber se o cenário abaixo é possível:

    Tenho uma aplicação Web integrado com um app Mobile, e tenho interesse em enviar mensagens push para usuários do App

    Neste caso, é possível eu cadastrar as notificações no meu site (em um BD) e enviar para o Firebase para que ele envie a notificação? Ou se eu usar o serviço de BD do próprio Firebase posso salvar no banco e já enviar como Push?

  • Olá! Gostei muito dos seus livros.
    Como eu faço para manipular as mensagens via FCM, a classe não permite que eu reescreva os metodos onStartCommand() e onBind() para conectar ao serviço e ter um jeito de exibir as mensagens na activity.
    Como eu faço isso, ou eu sou obrigado a manipular as mensagens somente dentro desse serviço?
    O contexto da aplicação é um chat.

  • Bom dia,

    Poderia dar uma dica de como faço o celular vibrar quando chegar a notificação?
    Tentei assim, mas não funcionou:

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)

    .setVibrate(new long[] { 100, 250, 100, 500 })
    .setContentTitle(“FCM Message”)
    .setContentText(messageBody)
    .setAutoCancel(true)
    .setSound(defaultSoundUri)
    .setVibrate(v)
    .setContentIntent(pendingIntent);

  • Olá, Eu gostaria de saber se há uma maneira de manipular o corpo da mensagem quando o aplicativo está em Background. Por exemplo, precisaria exibir minha mensagem em duas linhas.

    • Oi Juliana, é possivel se vc mandar apenas o data messages. sem a parte de notification.. Neste caso vc deve ler os dados do push no seu app e mostrar vc mesma a notificação. Veja o que diz os docs: Use notification messages when you want FCM to handle displaying a notification on your client app’s behalf. Use data messages when you want to process the messages on your client app.

  • Ótimo artigo Ricardo, conseguiu me ajudar.
    Mas tenho uma dúvida, ao enviar uma mensagem que fique um pouco grande, não consigo visualizar inteira, pois só aparece uma linha.
    Sabe como posso fazer para mostrar a mensagem inteira?
    Obrigado

  • import com.google.firebase.messaging.FirebaseMessagingService;

    os imports da “firebase.messaging” como exemplo da classe “MyFirebaseMessagingService” não é reconhecido.
    O que está ocorrendo?

  • Fala cara. Parabéns pelo tutorial.
    Estou com um probleminha. Segui tudo certinho, porém quando envio a mensagem no console do firebase, diz que foi enviada mas não aparece nada no app. Se puder me ajudar fico grato. Valeu

      • Obrigado pelo retorno. Realmente, está 100% funcional. Fiz um novo projeto e funcionou perfeitamente. Porém, tenho um aplicativo que já possui um backend no google cloud storage com google app engine e na hora de criar um projeto no firebase posso importar este projeto do cloud storage. Tentei fazer isso e não deu certo. Funciona da mesma maneira ou preciso fazer algo diferente?
        Obrigado novamente.

  • Ótimo tutorial, gostaria de um auxilio, cenario: Pagina em PHP que envio o Post que é gerado no Postman por ajax, porem não está funcionando, teria como fazer um tutorial nos auxiliando basicamente como integrar com uma pagina PHP?

  • Ótimo tutorial, gostaria de um auxilio, cenario: Pagina em PHP que envio o Post que é gerado no Postman por ajax, porem não está funcionando, teria como fazer um tutorial nos auxiliando basicamente como integrar com uma pagina PHP??

    • Oi Victor, o tutorial é sobre Firebase, se eu for postar algo sobre linguagem, terei que mostrar em outras também. Mas é só buscar por POST PHP em qualquer tutorial que vai dar boa.

      • Correto Rlacheta,
        Então tenho um conhecimento moderado de POST, apenas para entender, o POST que é gerado no postman, tentei utilizalo porem sem sucesso tem alguma dica? ou algum modelo de post que vc possa me mandar como modelo?
        Caso possa me ajudar,
        Victorcardosoc@gmail.com

  • Correto Rlacheta,
    Então tenho um conhecimento moderado de POST, apenas para entender, o POST que é gerado no postman, tentei utilizalo porem sem sucesso tem alguma dica? ou algum modelo de post que vc possa me mandar como modelo?

    • Oi Victor, POST é só a forma de enviar os dados pro servidor. No caso do Firebase é enviado um json pro servidor. Acho que seria bom vc ler meu livro sobre web services… iria te ajudar a entender melhor.

  • Parabéns pela página.
    Eu gostaria de saber se no envio de uma mensagem a API do Firebase, ele irá disparar tanto para apps Android e iOS ao mesmo tempo.

    • Leandro, ao usar este endpoint REST do Firebase ele vai enviar para todos os devices que você informar no JSON, seja tokens de Android ou iOS.

  • Olá Ricardo, acompanho o seu trabalho desde a 2º edição do seu livro para Android, parabéns pelo tutoria e pelos livros.

    Fatou mencionar : No Android Studio, adicione a dependência FCM ao arquivo build.gradle de nível do aplicativo:

    dependencies {
    compile ‘com.google.firebase:firebase-messaging:9.6.1’
    }

  • Quando será o lançamento da edição Google Android – 6ª Edição? tera FireBase nela? estou ansioso kkkk

    • Oi Paulo, estou me planejando para depois do Google I/O. Penso em apenas trocar o capítulo de GCM pelo FCM (Firebase), mas acho que não vou falar de tudo o que o Firebase faz, pois fica meio grande.

  • Uma explicação muito clara. Mais simples e direta que a Doc do Firebase e do Google.

    Muito obrigado!

  • Boa noite!!!

    Inplementei o FCM na minha aplicação, as msg são enviadas via push web pelo php, até ai tudo bem. Quando vc abre a aplicação e coloca em segundo plano a notificação continua chegando por um certo tempo, mas depois de um tempo não chega mais, parece que aplicação fica em segundo plano precendo morta. Alguem sabe alguma solução?

    • Oi Taf, jobdispatcher-android só precisa se for usar essa lib de job do Firebase… de qualquer forma tenho certeza de que se tentar mais um pouco vai conseguir, abs.