Tutoriales - Link en Notificaciones Push

En este artículo veremos cómo podemos enviar un link en un notificaciones push, y que al presionar esa notificación, abra el link en el navegador.

Previamente

Comenzaremos a partir de lo visto en el tutorial de Cómo enviar Notificaciones Push:

Aquí está el enlace: enviar notificaciones push en android

Usaremos el mismo código que desarrollamos para ese artículo.

Tipos de notificaciones

Lo primero es entender los tipos de notificaciones, que son dos, que tienen que ver con la forma en que Android maneja la recepción de la notificación:

  • notification: es manejada por Android cuando la aplicación está en segundo plano, cuando está en primer plano es manejada por un método que redefinimos, el onMessageReceived. Primer plano el método, segundo plano automático.
  • data: siempre son manejadas por el onMessageReceived, esté la aplicación en primero o segundo plano. En este caso la notificación no es visible de forma automática (no sale el cartelito arriba mostrando la notificación), nosotros tenemos que dibujarla dentro del onMessageReceived si queremos que se vea. Pero además, le podemos agregar más propiedades y comportamiento!

Para este ejemplo nosotros vamos a agregar un campo a la notificación, el campo “linkURL”, al recibirla le vamos a decir que cuando alguien presiona sobre la misma abra el browser llevando a al valor de ese campo linkUrl.

Intent

Esto lo vamos a hacer con un “intent”, que es un objeto de mensajería que permite solicitar una acción de otro componente de una app, como abrir otra Activity (el browser).

link en notificaciones

Imagen obtenida de https://developer.android.com/guide/components/intents-filters?hl=es-419

Este intent se lo debemos asignar a la notificación.

Esto no lo podemos hacer con el tipo notification, el automático, tenemos que ir al tipo data, que nos va permite asignar valores y propiedades de forma dinámica, personalizar la notificación.

Acá podes encontrar toda la info sobre intents.

Servidor Backend

Partiendo del código del backend que desarrollamos para el otro artículo, vamos a modificar un solo archivo, enviarNotificacion.php

enviarnotificacionesphp

Aquí estábamos recibiendo tres campos: ID, TITULO y MENSAJE. Ahora agregamos LINKURL.

Vamos a modificar el json a enviar a FCM.

Ya no vamos a usar el vector $notification, ahora vamos a usar el vector $datos, al que le pasamos los parámetros recibidos como campos title, body y linkurl (en caso de que venga). 

Finalmente quitamos la línea de envío de notification, ya que ahora pasamos data.


  $mysqli->close();
  /*$notification = array();
  $notification["title"] = $titulo;
  $notification["body"] = $mensaje;*/

  $datos["title"] = $titulo;
  $datos["body"] = $mensaje;

  if (isset($_POST['LINKURL'])) {
      $datos["linkurl"] = $_POST['LINKURL'];
  }

  $fields = array(
      'registration_ids' => $registration_ids,
      //'notification' => $notification,
      'data' => $datos,
      'direct_book_ok' => true
  );

Con esto queda listo el servidor.

Aplicación

En la aplicación debemos dibujar la notificación en pantalla y además agregarle el intent (un pending intent) que va a abrir el browser al presionar la notificación.

Vamos a trabajar directamente en el archivo MyFirebaseMessagingService.java 

link en notificaciones

Todo lo vamos a hacer en el método onMessageReceived, el que se va a ejecutar cuando llegue una notificación.


    @Override
    public void onMessageReceived(@NonNull RemoteMessage message) 
                

Primero vamos a crear una constante, porque para mostrar la notificación necesitamos crear un canal, un ChannelID.


    private static final String NOTIFICATION_CHANNEL_ID = "app.notificaciones.channel";
                

Lo siguiente es tomar los valores que vienen en el campo data: título, body y linkurl.


    //super.onMessageReceived(message);
    String titulo = message.getData().get("title");
    String descripcion = message.getData().get("body");
    String linkUrl = message.getData().get("linkurl");                  
                

Creamos un notificationChannel usando el ChannelID.


    NotificationChannel notificationChannel = new NotificationChannel(
        NOTIFICATION_CHANNEL_ID, 
        NOTIFICATION_CHANNEL_ID + "_name", 
        NotificationManager.IMPORTANCE_HIGH
    );
                

Obtenemos el NotificationManager del sistema y le asignamos el notificationChannel.


    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.createNotificationChannel(notificationChannel);                  
                

Este NotificationManager es el que va a terminar mostrando la notificación.

Vamos a construir la notificación con un Notification Builder.


    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
    .setContentTitle(titulo)
    .setContentText(descripcion)
    .setAutoCancel(true)
    .setSmallIcon(R.drawable.ic_launcher_foreground)
    .setContentIntent(onClick(linkUrl));              
                

Le pasamos varios parámetros:

  • El Channel ID, la constante Channel ID, le asignamos el canal
  • El título, uno de los parámetros que venían 
  • El texto
  • El AutoCancel, para que se vaya la notificación al presionarla
  • Un icono, le paso uno de los que vienen por defecto 
  • El ContentIntent, es lo que se va a ejecutar una vez que hacemos click sobre la notificación. Encapsulo el comportamiento en una función, que va a retornar el intent.

Por ahora solamente vamos a crear la firma de la función. Finalmente al NotificationManager le decimos que notifique para que muestre la notificación en pantalla.


    notificationManager.notify(0, notificationBuilder.build());
                

¿Qué pasa si no viene el parámetro linkurl?

En este caso podemos hacer que valla a la aplicación actual, invocamos dos funciones distintas en caso de que venga o no.


    private PendingIntent onClick(String linkUrl) {
        if (linkUrl != null && !linkUrl.trim().isEmpty()) {
            return onClickAbrirNavegador(linkUrl);
        }
        return onClickAbrirApp();
    }                
                

Abrir Aplicación

Creamos el intent, le pasamos la MainActivity, la que tiene que abrir. Le vamos a setear Flags para indicar cómo se tiene se tiene que ubicar en pantalla, y finalmente retornamos el intent.

Notemos que le pasamos el modo inmutable, que no se pueda modificar, este modo inmutable funciona para APIs mayores a 31, voy a usar este pero hay más para usar.


    private PendingIntent onClickAbrirApp() {
        Intent intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        return PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
    }
                

Abrir Navegador

En este caso el intent es un ACTION_VIEW.

Debemos hacer un uri.parse de la url y se la asignamos como dato al intent. Luego retornamos el pending intent. 


    private PendingIntent onClickAbrirNavegador(String linkUrl) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(Uri.parse(linkUrl));
        return PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
    }                
                

Eso es todo! Si queres ver, bajar, probar… e l código completo lo podes encontrar en esta dirección:

https://github.com/unsimpledev/ProyectoNotificacionesLink