Notificaciones de usuario mejoradas en Xamarin.iOS

Novedades de iOS 10, el marco de notificaciones de usuario permite la entrega y el control de notificaciones locales y remotas. Con este marco, la aplicación o la extensión de aplicación pueden programar la entrega de notificaciones locales especificando un conjunto de condiciones, como la ubicación o la hora del día.

Acerca de las notificaciones de usuario

Como se indicó anteriormente, el nuevo marco de notificaciones de usuario permite la entrega y el control de las notificaciones locales y remotas. Con este marco, la aplicación o la extensión de aplicación pueden programar la entrega de notificaciones locales especificando un conjunto de condiciones, como la ubicación o la hora del día.

Además, la aplicación o la extensión pueden recibir (y potencialmente modificar) notificaciones locales y remotas a medida que se entregan al dispositivo iOS del usuario.

El nuevo marco de interfaz de usuario de notificación de usuario permite a una aplicación o extensión de aplicación personalizar la apariencia de las notificaciones locales y remotas cuando se presentan al usuario.

Este marco proporciona las siguientes maneras de que una aplicación pueda entregar notificaciones a un usuario:

  • Alertas visuales: donde la notificación se implementa desde la parte superior de la pantalla como un banner.
  • Sonido y vibraciones: se puede asociar a una notificación.
  • Icono de aplicación Badging: donde el icono de la aplicación muestra un distintivo que muestra que el nuevo contenido está disponible, como el número de mensajes de correo electrónico no leídos.

Además, en función del contexto actual del usuario, hay diferentes formas de presentar una notificación:

  • Si el dispositivo está desbloqueado, la notificación saldrá desde la parte superior de la pantalla como un banner.
  • Si el dispositivo está bloqueado, la notificación se mostrará en la pantalla de bloqueo del usuario.
  • Si el usuario no ha visto una notificación, puede abrir el Centro de notificaciones y ver las notificaciones disponibles en espera.

Una aplicación de Xamarin.iOS tiene dos tipos de notificaciones de usuario que puede enviar:

  • Notificaciones locales: estas se envían mediante aplicaciones instaladas localmente en el dispositivo de los usuarios.
  • Notificaciones remotas: se envían desde un servidor remoto y se presentan al usuario o desencadenan una actualización en segundo plano del contenido de la aplicación.

Acerca de las notificaciones locales

Las notificaciones locales que una aplicación de iOS puede enviar tienen las siguientes características y atributos:

  • Se envían mediante aplicaciones locales en el dispositivo del usuario.
  • Se pueden configurar para usar desencadenadores basados en la hora o la ubicación.
  • La aplicación programa la notificación con el dispositivo del usuario y se muestra cuando se cumple la condición del desencadenador.
  • Cuando el usuario interactúa con una notificación, la aplicación recibirá una devolución de llamada.

Algunos ejemplos de notificaciones locales son:

  • Alertas de calendario
  • Alertas de recordatorio
  • Desencadenadores conscientes de la ubicación

Para obtener más información, consulte la Guía de programación de notificaciones locales y remotas de Apple documentación.

Acerca de las notificaciones remotas

Las notificaciones remotas que una aplicación de iOS puede enviar tienen las siguientes características y atributos:

  • La aplicación tiene un componente del lado servidor con el que se comunica.
  • El Servicio de notificaciones Push (APN) de Apple se usa para transmitir una entrega de mejor esfuerzo de las notificaciones remotas al dispositivo del usuario desde los servidores basados en la nube del desarrollador.
  • Cuando la aplicación recibe la notificación remota, se mostrará al usuario.
  • Cuando el usuario interactúa con la notificación, la aplicación recibirá una devolución de llamada.

Algunos ejemplos de notificaciones remotas son:

  • Alertas de noticias
  • Actualizaciones deportivas
  • Mensajes de mensajería instantánea

Hay dos tipos de notificaciones remotas disponibles para una aplicación de iOS:

  • Orientado al usuario: se muestran al usuario en el dispositivo.
  • Actualizaciones silenciosas: proporcionan un mecanismo para actualizar el contenido de una aplicación de iOS en segundo plano. Cuando se recibe una actualización silenciosa, la aplicación puede ponerse en contacto con los servidores remotos para extraer el contenido más reciente.

Para obtener más información, consulte la Guía de programación de notificaciones locales y remotas de Apple documentación.

Acerca de la API de notificaciones existentes

Antes de iOS 10, una aplicación de iOS usaría UIApplication para registrar una notificación con el sistema y programar cómo se debe desencadenar esa notificación (ya sea por hora o ubicación).

Hay varios problemas que podría surgir un desarrollador al trabajar con la API de notificación existente:

  • Se necesitaban diferentes devoluciones de llamada para las notificaciones locales o remotas, lo que podría provocar la duplicación del código.
  • La aplicación tenía un control limitado de la notificación después de que se hubiera programado con el sistema.
  • Había diferentes niveles de soporte en todas las plataformas existentes de Apple.

Acerca del nuevo marco de notificaciones de usuario

Con iOS 10, Apple ha introducido el nuevo marco de notificaciones de usuario, que reemplaza al método UIApplication existente indicado anteriormente.

El marco de notificación de usuario proporciona lo siguiente:

  • Una API conocida que incluye la paridad de características con los métodos anteriores, lo que facilita la portabilidad del código desde el marco existente.
  • Incluye un conjunto expandido de opciones de contenido que permite enviar notificaciones más enriquecidas al usuario.
  • Tanto las notificaciones locales como remotas se pueden controlar mediante el mismo código y devoluciones de llamada.
  • Simplifica el proceso de control de devoluciones de llamada que se envían a una aplicación cuando el usuario interactúa con una notificación.
  • Administración mejorada de notificaciones pendientes y entregadas, incluida la capacidad de quitar o actualizar notificaciones.
  • Agrega la capacidad de realizar la presentación en la aplicación de las notificaciones.
  • Agrega la capacidad de programar y controlar las notificaciones desde las extensiones de aplicación.
  • Agrega un nuevo punto de extensión para las propias notificaciones.

El nuevo marco de notificaciones de usuario proporciona una API de notificación unificada en varias de las plataformas compatibles con Apple, entre las que se incluyen:

  • iOS: soporte completa para administrar y programar notificaciones.
  • tvOS: agrega la capacidad de etiquetar los iconos de la aplicación para las notificaciones locales y remotas.
  • watchOS: agrega la capacidad de reenviar notificaciones desde el dispositivo iOS emparejado del usuario a su Apple Watch y ofrece a las aplicaciones de inspección la capacidad de realizar notificaciones locales directamente en el propio reloj.
  • macOS: soporte completa para administrar y programar notificaciones.

Para obtener más información, consulta la documentación de AppleReferencia al marco de UserNotifications y UserNotificationsUI.

Preparación para la entrega de notificaciones

Antes de que una aplicación de iOS pueda enviar notificaciones al usuario, la aplicación debe registrarse en el sistema y, dado que una notificación es una interrupción del usuario, una aplicación debe solicitar explícitamente permiso antes de enviarlos.

Hay tres niveles diferentes de solicitudes de notificación que el usuario puede aprobar para una aplicación:

  • Se muestra el banner.
  • Alertas de sonido.
  • Concesión de insignias digitales del icono de la aplicación.

Además, estos niveles de aprobación deben solicitarse y establecerse tanto para las notificaciones remotas como para las locales.

El permiso de notificación debe solicitarse tan pronto como se inicie la aplicación agregando el código siguiente al FinishedLaunching método de y estableciendo el tipo de AppDelegate notificación deseado (UNAuthorizationOptions):

Nota:

UNUserNotificationCenter solo está disponible desde iOS 10+. Por lo tanto, es un procedimiento recomendado para comprobar la versión de macOS antes de enviar la solicitud.

using UserNotifications;
...

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
    // Version check
    if (UIDevice.CurrentDevice.CheckSystemVersion (10, 0)) {
        // Request notification permissions from the user
        UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, err) => {
            // Handle approval
        });
    }

    return true;
}

Dado que esta API está unificada y también funciona en Mac 10.14+, si está destinando a macOS, también debe comprobar el permiso de notificación tan pronto como sea posible:

using UserNotifications;
...

public override void DidFinishLaunching (NSNotification notification)
{
    // Check we're at least v10.14
    if (NSProcessInfo.ProcessInfo.IsOperatingSystemAtLeastVersion (new NSOperatingSystemVersion (10, 14, 0))) {
        // Request notification permissions from the user
        UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert | UNAuthorizationOptions.Badge | UNAuthorizationOptions.Sound, (approved, err) => {
            // Handle approval
        });
    }
}

> [!NOTE]
> With MacOS apps, for the permission dialog to appear, you must sign your macOS app, even if building locally in DEBUG mode. Therefore, **Project->Options->Mac Signing->Sign the application bundle** must be checked.

Additionally, a user can always change the notification privileges for an app at any time using the **Settings** app on the device. The app should check for the user's requested notification privileges before presenting a notification using the following code:

```csharp
// Get current notification settings
UNUserNotificationCenter.Current.GetNotificationSettings ((settings) => {
    var alertsAllowed = (settings.AlertSetting == UNNotificationSetting.Enabled);
});    

Configuración del entorno de notificaciones remotas

Nuevo en iOS 10, el desarrollador debe informar al sistema operativo en qué entorno se ejecuta la notificación push como desarrollo o producción. Si no se proporciona esta información, la aplicación se rechaza cuando se envía a iTune App Store con una notificación similar a la siguiente:

Falta el derecho de notificación de inserción: la aplicación incluye una API para el servicio de notificaciones push de Apple, pero falta el aps-environment derecho de la firma de la aplicación.

Para proporcionar el derecho necesario, haga lo siguiente:

  1. Haga doble clic en el archivo Entitlements.plist del Panel de solución para abrirlo para su edición.

  2. Cambie a la vista Código fuente:

    The Source view

  3. Haga clic en el botón + para agregar una nueva clave.

  4. Escriba aps-environment para la Propiedad, deje el Tipo como String y escriba development o production para el valor:

    The aps-environment Property

  5. Guarde los cambios en el archivo.

Registro para notificaciones remotas

Si la aplicación va a enviar y recibir notificaciones remotas, deberá realizar Registro de tokens mediante la API existente UIApplication. Este registro requiere que el dispositivo tenga un APN de acceso a la conexión de red activa, lo que generará el token necesario que se enviará a la aplicación. La aplicación debe reenviar este token a la aplicación del lado servidor del desarrollador para registrarse para recibir notificaciones remotas:

Token Registration overview

Use el código siguiente para inicializar el registro necesario:

UIApplication.SharedApplication.RegisterForRemoteNotifications ();

El token que se envía a la aplicación del lado servidor del desarrollador debe incluirse como parte de la carga de notificación que se envía desde el servidor a APNs al enviar una notificación remota:

The token included as part of the Notification Payload

El token actúa como la clave que vincula la notificación y la aplicación que se usa para abrir o responder a la notificación.

Para obtener más información, consulte la Guía de programación de notificaciones locales y remotas de Apple documentación.

Entrega de notificaciones

Con la aplicación totalmente registrada y los permisos necesarios solicitados y concedidos por el usuario, la aplicación ya está lista para enviar y recibir notificaciones.

Proporcionar contenido de notificación

Nuevo en iOS 10, todas las notificaciones contienen una título y subtítulo que siempre se mostrarán con el Cuerpo del contenido de la notificación. Además, es la capacidad de agregar elementos multimedia al contenido de la notificación.

Para crear el contenido de una notificación local, use el código siguiente:

var content = new UNMutableNotificationContent();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

En el caso de las notificaciones remotas, el proceso es similar:

{
    "aps":{
        "alert":{
            "title":"Notification Title",
            "subtitle":"Notification Subtitle",
            "body":"This is the message body of the notification."
        },
        "badge":1
    }
}

Programar cuando se envía una notificación

Con el contenido de la notificación creada, la aplicación debe programar cuándo se presentará la notificación al usuario estableciendo un Desencadenador. iOS 10 proporciona cuatro tipos de desencadenadores diferentes:

  • Notificación push: se usa exclusivamente con notificaciones remotas y se desencadena cuando APN envía un paquete de notificación a la aplicación que se ejecuta en el dispositivo.
  • Intervalo de tiempo: permite programar una notificación local a partir de un intervalo de tiempo que comienza con ahora y finalizando un punto futuro. Por ejemplo: var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);
  • Fecha de calendario: permite programar notificaciones locales para una fecha y hora específicas.
  • Ubicación basada: permite programar notificaciones locales cuando el dispositivo iOS entra o sale de una ubicación geográfica específica o está en una proximidad determinada a cualquier señal de audio bluetooth.

Cuando una notificación local está lista, la aplicación debe llamar al método Add del objeto UNUserNotificationCenter para programar su presentación al usuario. En el caso de las notificaciones remotas, la aplicación del lado servidor envía una carga de notificación a las APN, que luego envía el paquete al dispositivo del usuario.

Reunir todas las piezas, una notificación local de ejemplo podría ser similar a la siguiente:

using UserNotifications;
...

var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

var trigger =  UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);

var requestID = "sampleRequest";
var request = UNNotificationRequest.FromIdentifier (requestID, content, trigger);

UNUserNotificationCenter.Current.AddNotificationRequest (request, (err) => {
    if (err != null) {
        // Do something with error...
    }
});

Control de notificaciones de aplicaciones en primer plano

Nuevo en iOS 10, una aplicación puede controlar las notificaciones de forma diferente cuando se encuentra en primer plano y se desencadena una notificación. Al proporcionar un UNUserNotificationCenterDelegate e implementar el método WillPresentNotification, la aplicación puede asumir la responsabilidad de mostrar la notificación. Por ejemplo:

using System;
using UserNotifications;

namespace MonkeyNotification
{
    public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
    {
        #region Constructors
        public UserNotificationCenterDelegate ()
        {
        }
        #endregion

        #region Override Methods
        public override void WillPresentNotification (UNUserNotificationCenter center, UNNotification notification, Action<UNNotificationPresentationOptions> completionHandler)
        {
            // Do something with the notification
            Console.WriteLine ("Active Notification: {0}", notification);

            // Tell system to display the notification anyway or use
            // `None` to say we have handled the display locally.
            completionHandler (UNNotificationPresentationOptions.Alert);
        }
        #endregion
    }
}

Este código simplemente escribe el contenido de la UNNotification en la salida de la aplicación y pide al sistema que muestre la alerta estándar para la notificación.

Si la aplicación quería mostrar la notificación en sí cuando estaba en primer plano y no usar los valores predeterminados del sistema, pase None al controlador de finalización. Ejemplo:

completionHandler (UNNotificationPresentationOptions.None);

Con este código en su lugar, abra el archivo AppDelegate.cs para editar y cambiar el método FinishedLaunching para que tenga un aspecto similar al siguiente:

public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
    // Request notification permissions from the user
    UNUserNotificationCenter.Current.RequestAuthorization (UNAuthorizationOptions.Alert, (approved, err) => {
        // Handle approval
    });

    // Watch for notifications while the app is active
    UNUserNotificationCenter.Current.Delegate = new UserNotificationCenterDelegate ();

    return true;
}

Este código está adjuntando el UNUserNotificationCenterDelegate personalizado anterior a la UNUserNotificationCenter actual para que la aplicación pueda controlar la notificación mientras está activa y en primer plano.

Administración de notificaciones

Novedad de iOS 10, La administración de notificaciones proporciona acceso a notificaciones pendientes y entregadas y agrega la capacidad de quitar, actualizar o promover estas notificaciones.

Una parte importante de la administración de notificaciones es el identificador de solicitud que se asignó a la notificación cuando se creó y programó con el sistema. En el caso de las notificaciones remotas, esto se asigna a través del nuevo campo apps-collapse-id en el encabezado de solicitud HTTP.

El identificador de solicitud se usa para seleccionar la notificación en la que la aplicación desea realizar la administración de notificaciones.

Quitar notificaciones

Para quitar una notificación pendiente del sistema, use el código siguiente:

var requests = new string [] { "sampleRequest" };
UNUserNotificationCenter.Current.RemovePendingNotificationRequests (requests);

Para quitar una notificación ya entregada, use el código siguiente:

var requests = new string [] { "sampleRequest" };
UNUserNotificationCenter.Current.RemoveDeliveredNotifications (requests);

Actualizar una notificación existente

Para actualizar una notificación existente, simplemente cree una nueva notificación con los parámetros deseados modificados (como una nueva hora de desencadenador) y agréguelo al sistema con el mismo identificador de solicitud que la notificación que debe modificarse. Ejemplo:

using UserNotifications;
...

// Rebuild notification
var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;

// New trigger time
var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (10, false);

// ID of Notification to be updated
var requestID = "sampleRequest";
var request = UNNotificationRequest.FromIdentifier (requestID, content, trigger);

// Add to system to modify existing Notification
UNUserNotificationCenter.Current.AddNotificationRequest (request, (err) => {
    if (err != null) {
        // Do something with error...
    }
});

Para las notificaciones ya entregadas, la notificación existente se actualizará y promoverá a la parte superior de la lista en las pantallas Inicio y Bloqueo y en el Centro de notificaciones si el usuario ya lo ha leído.

Trabajar con acciones de notificación

En iOS 10, las notificaciones que se entregan al usuario no son estáticas y proporcionan varias maneras de que el usuario pueda interactuar con ellos (de acciones integradas a personalizadas).

Hay tres tipos de acciones a los que una aplicación iOS puede responder:

  • Acción predeterminada: es cuando el usuario pulsa una notificación para abrir la aplicación y mostrar los detalles de la notificación dada.
  • Acciones personalizadas: se agregaron en iOS 8 y proporcionan una manera rápida de que el usuario realice una tarea personalizada directamente desde la notificación sin necesidad de iniciar la aplicación. Se pueden presentar como una lista de botones con títulos personalizables o un campo de entrada de texto que se puede ejecutar en segundo plano (donde la aplicación recibe una pequeña cantidad de tiempo para cumplir la solicitud) o en primer plano (donde la aplicación se inicia en primer plano para cumplir la solicitud). Las acciones personalizadas están disponibles en iOS y watchOS.
  • Descartar acción: esta acción se envía a la aplicación cuando el usuario descarta una notificación determinada.

Creación de acciones personalizadas

Para crear y registrar una acción personalizada con el sistema, use el código siguiente:

// Create action
var actionID = "reply";
var title = "Reply";
var action = UNNotificationAction.FromIdentifier (actionID, title, UNNotificationActionOptions.None);

// Create category
var categoryID = "message";
var actions = new UNNotificationAction [] { action };
var intentIDs = new string [] { };
var categoryOptions = new UNNotificationCategoryOptions [] { };
var category = UNNotificationCategory.FromIdentifier (categoryID, actions, intentIDs, UNNotificationCategoryOptions.None);
    
// Register category
var categories = new UNNotificationCategory [] { category };
UNUserNotificationCenter.Current.SetNotificationCategories (new NSSet<UNNotificationCategory>(categories)); 

Al crear un nuevo UNNotificationAction, se le asigna un identificador único y el título que aparecerá en el botón. De forma predeterminada, la acción se creará como una acción en segundo plano, pero se pueden proporcionar opciones para ajustar el comportamiento de la acción (por ejemplo, establecerla como una acción en primer plano).

Cada una de las acciones creadas debe asociarse a una categoría. Al crear un nuevo UNNotificationCategory, se le asigna un identificador único, una lista de acciones que puede realizar, una lista de identificadores de intención para proporcionar más información sobre la intención de las acciones en la categoría y algunas opciones para controlar el comportamiento de la categoría.

Por último, todas las categorías se registran con el sistema mediante el método SetNotificationCategories.

Presentación de acciones personalizadas

Una vez que se ha creado y registrado un conjunto de acciones y categorías personalizadas con el sistema, se pueden presentar desde notificaciones locales o remotas.

En Notificación remota, establezca un category en la carga de notificación remota que coincida con una de las categorías creadas anteriormente. Por ejemplo:

{
    aps:{
        alert:"Hello world!",
        category:"message"
    }
}

En Notificaciones locales, establezca laCategoryIdentifier propiedad del objeto UNMutableNotificationContent. Por ejemplo:

var content = new UNMutableNotificationContent ();
content.Title = "Notification Title";
content.Subtitle = "Notification Subtitle";
content.Body = "This is the message body of the notification.";
content.Badge = 1;
content.CategoryIdentifier = "message";
...

De nuevo, este identificador debe coincidir con una de las categorías que se crearon anteriormente.

Control de acciones de descarte

Como se indicó anteriormente, se puede enviar una acción descartar a la aplicación cuando el usuario descarta una notificación. Puesto que no es una acción estándar, deberá establecerse una opción cuando se cree la categoría. Por ejemplo:

var categoryID = "message";
var actions = new UNNotificationAction [] { action };
var intentIDs = new string [] { };
var categoryOptions = new UNNotificationCategoryOptions [] { };
var category = UNNotificationCategory.FromIdentifier (categoryID, actions, intentIDs, UNNotificationCategoryOptions.CustomDismissAction);

Control de respuestas de acción

Cuando el usuario interactúa con las acciones y categorías personalizadas que se crearon anteriormente, la aplicación debe cumplir la tarea solicitada. Para ello, se proporciona un UNUserNotificationCenterDelegate e implementa el método UserNotificationCenter. Por ejemplo:

using System;
using UserNotifications;

namespace MonkeyNotification
{
    public class UserNotificationCenterDelegate : UNUserNotificationCenterDelegate
    {
        ...

        #region Override Methods
        public override void DidReceiveNotificationResponse (UNUserNotificationCenter center, UNNotificationResponse response, Action completionHandler)
        {
            // Take action based on Action ID
            switch (response.ActionIdentifier) {
            case "reply":
                // Do something
                break;
            default:
                // Take action based on identifier
                if (response.IsDefaultAction) {
                    // Handle default action...
                } else if (response.IsDismissAction) {
                    // Handle dismiss action
                }
                break;
            }

            // Inform caller it has been handled
            completionHandler();
        }
        #endregion
    }
}

La clase de UNNotificationResponse pasada tiene una propiedad ActionIdentifier que puede ser la acción predeterminada o la acción descartar. Use response.Notification.Request.Identifier para probar las acciones personalizadas.

La propiedad UserText contiene el valor de cualquier entrada de texto de usuario. La propiedad Notification contiene la notificación de origen que incluye la solicitud con el desencadenador y el contenido de notificación. La aplicación puede decidir si era una notificación local o remota basada en el tipo de desencadenador.

Nota:

iOS 12 permite que una interfaz de usuario de notificación personalizada modifique sus botones de acción en tiempo de ejecución. Para obtener más información, eche un vistazo a los botones acción de notificación dinámica documentación.

Trabajar con extensiones de servicio

Al trabajar con notificaciones remotas, extensiones de servicio proporcionan una manera de habilitar el cifrado de un extremo a otro dentro de la carga de notificación. Las extensiones de servicio son una extensión que no es de interfaz de usuario (disponible en iOS 10) que se ejecuta en segundo plano con el propósito principal de aumentar o reemplazar el contenido visible de una notificación antes de presentarlo al usuario.

Service Extension overview

Las extensiones de servicio están diseñadas para ejecutarse rápidamente y solo se les da un breve período de tiempo para ejecutarse por el sistema. En caso de que la extensión de servicio no complete su tarea en el período de tiempo asignado, se llamará a un método de reserva. Si se produce un error en la reserva, el contenido de notificación original se mostrará al usuario.

Algunos posibles usos de extensiones de servicio incluyen:

  • Proporcionar cifrado de un extremo a otro del contenido de notificación remota.
  • Agregar datos adjuntos a notificaciones remotas para enriquecerlos.

Implementación de una extensión de servicio

Para implementar una extensión de servicio en una aplicación de Xamarin.iOS, haga lo siguiente:

  1. Abra la solución de la aplicación en Visual Studio para Mac.

  2. Haga clic con el botón derecho en el nombre de la solución en el panel de solución y seleccione Agregar>Agregar nuevo proyecto.

  3. Seleccione iOS>Extensiones>Extensiones del servicio de notificaciones y haga clic en el botón Siguiente :

    Select Notification Service Extensions

  4. Escriba un nombre para la extensión y haga clic en el botón Siguiente:

    Enter a Name for the extension

  5. Ajuste el Nombre de proyecto o Nombre de la solución si es necesario y haga clic en el botón Crear:

    Adjust the Project Name and/or Solution Name

Importante

El identificador de agrupación de la extensión de servicio debe coincidir con el identificador de lote de la aplicación principal con .appnameserviceextension anexados al final. Por ejemplo, si la aplicación principal tenía un identificador de agrupación de com.xamarin.monkeynotify, la extensión de servicio debe tener un identificador de agrupación de com.xamarin.monkeynotify.monkeynotifyserviceextension. Esto se debe establecer automáticamente cuando se agrega la extensión a la solución.

Hay una clase principal en la extensión del servicio de notificaciones que tendrá que modificarse para proporcionar la funcionalidad necesaria. Por ejemplo:

using System;
using Foundation;
using UIKit;
using UserNotifications;

namespace MonkeyChatServiceExtension
{
    [Register ("NotificationService")]
    public class NotificationService : UNNotificationServiceExtension
    {
        #region Computed Properties
        public Action<UNNotificationContent> ContentHandler { get; set; }
        public UNMutableNotificationContent BestAttemptContent { get; set; }
        #endregion

        #region Constructors
        protected NotificationService (IntPtr handle) : base (handle)
        {
            // Note: this .ctor should not contain any initialization logic.
        }
        #endregion

        #region Override Methods
        public override void DidReceiveNotificationRequest (UNNotificationRequest request, Action<UNNotificationContent> contentHandler)
        {
            ContentHandler = contentHandler;
            BestAttemptContent = (UNMutableNotificationContent)request.Content.MutableCopy ();

            // Modify the notification content here...
            BestAttemptContent.Title = $"{BestAttemptContent.Title}[modified]";

            ContentHandler (BestAttemptContent);
        }

        public override void TimeWillExpire ()
        {
            // Called just before the extension will be terminated by the system.
            // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.

            ContentHandler (BestAttemptContent);
        }
        #endregion
    }
}

El primer método, DidReceiveNotificationRequest, se pasará el identificador de notificación, así como el contenido de notificación a través del objeto request. El contentHandler pasado deberá llamarse para presentar la notificación al usuario.

Se llamará al segundo método, TimeWillExpire, justo antes de que se agote el tiempo para que la extensión de servicio procese la solicitud. Si la extensión de servicio no puede llamar al contentHandler en la cantidad de tiempo asignado, el contenido original se mostrará al usuario.

Desencadenar una extensión de servicio

Con una extensión de servicio creada y entregada con la aplicación, se puede desencadenar modificando la carga de notificación remota enviada al dispositivo. Por ejemplo:

{
    aps : {
        alert : "New Message Available",
        mutable-content: 1
    },
    encrypted-content : "#theencryptedcontent"
}

La nueva clave de mutable-content especifica que la extensión de servicio tendrá que iniciarse para actualizar el contenido de notificación remota. La clave encrypted-content contiene los datos cifrados que la extensión de servicio puede descifrar antes de presentar al usuario.

Eche un vistazo a la siguiente extensión de servicio de ejemplo:

using UserNotification;

namespace myApp {
    public class NotificationService : UNNotificationServiceExtension {
    
        public override void DidReceiveNotificationRequest(UNNotificationRequest request, contentHandler) {
            // Decrypt payload
            var decryptedBody = Decrypt(Request.Content.UserInfo["encrypted-content"]);
            
            // Modify Notification body
            var newContent = new UNMutableNotificationContent();
            newContent.Body = decryptedBody;
            
            // Present to user
            contentHandler(newContent);
        }
        
        public override void TimeWillExpire() {
            // Handle out-of-time fallback event
            ...
        }
        
    }
}

Este código descifra el contenido cifrado de la clave encrypted-content, crea una nueva UNMutableNotificationContent, establece la propiedad Body en el contenido descifrado y usa el contentHandler para presentar la notificación al usuario.

Resumen

En este artículo se han tratado todas las formas en que iOS 10 ha mejorado la notificación de usuarios. Presentó el nuevo marco de notificaciones de usuario y cómo usarlo en una aplicación de Xamarin.iOS o una extensión de aplicación.