Notificaciones de usuario mejoradas en Xamarin. iOSEnhanced User Notifications in Xamarin.iOS

Como novedad de iOS 10, el marco de trabajo de notificaciones de usuario permite la entrega y el control de las notificaciones locales y remotas.New to iOS 10, the User Notification framework allows for the delivery and handling of local and remote notifications. Con este marco de trabajo, una extensión de aplicación o aplicación puede programar la entrega de notificaciones locales especificando un conjunto de condiciones como la ubicación o la hora del día.Using this framework, an app or App Extension can schedule the delivery of local notifications by specifying a set of conditions such as location or time of day.

Acerca de las notificaciones de usuarioAbout User Notifications

Como se indicó anteriormente, el nuevo marco de trabajo de notificaciones de usuario permite la entrega y el control de notificaciones locales y remotas.As stated above, the new User Notification framework allows for the delivery and handling of local and remote notifications. Con este marco de trabajo, una extensión de aplicación o aplicación puede programar la entrega de notificaciones locales especificando un conjunto de condiciones como la ubicación o la hora del día.Using this framework, an app or App Extension can schedule the delivery of local notifications by specifying a set of conditions such as location or time of day.

Además, la aplicación o la extensión pueden recibir (y potencialmente modificar) las notificaciones locales y remotas, ya que se entregan al dispositivo iOS del usuario.Additionally, the app or extension can receive (and potentially modify) both local and remote notifications as they are delivered to the user's iOS device.

El marco de trabajo de la interfaz de usuario de notificaciones de usuario nuevo permite personalizar la apariencia de las notificaciones locales y remotas cuando se presentan al usuario.The new User Notification UI framework allows an app or App Extension to customize the appearance of both local and remote notifications when they are presented to the user.

Este marco de trabajo proporciona las siguientes maneras en que una aplicación puede enviar notificaciones a un usuario:This framework provides the following ways that an app can deliver notifications to a user:

  • Alertas visuales : donde la notificación se revierte desde la parte superior de la pantalla como un banner.Visual Alerts - Where the notification rolls down from the top of the screen as a banner.
  • Sonido y vibraciones : pueden asociarse con una notificación.Sound and Vibrations - Can be associated with a notification.
  • Icono de la aplicación distintivos : 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.App Icon Badging - Where the app's icon displays a badge showing that new content is available, such as the number of unread email messages.

Además, en función del contexto actual del usuario, hay diferentes maneras en que se presentará una notificación:Additionally, depending on the user's current context, there are different ways that a notification will be presented:

  • Si el dispositivo está desbloqueado, la notificación se retirará de la parte superior de la pantalla como un banner.If the device is unlocked, the notification will roll down from the top of the screen as a banner.
  • Si el dispositivo está bloqueado, la notificación se mostrará en la pantalla de bloqueo del usuario.If the device is locked, the notification will be displayed on the user's lock screen.
  • Si el usuario ha perdido una notificación, puede abrir el centro de notificaciones y ver cualquier notificación disponible y en espera.If the user has missed a notification, they can open the Notification Center and view any available, waiting notifications there.

Una aplicación Xamarin. iOS tiene dos tipos de notificaciones de usuario que se pueden enviar:A Xamarin.iOS app has two types of User Notifications that it is able to send:

  • Notificaciones locales : las envían las aplicaciones instaladas localmente en el dispositivo de los usuarios.Local Notifications - These are sent by apps installed locally on the users device.
  • Notificaciones remotas : se envían desde un servidor remoto y se presentan al usuario, o bien desencadenan una actualización en segundo plano del contenido de la aplicación.Remote Notifications - Are sent from a remote server and either presented to the user or they trigger a background update of the app's content.

Acerca de las notificaciones localesAbout Local Notifications

Las notificaciones locales que una aplicación de iOS puede enviar tienen las siguientes características y atributos:The Local Notifications that an iOS app can send have the following features and attributes:

  • Los envían las aplicaciones que son locales en el dispositivo del usuario.They are sent by apps that are local on the user's device.
  • Se pueden configurar para usar desencadenadores de hora o de ubicación.They are can be configured to use either time or location based triggers.
  • La aplicación programa la notificación con el dispositivo del usuario y se muestra cuando se cumple la condición del desencadenador.The app schedules the notification with the user's device and it is displayed when the trigger condition is met.
  • Cuando el usuario interactúa con una notificación, la aplicación recibirá una devolución de llamada.When the user interacts with a notification, the app will receive a callback.

Algunos ejemplos de notificaciones locales incluyen:Some examples of Local Notifications include:

  • Alertas de calendarioCalendar Alerts
  • Alertas de recordatorioReminder Alerts
  • Desencadenadores con reconocimiento de ubicaciónLocation Aware Triggers

Para obtener más información, consulte la documentación de la Guía de programación de notificaciones locales y remotas de Apple.For more information, please see Apple's Local and Remote Notification Programming Guide documentation.

Acerca de las notificaciones remotasAbout Remote Notifications

Las notificaciones remotas que puede enviar una aplicación iOS tienen las siguientes características y atributos:The Remote Notifications that an iOS app can send have the following features and attributes:

  • La aplicación tiene un componente del lado servidor con el que se comunica.The app has a server-side component that it communicates with.
  • El Apple Push Notification Service (APNs) se usa para transmitir la entrega de mejor esfuerzo de las notificaciones remotas al dispositivo del usuario desde los servidores basados en la nube del desarrollador.The Apple Push Notification Service (APNs) is used to transmit a best-effort delivery of Remote Notifications to the user's device from the developer's cloud based servers.
  • Cuando la aplicación recibe la notificación remota, se mostrará al usuario.When the app receives the Remote Notification it will be displayed to the user.
  • Cuando el usuario interactúa con la notificación, la aplicación recibirá una devolución de llamada.When the user interacts with the notification, the app will receive a callback.

Algunos ejemplos de notificaciones remotas son:Some examples of Remote Notifications include:

  • Alertas de noticiasNews Alerts
  • Actualizaciones deportivasSports Updates
  • Mensajes de mensajería instantáneaInstant Messaging Messages

Hay dos tipos de notificaciones remotas disponibles para una aplicación de iOS:There are two types of Remote Notifications available to a iOS app:

  • Accesible para el usuario: se muestra al usuario en el dispositivo.User Facing - These are displayed to the user on the device.
  • Actualizaciones silenciosas : proporcionan un mecanismo para actualizar el contenido de una aplicación iOS en segundo plano.Silent Updates - These provide a mechanism to update the contents of an iOS app in the background. Cuando se recibe una actualización silenciosa, la aplicación puede ponerse en contacto con los servidores remotos para desplegar el contenido más reciente.When a Silent Update is received, the app can reach out to the remote servers to pull down the latest content.

Para obtener más información, consulte la documentación de la Guía de programación de notificaciones locales y remotas de Apple.For more information, please see Apple's Local and Remote Notification Programming Guide documentation.

Acerca de la API de notificaciones existenteAbout The Existing Notifications API

Antes de iOS 10, una aplicación de iOS usaría UIApplication para registrar una notificación en el sistema y programar cómo se debe desencadenar dicha notificación (por hora o por ubicación).Prior to iOS 10, an iOS app would use UIApplication to register a notification with the system and to schedule how that notification should be triggered (either by time or location).

Hay varios problemas que un desarrollador puede encontrar al trabajar con la API de notificación existente:There are several issue that a developer might encounter when working with the existing notification API:

  • Se requieren diferentes devoluciones de llamada para las notificaciones locales o remotas, lo que podría provocar la duplicación del código.There were different callbacks required for Local or Remote Notifications which could lead to duplication of code.
  • La aplicación tenía un control limitado de la notificación después de haberla programado con el sistema.The app had limited control of the notification after it had been scheduled with the system.
  • Había diferentes niveles de compatibilidad en todas las plataformas existentes de Apple.There were differing levels of support across all of Apple's existing platforms.

Acerca del nuevo marco de notificaciones de usuarioAbout the New User Notification Framework

Con iOS 10, Apple ha introducido el nuevo marco de notificaciones de usuario, que reemplaza al UIApplication método existente anterior.With iOS 10, Apple has introduced the new User Notification framework, which replaces the existing UIApplication method noted above.

El marco de trabajo de notificaciones de usuario proporciona lo siguiente:The User Notification framework provides the following:

  • Una API conocida que incluye paridad de características con los métodos anteriores, lo que facilita el traslado de código desde el marco de trabajo existente.A familiar API that includes feature parity with the previous methods making it easy to port code from the existing framework.
  • Incluye un conjunto expandido de opciones de contenido que permite enviar notificaciones más completas al usuario.Includes an expanded set of content options that allows richer notifications to be sent to the user.
  • Las notificaciones locales y remotas se pueden controlar mediante el mismo código y las devoluciones de llamada.Both Local and Remote Notifications can be handled by the same code and callbacks.
  • Simplifica el proceso de control de las devoluciones de llamada que se envían a una aplicación cuando el usuario interactúa con una notificación.Simplifies the process of handling callbacks that are sent to an app when the user interacts with a notification.
  • Administración mejorada de las notificaciones pendientes y entregadas, incluida la capacidad de quitar o actualizar las notificaciones.Enhanced management of both pending and delivered notifications including the ability to remove or update notifications.
  • Agrega la capacidad de realizar la presentación en aplicación de notificaciones.Adds the ability to do in-app presentation of notifications.
  • Agrega la capacidad de programar y controlar las notificaciones desde las extensiones de la aplicación.Adds the ability to schedule and handle notifications from within App Extensions.
  • Agrega un nuevo punto de extensión para las notificaciones.Adds new extension point for the notifications themselves.

El nuevo marco de trabajo de notificaciones de usuario proporciona una API de notificaciones unificada en el múltiplo de las plataformas que admite Apple, entre las que se incluyen:The new User Notification framework provides a unified notification API across the multiple of the platforms that Apple supports including:

  • iOS : compatibilidad completa para administrar y programar notificaciones.iOS - Full support to manage and schedule notifications.
  • tvOS : agrega la capacidad de los iconos de aplicación de distintivo para las notificaciones locales y remotas.tvOS - Adds the ability to badge app icons for local and remote notifications.
  • watchos : agrega la capacidad de reenviar notificaciones desde el dispositivo iOS emparejado del usuario a su Apple Watch y proporciona a las aplicaciones de supervisión la capacidad de realizar notificaciones locales directamente en el propio reloj.watchOS - Adds the ability to forward notifications from the user's paired iOS device to their Apple Watch and gives watch apps the ability to do local notifications directly on the watch itself.
  • MacOS : compatibilidad completa para administrar y programar notificaciones.macOS - Full support to manage and schedule notifications.

Para obtener más información, consulte la documentación de UserNotifications Framework y UserNotificationsUI de Apple.For more information, please see Apple's UserNotifications Framework Reference and UserNotificationsUI documentation.

Preparación para la entrega de notificacionesPreparing for Notification Delivery

Antes de que una aplicación de iOS pueda enviar notificaciones al usuario, la aplicación debe estar registrada en el sistema y, dado que una notificación es una interrupción para el usuario, una aplicación debe solicitar explícitamente el permiso antes de enviarlos.Before an iOS app can send notifications to the user the app must be registered with the system and, because a notification is an interruption to the user, an app must explicitly request permission before sending them.

Hay tres niveles diferentes de solicitudes de notificación que el usuario puede aprobar para una aplicación:There are three different levels of notification requests that the user can approve for an app:

  • Pancarta.Banner displays.
  • Alertas de sonido.Sound alerts.
  • Distintivos el icono de la aplicación.Badging the app icon.

Además, estos niveles de aprobación deben solicitarse y configurarse para las notificaciones locales y remotas.Additionally, these approval levels must be requested and set for both local and remote notifications.

El permiso de notificación debe solicitarse en cuanto se inicie la aplicación agregando el código siguiente al FinishedLaunching método de AppDelegate y estableciendo el tipo de notificación deseado ( UNAuthorizationOptions ):Notification permission should be requested as soon as the app launches by adding the following code to the FinishedLaunching method of the AppDelegate and setting the desired notification type (UNAuthorizationOptions):

Nota

UNUserNotificationCenter solo está disponible en iOS 10 +.UNUserNotificationCenter is only available from iOS 10+. Por lo tanto, se recomienda comprobar la versión de macOS antes de enviar la solicitud.Therefore, it's best practice to check the macOS version before sending the request.

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;
}

Como esta API está unificada y también funciona en Mac 10.14 +, si está destino macOS también debe comprobar el permiso de notificación lo antes posible:As this API is unified and also works on Mac 10.14+, if you are targetting macOS you must also check for the Notification permission as soon as possible:

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 remotasConfiguring the Remote Notifications Environment

Como novedad de iOS 10, el desarrollador debe informar al sistema operativo de en qué entorno se ejecuta la notificación de inserciones de entorno como desarrollo o producción.New to iOS 10, the developer must inform the OS what environment Push Notification are running in as either Development or Production. Si no se proporciona esta información, puede dar lugar a que se rechace la aplicación cuando se envía a la tienda de aplicaciones de iTunes con una notificación similar a la siguiente:Failure to provide this information can result in the app being rejected when submitted to the iTune App Store with a notification similar to the following:

Falta el derecho a la notificación de envío: la aplicación incluye una API para el servicio de notificaciones de envío de Apple, pero aps-environment falta el derecho en la firma de la aplicación.Missing Push Notification Entitlement - Your app includes an API for Apple's Push Notification service, but the aps-environment entitlement is missing from the app's signature.

Para proporcionar el derecho necesario, haga lo siguiente:To provide the required entitlement, do the following:

  1. Haga doble clic en el Entitlements.plist archivo en el Panel de solución para abrirlo para su edición.Double-click the Entitlements.plist file in the Solution Pad to open it for editing.

  2. Cambie a la vista de código fuente :Switch to the Source view:

    Vista de código fuenteThe Source view

  3. Haga clic en el + botón para agregar una nueva clave.Click the + button to add a new key.

  4. Escriba aps-environment para la propiedad, deje el tipo como String y escriba development o production para el valor:Enter aps-environment for the Property, leave the Type as String and enter either development or production for the Value:

    La propiedad APS-EnvironmentThe aps-environment Property

  5. Guarde los cambios en el archivo.Save the changes to the file.

Registro de notificaciones remotasRegistering for Remote Notifications

Si la aplicación va a enviar y recibir notificaciones remotas, aún tendrá que realizar el registro de tokens mediante la UIApplication API existente.If the app will be sending and receiving Remote Notifications, it will still need to do Token Registration using the existing UIApplication API. Este registro requiere que el dispositivo tenga acceso de conexión de red activo APNs, lo que generará el token necesario que se enviará a la aplicación.This registration requires the device to have a live network connection access APNs, which will generate the necessary token that will be sent to the app. La aplicación debe reenviar este token a la aplicación del lado servidor del desarrollador para registrarse para recibir notificaciones remotas:The app needs to then forward this token to the developer's server side app to register for remote notifications:

Introducción al registro de tokensToken Registration overview

Use el código siguiente para inicializar el registro necesario:Use the following code to initialize the required registration:

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 cuando se envía una notificación remota:The token that gets sent to the developer's server side app will need to be included as part of the Notification Payload that get's sent from the server to APNs when sending a Remote Notification:

El token incluido como parte de la carga de notificaciónThe token included as part of the Notification Payload

El token actúa como la clave que une la notificación y la aplicación que se usa para abrir o responder a la notificación.The token acts as the key that ties together the notification and the app used to open or respond to the notification.

Para obtener más información, consulte la documentación de la Guía de programación de notificaciones locales y remotas de Apple.For more information, please see Apple's Local and Remote Notification Programming Guide documentation.

Entrega de notificacionesNotification Delivery

Una vez que la aplicación esté totalmente registrada y los permisos necesarios solicitados y concedidos por el usuario, la aplicación ya está lista para enviar y recibir notificaciones.With the app fully registered and the required permissions requested from and granted by the user, the app is now ready to send and receive notifications.

Proporcionar contenido de notificaciónProviding Notification Content

Como 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.New to iOS 10, all notifications contain both a Title and Subtitle that will always be displayed with the Body of the notification content. También es nuevo, es la capacidad de agregar datos adjuntos de multimedia al contenido de notificación.Also new, is the ability to add Media Attachments to the notification content.

Para crear el contenido de una notificación local, use el código siguiente:To create the content of a Local Notification, use the following code:

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:For Remote Notifications, the process is similar:

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

Programar Cuándo se envía una notificaciónScheduling When a Notification is Sent

Con el contenido de la notificación creada, la aplicación debe programar Cuándo se presentará la notificación al usuario mediante el establecimiento de un desencadenador.With the content of the Notification created, the app needs to schedule when the notification will be presented to the user by setting a Trigger. iOS 10 proporciona cuatro tipos de desencadenadores diferentes:iOS 10 provides four different Trigger types:

  • Notificación push : se usa exclusivamente con notificaciones remotas y se desencadena cuando APNs envía un paquete de notificación a la aplicación que se ejecuta en el dispositivo.Push Notification - Is used exclusively with Remote Notifications and is triggered when APNs sends a notification package to the app running on the device.
  • Intervalo de tiempo : permite programar una notificación local desde un intervalo de tiempo de inicio con ahora y finalizar un momento posterior.Time Interval - Allows a Local Notification to be scheduled from a time interval start with now and ending a some future point. Por ejemplo, var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);.For example, var trigger = UNTimeIntervalNotificationTrigger.CreateTrigger (5, false);
  • Fecha del calendario : permite programar las notificaciones locales para una fecha y hora específicas.Calendar Date - Allows Local Notifications to be scheduled for a specific date and time.
  • Basado en la ubicación : permite programar las 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 Bluetooth.Location Based - Allows Local Notifications to be scheduled when the iOS device is entering or leaving a specific geographic location or is in a given proximity to any Bluetooth Beacons.

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.When a Local Notification is ready, the app needs to call the Add method of the UNUserNotificationCenter object to schedule its display to the user. En el caso de las notificaciones remotas, la aplicación del lado servidor envía una carga de notificación a APNs, que luego envía el paquete al dispositivo del usuario.For Remote Notifications, the server-side app sends a Notification Payload to the APNs, which then sends the packet on to the user's device.

Al reunir todas las piezas, una notificación local de ejemplo podría ser similar a la siguiente:Bringing all of the pieces together, a sample Local Notification might look like:

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 aplicación en primer planoHandling Foreground App Notifications

Como novedad de iOS 10, una aplicación puede controlar las notificaciones de forma distinta cuando está en primer plano y se desencadena una notificación.New to iOS 10, an app can handle Notifications differently when it is in the foreground and a Notification is triggered. Al proporcionar UNUserNotificationCenterDelegate e implementar el WillPresentNotification método, la aplicación puede asumir la responsabilidad de mostrar la notificación.By providing a UNUserNotificationCenterDelegate and implementing the WillPresentNotification method, the app can take over responsibility for displaying the Notification. Por ejemplo:For example:

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 UNNotification en la salida de la aplicación y pide al sistema que muestre la alerta estándar para la notificación.This code is simply writing out the contents of the UNNotification to the Application Output and asking the system to display the standard Alert for the notification.

Si la aplicación desea 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.If the app wanted to display the notification itself when it was in the foreground, and not use the system defaults, pass None to the completion handler. Ejemplo:Example:

completionHandler (UNNotificationPresentationOptions.None);

Con este código en su lugar, abra el AppDelegate.cs archivo para editarlo y cambie el FinishedLaunching método para que tenga un aspecto similar al siguiente:With this code in place, open the AppDelegate.cs file for editing and change the FinishedLaunching method to look like the following:

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 para UNUserNotificationCenter que la aplicación pueda controlar la notificación mientras está activo y en primer plano.This code is attaching the custom UNUserNotificationCenterDelegate from above to the current UNUserNotificationCenter so the app can handle notification while it is active and in the foreground.

Administración de notificacionesNotification Management

Como novedad de iOS 10, Notification Management proporciona acceso a las notificaciones pendientes y entregadas y agrega la capacidad de quitar, actualizar o promover estas notificaciones.New to iOS 10, Notification Management provides access to both pending and delivered Notifications and adds the ability to remove, update or promote these Notifications.

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.An important part of Notification Management is the Request Identifier that was assigned to the Notification when it was created and scheduled with the system. En el caso de las notificaciones remotas, se asigna a través del apps-collapse-id campo nuevo en el encabezado de la solicitud HTTP.For Remote Notifications, this is assigned via the new apps-collapse-id field in the HTTP request header.

El identificador de solicitud se usa para seleccionar la notificación en la que la aplicación desea realizar la administración de notificaciones.The Request Identifier is used to select the Notification that the app wishes to perform Notification Management on.

Quitar notificacionesRemoving Notifications

Para quitar una notificación pendiente del sistema, utilice el siguiente código:To remove a pending Notification from the system, use the following code:

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

Para quitar una notificación ya entregada, use el código siguiente:To remove an already delivered Notification, use the following code:

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

Actualizar una notificación existenteUpdating an Existing Notification

Para actualizar una notificación existente, solo tiene que crear una nueva notificación con los parámetros deseados modificados (como una nueva hora del desencadenador) y agregarla al sistema con el mismo identificador de solicitud que la notificación que debe modificarse.To update an existing Notification, simply create a new notification with the desired parameters modified (such as a new trigger time) and add it to the system with the same Request Identifier as the Notification that needs to be modified. Ejemplo:Example:

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...
    }
});

En el caso de las notificaciones ya entregadas, la notificación existente se actualizará y se promoverá a la parte superior de la lista en las pantallas Inicio y de bloqueo, y en el centro de notificaciones si ya la ha leído el usuario.For already delivered Notifications, the existing Notification will get updated and promoted to the top of the list on the Home and Lock screens and in the Notification Center if it has already been read by the user.

Trabajar con acciones de notificaciónWorking with Notification Actions

En iOS 10, las notificaciones que se entregan al usuario no son estáticas y proporcionan varias maneras en las que el usuario puede interactuar con ellas (desde las acciones integradas a las personalizadas).In iOS 10, Notifications that are delivered to the user are not static, and provide several ways that the user can interact with them (from built-in to custom Actions).

Hay tres tipos de acciones a las que puede responder una aplicación iOS:There are three types of Actions that an iOS app can respond to:

  • Acción predeterminada : es cuando el usuario puntea una notificación para abrir la aplicación y mostrar los detalles de la notificación dada.Default Action - This is when the user taps a Notification to open the app and display the details of the given Notification.
  • Acciones personalizadas : se agregaron en iOS 8 y proporcionan una manera rápida para que el usuario realice una tarea personalizada directamente desde la notificación sin necesidad de iniciar la aplicación.Custom Actions - These were added in iOS 8 and provide a quick way for the user to perform a custom task directly from the Notification without needing to launch the app. 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 tiene una pequeña cantidad de tiempo para completar la solicitud) o en el primer plano (donde la aplicación se inicia en primer plano para satisfacer la solicitud).They can be presented as either a list of buttons with customizable titles or a text input field which can run either in the Background (where the app is given a small amount of time to fulfill the request) or the Foreground (where the app is launched in the foreground to fulfill the request). Las acciones personalizadas están disponibles en iOS y watchos.Custom Actions are available on both iOS and watchOS.
  • Acción de descartar : esta acción se envía a la aplicación cuando el usuario descarta una notificación determinada.Dismiss Action - This Action is sent to the app when the user dismisses a given Notification.

Crear acciones personalizadasCreating Custom Actions

Para crear y registrar una acción personalizada con el sistema, use el código siguiente:To create and register a Custom Action with the system, use the following code:

// 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.When creating a new UNNotificationAction, it is assigned a unique ID and the title that will appear on the button. De forma predeterminada, la acción se creará como una acción en segundo plano; sin embargo, se pueden proporcionar opciones para ajustar el comportamiento de la acción (por ejemplo, establecerla como una acción en primer plano).By default, the Action will be created as a Background Action, however options can be supplied to adjust the Action's behavior (for example setting it to be a Foreground Action).

Cada una de las acciones creadas debe estar asociada a una categoría.Each of the Actions created need to be associated with a Category. 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.When creating a new UNNotificationCategory, it is assigned a unique ID, a list of Actions it can perform, a list of Intent IDs to provide more information about the intent of the Actions in the Category and some options to control the behavior of the Category.

Por último, todas las categorías se registran con el sistema mediante el SetNotificationCategories método.Finally, all of the Categories are registered with the system using the SetNotificationCategories method.

Presentación de acciones personalizadasPresenting Custom Actions

Una vez que se ha creado y registrado un conjunto de acciones y categorías personalizadas con el sistema, se pueden presentar desde las notificaciones locales o remotas.Once a set of Custom Actions and Categories have been created and registered with the system, they can be presented from either Local or Remote Notifications.

En el caso de las notificaciones remotas, establezca una category en la carga de notificación remota que coincida con una de las categorías creadas anteriormente.For Remote Notification, set a category in the Remote Notification Payload that matches one of the Categories created above. Por ejemplo:For example:

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

En el caso de las notificaciones locales, establezca la CategoryIdentifier propiedad del UNMutableNotificationContent objeto.For Local Notifications, set the CategoryIdentifier property of the UNMutableNotificationContent object. Por ejemplo:For example:

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.Again, this ID needs to match one of the Categories that was created above.

Controlar acciones de descartarHandling Dismiss Actions

Como se indicó anteriormente, se puede enviar una acción de descartar a la aplicación cuando el usuario descarta una notificación.As stated above, a Dismiss Action can be sent to the app when the user dismisses a Notification. Como no se trata de una acción estándar, se debe establecer una opción cuando se crea la categoría.Since this is not a standard Action, a option will need to be set when the Category is created. Por ejemplo:For example:

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 las respuestas de acciónHandling Action Responses

Cuando el usuario interactúa con las acciones y las categorías personalizadas que se crearon anteriormente, la aplicación necesita completar la tarea solicitada.When the user interacts with the Custom Actions and Categories that were created above, the app needs to fulfill the requested task. Esto se hace proporcionando UNUserNotificationCenterDelegate e implementando el UserNotificationCenter método.This is done by providing a UNUserNotificationCenterDelegate and implementing the UserNotificationCenter method. Por ejemplo:For example:

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 de descartar.The passed in UNNotificationResponse class has an ActionIdentifier property that can either be the Default Action or the Dismiss Action. Use response.Notification.Request.Identifier para probar cualquier acción personalizada.Use response.Notification.Request.Identifier to test for any custom actions.

La UserText propiedad contiene el valor de cualquier entrada de texto de usuario.The UserText property holds the value of any user text input. La Notification propiedad contiene la notificación de origen que incluye la solicitud con el contenido del desencadenador y la notificación.The Notification property holds the originating Notification that includes the Request with the Trigger and Notification Content. La aplicación puede decidir si se trata de una notificación local o remota basada en el tipo de desencadenador.The app can decide if it was a Local or Remote Notification based on the type of trigger.

Nota

iOS 12 permite que una interfaz de usuario de notificación personalizada modifique sus botones de acción en tiempo de ejecución.iOS 12 makes it possible for a custom notification UI to modify its action buttons at runtime. Para obtener más información, eche un vistazo a la documentación de los botones de acción de notificación dinámica .For more information, take a look at the dynamic notification action buttons documentation.

Trabajar con extensiones de servicioWorking with Service Extensions

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.When working with Remote Notifications, Service Extensions provide a way to enable end-to-end encryption inside of the Notification Payload. Las extensiones de servicio son una extensión de interfaz que no es 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 que se presente al usuario.Service Extensions are a non-User Interface extension (available in iOS 10) that run in the background with the main purpose of augmenting or replacing the visible content of a Notification before it is presented to the user.

Información general de la extensión de servicioService Extension overview

Las extensiones de servicio están diseñadas para ejecutarse rápidamente y solo se les proporciona una breve cantidad de tiempo para que el sistema las ejecute.Service Extensions are meant to run quickly and are only given a short amount of time to execute by the system. En caso de que la extensión de servicio no pueda completar su tarea en la cantidad de tiempo asignada, se llamará a un método de reserva.In the event that the Service Extension fails to complete its task in the allotted amount of time, a fallback method will be called. Si se produce un error en la reserva, se mostrará el contenido de la notificación original al usuario.If the fallback fails, the original Notification Content will be displayed to the user.

Algunos usos posibles de las extensiones de servicio son:Some potential uses of Service Extensions include:

  • Proporcionar el cifrado de un extremo a otro del contenido de la notificación remota.Providing end-to-end encryption of the Remote Notification content.
  • Agregar datos adjuntos a notificaciones remotas para enriquecerlos.Adding attachments to Remote Notifications to enrich them.

Implementar una extensión de servicioImplementing a Service Extension

Para implementar una extensión de servicio en una aplicación de Xamarin. iOS, haga lo siguiente:To implement a Service Extension in a Xamarin.iOS app, do the following:

  1. Abra la solución de la aplicación en Visual Studio para Mac.Open the app's solution in Visual Studio for 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.Right-click on the Solution Name in the Solution Pad and select Add > Add New Project.

  3. Seleccione extensiones de iOS > > servicio de notificaciones extensiones y haga clic en el botón siguiente :Select iOS > Extensions > Notification Service Extensions and click the Next button:

    Seleccionar extensiones del servicio de notificacionesSelect 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 and click the Next button:

    Escriba un nombre para la extensiónEnter a Name for the extension

  5. Ajuste el nombre del proyecto o el nombre de la solución si es necesario y haga clic en el botón crear :Adjust the Project Name and/or Solution Name if required and click the Create button:

    Ajustar el nombre del proyecto o el nombre de la soluciónAdjust the Project Name and/or Solution Name

Importante

El identificador de paquete de la extensión de servicio debe coincidir con el identificador de paquete de la aplicación principal con .appnameserviceextension anexado al final.The Bundle Identifier for the service extension should match the Bundle Identifier of the main app with .appnameserviceextension appended to the end. Por ejemplo, si la aplicación principal tuviera un identificador de paquete com.xamarin.monkeynotify , la extensión de servicio debe tener un identificador de paquete de com.xamarin.monkeynotify.monkeynotifyserviceextension .For example, if the main app had a Bundle Identifier of com.xamarin.monkeynotify, the service extension should have a Bundle Identifier of com.xamarin.monkeynotify.monkeynotifyserviceextension. Se debe establecer automáticamente cuando la extensión se agrega a la solución.This should automatically be set when the extension is added to the solution.

Hay una clase principal en la extensión del servicio de notificación que tendrá que modificarse para proporcionar la funcionalidad necesaria.There is one main class in the Notification Service Extension that will need to be modified to provide the required functionality. Por ejemplo:For example:

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
    }
}

Al primer método, DidReceiveNotificationRequest , se le pasará el identificador de notificación, así como el contenido de la notificación a través del request objeto.The first method, DidReceiveNotificationRequest, will be passed the Notification Identifier as well as the Notification Content via the request object. contentHandlerSerá necesario llamar al método pasado para presentar la notificación al usuario.The passed in contentHandler will need to be called to present the Notification to the user.

Se llamará al segundo método, TimeWillExpire , justo antes de que se agote el tiempo de espera para que la extensión de servicio procese la solicitud.The second method, TimeWillExpire, will be called just before time is about to run out for the Service Extension to process the request. Si la extensión de servicio no puede llamar a contentHandler en la cantidad de tiempo asignada, se mostrará el contenido original al usuario.If the Service Extension fails to call the contentHandler in the allotted amount of time, the original content will be displayed to the user.

Desencadenar una extensión de servicioTriggering a Service Extension

Con una extensión de servicio creada y entregada con la aplicación, se puede desencadenar mediante la modificación de la carga de notificación remota que se envía al dispositivo.With a Service Extension created and delivered with the app, it can be triggered by modifying the Remote Notification Payload sent to the device. Por ejemplo:For example:

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

La nueva mutable-content clave especifica que la extensión de servicio deberá iniciarse para actualizar el contenido de notificación remota.The new mutable-content key specifies that the Service Extension will need to be launched to update the Remote Notification content. La encrypted-content clave contiene los datos cifrados que la extensión de servicio puede descifrar antes de presentarlos al usuario.The encrypted-content key holds the encrypted data that the Service Extension can decrypt before presenting to the user.

Eche un vistazo a la siguiente extensión de servicio de ejemplo:Take a look at the following example Service Extension:

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.This code decrypts the encrypted content from the encrypted-content key, creates a new UNMutableNotificationContent, sets the Body property to the decrypted content and uses the contentHandler to present the notification to the user.

ResumenSummary

En este artículo se han tratado todas las formas en que iOS 10 ha mejorado las notificaciones de los usuarios.This article has covered all of the ways that Users Notification have been enhanced by iOS 10. Se presentó el nuevo marco de notificaciones de usuario y cómo se usa en una aplicación Xamarin. iOS o una extensión de aplicación.It presented the new User Notification framework and how to use it in a Xamarin.iOS app or App Extension.