Inicio Android Notificaciones Push en Android: Firebase Cloud Messaging (2)

Notificaciones Push en Android: Firebase Cloud Messaging (2)

por sgoliver

[mensaje-curso]

En este nuevo artículo sobre notificaciones push con Firebase Cloud Messaging (FCM) vamos a intentar dar solución a algunos de los problemas o limitaciones que encontramos al final del capítulo anterior.

El primero de ellos estaba relacionado con la posibilidad de enviar mensajes a usuarios concretos. En el primer artículo ya vimos cómo enviar un mensaje desde la consola de Firebase, pero tuvimos que hacerlo de forma masiva, es decir, dirigido a TODOS los usuarios de nuestra aplicación, ya que no sabíamos como identificar a usuarios concretos.

Pues bien, esta identificación de usuarios Firebase la resuelve mediante el uso de tokens de registro, o InstanceID Token como lo encontraréis en la documentación en inglés. Este concepto no será nuevo para quien ya conociera la versión anterior de los servicios de mensajería Google (Google Cloud Messaging o GCM), ya que es algo que se ha mantenido desde entonces. Por explicarlo de forma rápida y sencilla, un token de registro no es más que un dato que identifica de forma única a una aplicación determinada instalada en un dispositivo determinado.

El token de registro se asigna a nuestra aplicación en el momento de su primera conexión con los servicios de mensajería, y en condiciones normales se mantiene invariable en el tiempo. Sin embargo, en determinadas circunstancias este dato puede cambiar durante la vida de la aplicación (por ejemplo cuando se reinstala, cuando el usuario borra los datos de la aplicación, por refrescos de seguridad…), por lo que debemos estar preparados para detectar estos posibles cambios.

Para conocer el token de registro que tenemos asignado podremos acceder en cualquier momento a la instancia de nuestra aplicación mediante getInstance() y obtener el valor del token llamando a getToken(). En mi aplicación de ejemplo he añadido un botón a la interfaz para hacer esto:

btnToken = (Button)findViewById(R.id.btnToken);
btnToken.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //Se obtiene el token actualizado
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        Log.d(LOGTAG, "Token actualizado: " + refreshedToken);
    }
});

Por otra parte, para ser notificados cuando se produzca alguna actualización del token, tendremos que definir un servicio que extienda de la clase base FirebaseInstanceIdService. En principio tan sólo tendremos que sobrescribir su método onTokenRefresh(), que se llamará cada vez que el token se actualice, incluida su primera asignación. Para obtener el token en este caso actuaremos exactamente de la misma forma que hemos hecho en el botón. Veamos cómo quedaría el código completo del servicio:

package net.sgoliver.android.fcm;

import android.util.Log;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private static final String LOGTAG = "android-fcm";

    @Override
    public void onTokenRefresh() {
        //Se obtiene el token actualizado
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        Log.d(LOGTAG, "Token actualizado: " + refreshedToken);
    }
}

Por motivos didácticos, en mi caso de ejemplo muestro el token recibido en un mensaje de log, pero por supuesto esto no es necesario ni recomendable.

Tendremos que añadir también la referencia a este servicio en nuestro fichero AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.sgoliver.android.fcm">

    <application ...>

        <activity android:name=".MainActivity">
            ...
        </activity>

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

    </application>

</manifest>

Hecho esto, si volvemos a ejecutar la aplicación, pulsamos el botón que acabamos de añadir, y nos dirigimos al log de Android podremos ver el token de registro asignado a nuestra instancia de aplicación.

log-token-registro-fcm

Perfecto, ahora ya sí tenemos una forma de identificar a un usuario concreto de nuestra aplicación (o para ser más exactos a una instancia de nuestra aplicación, ya que el usuario puede ejecutar la aplicación desde varios dispositivos, que tendrían tokens diferentes).

Para probarlo, volveremos a la consola de Firebase, a la sección de envío de notificaciones, crearemos un nuevo mensaje como ya hicimos en el artículo anterior, pero seleccionaremos en esta ocasión como objetivo la opción de «Un único dispositivo». Al hacer aparecerá un nuevo campo del formulario donde podremos indicar el token de registro del dispositivo al que queremos enviar el mensaje. Copiamos el token que hemos visualizado en el log y enviamos el mensaje.

mensaje-fcm-unico-dispositivo

Si todo ha ido bien, deberá aparecer la notificación en el dispositivo donde estemos probando (recordad que la aplicación debe estar en segundo plano en el momento de recibirse la notificación).

notif-unico-dispositivo

Acabamos de resolver el primero de los problemas que encontramos en el primer artículo de la serie sobre Firebase Cloud Messaging. En los próximos artículos seguiremos mejorando la aplicación para atajar el resto de limitaciones.

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la página del curso en GitHub.

[mensaje-curso]

También te puede interesar

5 comentarios

David 11/01/2017 - 14:36

Estos post sobre Notificaciones Push en Android no aparecen en el indice del curso.

Responder
Notificaciones Push en Android: Firebase Cloud Messaging (3) | sgoliver.net 17/01/2017 - 20:35

[…] el artículo anterior de la serie resolvimos el problema de la identificación de usuarios/dispositivos individuales a la […]

Responder
aldakur 23/01/2017 - 13:20

Esta muy bien el post y todo el contenido del curso. Pero en este caso si queremos enviar mensajes personalizados a un dispositivo en concreto antes deberemos de implementar un sistema para recibir el token personalizado de ese dispositivo. En la consola de Firebase no encuentro ningún apartado en el que podamos ver los tokens personales de cada dispositivo que tiene nuestra app instalada.

Responder
Firebase para Android [Serie] | sgoliver.net 24/01/2017 - 20:43

[…] Firebase Cloud Messaging en Android (2) [Enero 2017] […]

Responder
Antonio 13/04/2018 - 19:27

Ante todo muchas gracias por el aporte. Pero a mi me da un error en la línea

String refreshedToken = FirebaseInstanceId.getInstance().getToken();

Error CS7036 No se ha dado ningún argumento que corresponda al parámetro formal requerido ‘app’ de ‘FirebaseInstanceId.GetInstance(FirebaseApp)’ notificaciones.firebase.Android C:\repos\notificaciones.firebase\notificaciones.firebase\notificaciones.firebase\MainPage.xaml.cs 43 Activo

Error CS7036 No se ha dado ningún argumento que corresponda al parámetro formal requerido ‘authorizedEntity’ de ‘FirebaseInstanceId.GetToken(string, string)’ notificaciones.firebase.Android C:\repos\notificaciones.firebase\notificaciones.firebase\notificaciones.firebase\MainPage.xaml.cs 43 Activo

Responder

Responder a David Cancelar respuesta

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información. Aceptar Más Información

Política de Privacidad y Cookies