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.
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.
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:
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.
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).
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.
Partiendo del código del backend que desarrollamos para el otro artículo, vamos a modificar un solo archivo, enviarNotificacion.php
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.
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
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:
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());
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();
}
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);
}
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: