Firebase Notifications — Part 1

Aprender a desenvolver apps android e as ferramentas necessárias para tal é o primeiro e o maior passo para ter uma app de sucesso.
Entretanto, em um mundo em que temos a internet pronta para ensinar a todos sobre como desenvolver apps é preciso ir além do desenvolvimento e pensar no que acontece depois de o utilizador ter a app instalada.

Como garantimos que ele mantém-se entretido com ela?

Como falamos no início da série, o Firebase oferece um total de 15 serviços que nos permitem Desenvolver, aumentar a nossa base de utilizadores e monetizar as nossas aplicações. 
Na primeira parte da série, falamos sobre 2 serviços, a realtime database e authentication que nos permitem desenvolver as bases de uma aplicação com um backend seguro.

Nos próximos 2 posts, iremos falar sobre o Firebase Cloud Messaging para que possamos aprender como notificar os nossos utilizadores e lhes fazer chegar informações importantes.

O serviço de notificações no Firebase encontra-se dividido em duas partes nomeadamente Cloud Messaging e Notifications.

Cloud Messaging

Anteriormente conhecido como Google Cloud Messaging(GCM) e agora Firebase Cloud Messaging(FCM), este serviço permite o envio/recepção de mensagens entre dispositivos a custo zero e com segurança.
De forma muito simples o Firebase Cloud Messaging contém um servidor que é responsável por atribuir uma token de identificação a cada dispositivo que subscrever-se a enviar/receber notificações e por garantir que as mensagens são enviadas e recebidas por um determinado dispositivo.
O processo desde o registo até ao envio/recepção de mensagens acontece seguindo os passos abaixo:

  1. Dispositivo A e B pedem uma token enviando um pedido ao Firebase Cloud Messaging quando a app é instalada pela primeira vez.
  2. O Firebase Cloud Messaging gera e retorna uma token para identificar o dispositivo.
  3. Podemos guardar a token no servidor e associar a um utilizador(opcional)
  4. Utilizar o Firebase console(como veremos mais adiante) ou o nosso servidor utilizando o SDK para enviar as mensagens.

Notifications

O Firebase Notifications é nada mais e nada menos que ter o Cloud Messaging como a base adicionada ao console que permite o envio rápido de mensagens sem a necessidade escrever código e de bónus poder aceder aos dados do FirebaseAnalytics e utilizar a informações sobre audiências e segmentos dos utilizadores para poder enviar as notificações para os utilizadores certos.

Sem muito mais a explicar e passando para a prática, vamos começar a configurar o nosso projecto para que possamos receber notificações.

Assumindo que aprendemos já a criar um projecto no Firebase e configurar uma android app para utilizar o core do Firebase como e explicado neste post, a primeira coisa que temos de fazer é adicionar as dependências necessárias para que possamos utilizar o FirebaseMessaging

compile 'com.google.firebase:firebase-messaging:9.0.2'

Após a sincronização do projecto, o passo a seguir é criar 2 Services que extendem FirebaseInstanceIdService e FirebaseMessagingService para gerar a token do dispositivo e receber/enviar mensagens respectivamente.

Começando pelo FirebaseInstanceIdService, este service é responsável por ficar a escuta de eventos que possam causar o refresh da token que representa o dispositivo do utilizador em alguns casos como a reinstalação da aplicação ou a limpeza dos dados da aplicação por parte do utilizador.

Esta classe oferece o método onTokenRefresh() que é automaticamente invocado caso seja encontrado um dos cenários mencionados acima. 
Dentro deste método, pegamos a instância do FirebaseInstanceId e invocamos nele o método getToken() que nos irá retornar uma string com o identificador único do dispositivo utilizado sempre que for necessário enviar uma mensagem para ele.
Após pegar a token, podemos enviar e guardar no nosso servidor onde podemos depois associar a mesma a um utilizador da nossa base de dados.

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService  {

private static final String TAG = MyFirebaseInstanceIDService.class.getSimpleName();

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

//Podemos guardar no shared preferences
SharedPreferences sharedPref = this.getSharedPreferences("MyApp",MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(Constants.DEVICE_REG_TOKEN, refreshedToken);
editor.commit();

//Podemos enviar a token para o servido

}
}

O Service FirebaseMessagingService é responsável por comunicar-se com o servidor do Firebase Cloud Messaging para o envio e recepção de mensagens.
Este Service possui métodos como onMessageReceived(RemoteMessage message) e o onMessageSent(String msgId) invocados no recebimento e envio de mensagens respectivamente.

Para já o método que mais nos interessa é o onMessageReceived pois este método é invocado sempre que uma mensagem nova é recebida do servidor do FCM.

O onMessageReceived nos passa uma instância da classe ResultMessage que contém todas informações sobre os dados recebidos incluindo um Map que podemos utilizar para passar informação em um formato que temos falado muito(Ahaaa, um JSON),informação sobre quem enviou a mensagem, o momento em que foi enviado entre outros.
A implementação deste service seria mais ou menos como no código abaixo(Entraremos em detalhes de implementação no próximo post pois para este não precisamos de implementar nada apenas garantir que o Service existe.):

public class MyFcmListenerService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage message){
     //Pegar a informação enviada se existente
Map data = message.getData();
}
...
}

Para terminar a configuração da aplicação para o recebimento de notificações, falta-nos só registar estes dois Services no manifest como mostram os exemplos abaixo e correr a aplicação.

<service android:name=".service.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".service.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>

Com a aplicação configurada para receber notificações, o passo seguinte consiste em abrir o Firebase console, escolher a opção Notifications onde nos será apresentado o dashboard pedindo que enviemos uma nova mensagem

Para enviar uma notificação simples a partir do console temos de inserir o texto da notificação, escolher a aplicação do Firebase para que queremos fazer o broadcast e pressionar o botão send Notification como mostra a figura abaixo.

Após alguns instantes, sem ter de escrever uma linha de código sequer, o Firebase Cloud Messaging irá enviar uma notificação que por defeito irá abrir a Activity principal ao ser clicada.

Desta forma terminamos este post introdutório sobre notificações no Firebase e espero por vocês no próximo post onde iremos aprender conceitos mais avançados sobre Firebase Notifications!

Até , DM :)