Notificaciones agrupadas en iOS

Si tu app usa notificaciones locales y deseas agruparlas para organizar un poco mejor la barra de estado del dispositivo móvil, quédate unos minutos a leer esta entrada, seguro que te interesa.

Haciendo un poco de historia, a partir de la versión de iOS 12, el sistema operativo ya gestiona de una manera inteligente las agrupaciones en la pantalla de estado de notificaciones, de forma predeterminada esta agrupación se realiza por aplicación, pero si queremos ir un paso más allá y organizar en base a otros criterios, tenemos que pasar a la acción y tirar algunas líneas de código.

Por ejemplo, imagínate una aplicación de mensajería que da soporte a un comercio electrónico y esta recibe notificaciones de cada cliente potencial, para una mejor experiencia de usuario lo más idóneo es agrupar los mensajes en base a cada cliente, de manera que el usuario pueda ver de un vistazo los diferentes mensajes de cada comprador.

Vamos a ver los pasos necesarios para realizar en la plataforma iOS un agrupamiento de notificaciones.

Clase delegada para la recepción de notificaciones

Lo primero que vamos a hacer es dirigirnos al proyecto de Xamarin iOS y crearnos una clase delegada que herede de "UNUserNotificationCenterDelegate" y posteriormente indicar a nuestro "UNUserNotificationCenter" que la clase anteriormente mencionada será la encargada de gestionar los mensajes.

    public class NotificationCenterDelegate : UNUserNotificationCenterDelegate
    {
        [Export("userNotificationCenter:willPresentotification:withCompletionHandler:")]
        public override void WillPresentNotification(UNUserNotificationCenter center, UNNotification notification, System.Action<UNNotificationPresentationOptions> completionHandler)
        {
            completionHandler(UNNotificationPresentationOptions.Alert);
        }
    }


Ahora solo tenemos que asignar la clase "NotificationCenterDelegate" delegado para las escuchas de los mensajes, el siguiente código lo incluimos dentro del método "FinishedLaunching" de la clase "AppDelegate", que se encuentra en el proyecto Xamarin iOS.

UNUserNotificationCenter center = UNUserNotificationCenter.Current;
            center.RequestAuthorization(UNAuthorizationOptions.Alert, (bool success, NSError error) => {
                // Set the Delegate regardless of success; users can modify their notification
                // preferences at any time in the Settings app.
                center.Delegate = new NotificationCenterDelegate();
            });

Creación de la notificación

Para nuestro ejemplo particular hemos creado una clase de servicio a la que hemos denominado "NotificationService", está clase será instanciada mediante el uso de dependencias, de manera que desde el proyecto de Xamarin Forms haremos la siguiente llamada:

DependencyService.Get<INotificationService>().AddNotification();
Echando un ojo al código fuente podéis verlo con más claridad:
Ejemplo de clase de servicio de notificaciones

Lo importante en este punto es la asignación del valor "ThreadIdentifier", es la propiedad que usará el sistema de notificaciones de iOS para agruparlas, el valor de "SummaryArgument" es de tipo cadena y podemos poner el valor que más nos convenga, aparece cuando las notificaciones se encuentran agrupadas, tal y como podéis observar en la captura de pantalla: "4 more notifications from <SummaryArgument>"

                var center = UNUserNotificationCenter.Current;

                UNNotificationSettings settings = await center.GetNotificationSettingsAsync();
                if (settings.AuthorizationStatus != UNAuthorizationStatus.Authorized)
                {
                    return;
                }

                var content = new UNMutableNotificationContent()
                {
                    ThreadIdentifier = GROUP_NAME,
                    Title = "Javier Cantos",
                    Body = "Mensaje de prueba",
                    SummaryArgument = "Javier Cantos"
                };

                var request = UNNotificationRequest.FromIdentifier(
                    Guid.NewGuid().ToString(),
                    content,
                    null
                );

                center.AddNotificationRequest(request, null);


Ejemplo de funcionamiento

Aquí os dejo un ejemplo de cómo nos quedarían las notificaciones agrupadas en nuestra StatusBar o barra de notificaciones.


Conclusiones

El ejemplo que hemos visto está basado en notificaciones locales, para las notificaciones remotas habría que realizar algunas adaptaciones que las comentaremos en próximas entradas del blog.

Puedes descargar el proyecto completo en GitHub y hacer pruebas, aquí tienes toda la información:

Enlaces de interés:
https://github.com/jcantos/xamarin-forms-notifications
https://www.javiercantos.net/2019/10/notificaciones-agrupadas-en-android-con-xamarin.html

Imagen de Thomas Ulrich en Pixabay 

Comentarios

Entradas populares de este blog

Qué necesito para ser desarrollador de aplicaciones móviles (2ª parte)

Qué necesito para ser desarrollador de aplicaciones móviles (1ª parte)

Distribución de aplicaciones iOS en App Store mediante Visual Studio 2019