Notificaciones de usuario mejoradas en Xamarin.iOS

Novedad de iOS 10, el marco de notificaciones de usuario permite la entrega y el control de las notificaciones locales y remotas. Con este marco, una aplicación o una 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, una aplicación o una 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 acumula 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 maneras de presentar una notificación:

  • Si el dispositivo está desbloqueado, la notificación se revertirá desde la parte superior de la pantalla como banner.
  • Si el dispositivo está bloqueado, la notificación se mostrará en la pantalla de bloqueo del usuario.
  • Si el usuario ha perdido 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 : las aplicaciones instaladas localmente en el dispositivo de los usuarios envían estas notificaciones.
  • 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:

  • Las aplicaciones que son locales en el dispositivo del usuario las envían.
  • 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 compatibles con ubicación

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

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úe 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:

  • Acceso 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 documentación de la Guía de programación de notificaciones remotas y locales de Apple.

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 pueden surgir al trabajar con la API de notificación existente:

  • Hubo diferentes devoluciones de llamada necesarias para las notificaciones locales o remotas que podrían 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 compatibilidad 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 el método existente UIApplication indicado anteriormente.

El marco de notificaciones de usuario proporciona lo siguiente:

  • Una API conocida que incluye paridad de características con los métodos anteriores, lo que facilita el puerto 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 extensiones de aplicaciones.
  • Agrega un nuevo punto de extensión para las notificaciones.

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

  • iOS : compatibilidad completa para administrar y programar notificaciones.
  • tvOS : agrega la capacidad de notificación de iconos de aplicación para 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 : compatibilidad completa para administrar y programar notificaciones.

Para obtener más información, consulte la referencia de UserNotifications Framework de Apple y la documentación de UserNotificationsUI .

Preparación para la entrega de notificaciones

Para 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 para el 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.
  • Badging the app icon.

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

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 y versiones posteriores. Por lo tanto, se recomienda 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 y versiones posteriores, si va a dirigirse a macOS, también debe comprobar el permiso de notificación lo antes 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 al App Store de iTune 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 Entitlements.plist archivo en el Panel de solución para abrirlo para su edición.

  2. Cambie a la vista Origen :

    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, seguirá teniendo que realizar el 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. A continuació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 deberá 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 usada para abrir o responder a la notificación.

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

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

Novedad de iOS 10, todas las notificaciones contienen un título y un subtítulo que siempre se mostrarán con el cuerpo del contenido de la notificación. Además, es la capacidad de agregar datos adjuntos 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
    }
}

Programación 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 finaliza 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.
  • Basado en ubicación: 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 baliza de Bluetooth.

Cuando una notificación local está lista, la aplicación debe llamar al Add método del UNUserNotificationCenter objeto 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 los 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 las notificaciones de la aplicación en primer plano

Nueva 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 WillPresentNotification método , 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 en UNNotification 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í misma 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 AppDelegate.cs archivo para editar y cambiar el FinishedLaunching método 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 personalizado UNUserNotificationCenterDelegate anterior al actual UNUserNotificationCenter 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, Notification Management 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. Para las notificaciones remotas, esto se asigna a través del nuevo apps-collapse-id campo 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.

Eliminación de 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);

Actualización de una notificación existente

Para actualizar una notificación existente, basta con crear una nueva notificación con los parámetros deseados modificados (por ejemplo, una nueva hora de desencadenador) y agregarla 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 (desde acciones integradas a personalizadas).

Hay tres tipos de acciones a los que una aplicación de 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 especificada.
  • 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 satisfacer la solicitud) o el primer plano (donde se inicia la aplicación 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.

Crear 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 SetNotificationCategories método .

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 la CategoryIdentifier propiedad del UNMutableNotificationContent objeto . 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 personalizadas y las categorías que se crearon anteriormente, la aplicación debe cumplir la tarea solicitada. Para ello, se proporciona un UNUserNotificationCenterDelegate e implementa el UserNotificationCenter método . 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 pasada UNNotificationResponse tiene una ActionIdentifier propiedad que puede ser la acción predeterminada o la acción descartar. Use response.Notification.Request.Identifier para probar las acciones personalizadas.

La UserText propiedad contiene el valor de cualquier entrada de texto de usuario. La Notification propiedad 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 la documentación de los botones de acción de notificación dinámica .

Trabajar con extensiones de servicio

Al trabajar con notificaciones remotas, las 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 una corta cantidad de tiempo para ejecutarse por el sistema. En caso de que la extensión de servicio no complete su tarea en la cantidad 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 AgregarAgregar> nuevo Project.

  3. Seleccione iOSExtensionsNotification>>Service Extensions 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 Project Nombre 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 anexado 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 lote 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 deberá 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 request objeto . Será necesario llamar al pasado contentHandler 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 contentHandler a en la cantidad de tiempo asignada, 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 mutable-content clave especifica que la extensión de servicio tendrá que iniciarse para actualizar el contenido de la notificación remota. La encrypted-content clave 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 encrypted-content clave, crea un nuevo UNMutableNotificationContent, establece la Body propiedad en el contenido descifrado y usa 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. Se 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.