Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. iOS
Code

Una Introducción al Framework UserNotifications

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Javier Salesi (you can also view the original English article)

Introducción

Con iOS 10, tvOS 10, y watchOS 3, Apple está presentando un nuevo framework llamado UserNotifications. Éste flamante conjunto de APIs ofrece una forma unificada y orientada a objetos de trabajar con notificaciones locales y remotas en éstas plataformas. Ésto es particularmente útil pues, comparado con las existentes APIs, las notificaciones locales y remotas ahora son manejadas muy similarmente, y accesar al contenido de la notificación ya no se hace a través de diccionarios.

En éste tutorial, te mostraré los fundamenetos de éste nuevo framework y cómo puedes aparovecharlo fácilmente para soportar notificaciones para tus aplicaciones.

Éste tutorial requiere que estés ejecutando Xcode 8 con los SKDs más recientes de iOS, tvOS, y watchOS.

1. Registrándose para Notificaciones

El primer paso para que cualquier aplicación soporte notificaciones es pedir permiso al usuario. Al igual que con las versiones previas de iOS, cuando se usa el framework UserNotifications, es práctica común hacer ésto tan pronto como la aplicación termina de lanzarse.

Antes de usar cualquiera de las APIs de UserNotifications, necesitarás agregar la siguiente declaración de importar a cualquier archivo de códificación Swift que accese al framework:

Posteriormente, para registrar tu aplicación para las notificaciones, necesitarás añadir el siguiente código a tu método application(_:didFinishLaunchingWithOptions:) de AppleDelegate :

Inicialmente, con éste código, apuntamos al objeto UNUserNotificationCenter actual. Luego, configuramos nuestro UNAuthorizationOptions con las capacidades de notificación que queremos que nuestra aplicación tenga. Por favor nota que pueden tener cualquier combinación de opciones aquí-por ejemplo, sólo alert o ambas badge y sound.

Usando los dos objetos, entonces pedimos autorización para que nuestra app muestre notificaciones al llamar al método requestAuthorization(options:completionHandler:) en nuestra instancia UNUserNotificationCenter. El bloque de código completion handler tiene dos parámetros que se le pasaron:

  • Un valor Bool que significa si fue o no otorgada la autorización por el usuario.
  • Un objeto Error opcional que contendrá información si, por alguna rezón, el sistema no pudo pedir autorización de la notificación para tu aplicación.

Verás que en el código de arriba, si la autorización es otorgada por el usuario, entonces nos registramos para notificaciones remotas. Si quieres implementar notificaciones push, ésta línea de código es requerida. También tendrás que hacer un poco de configuración extra para tu proyecto, como se detalló en éste tutorial:

Por favor nota que registrarse para notificaciones remotas invocará los mismos métodos callback UIApplication que en las versiones previas de iOS. Si es exitoso, application(_:didRegistrerForRemoteNotificationsWith) será llamado, y application(_:didFailToRegisterForRemoteNotifications) será llamado en caso de no ser exitoso.

2. Programando Notificaciones

Para ésta sección del tutorial, me enfocaré totalmente en programar notificaciones locales utilizando el framework UserNotifications. El envío de notificaciones push remotas no ha cambiado por la introducción de éste nuevo framework.

Una notificación local, antes de ser programada, se representa por una instancia de la clase UNNotificationRequest. Los objetos de éste tipo se conforman de los siguientes componentes:

  • Identifier (identificador): un String único que te permite distinguir notificaciones individuales.
  • Contenido: un objeto UNNotificationContent que contiene toda la información necesaria para la visualización de tu notificación incluyendo título, subtítulo y el número del badge (circulito o botón) de la aplicación.
  • Trigger (Desencadenante): un objeto UNNotificationTrigger que es usado por el sistema para determinar cuando tu notificación debería "enviarse" a tu aplicación.

Para empezar, vamos a ver los varios tipos de triggers que puedes configurar para notificaciones locales. La clase UNNotificationTrigger es una clase abstracta, lo que significa que nunca deberías crear instancias de ella directamente. En lugar de ello, utilizarás las subclases disponibles. Actualmente, el framework UserNotifications te ofrece tres:

  • UNTimeIntervalNotificationTrigger, que permite que una notificación sea enviada determinada cantidad de tiempo después de programarla.
  • UNCalendarNotificationTrigger, que permite que una notificación sea enviada en una hora y fecha específica, sin importar cuando fue programada.
  • UNLocationNotificationTrigger, que permite que una notificación sea enviada cuando el usuario ingresa o abandona una región geográfica designada.

El siguiente codigo te muestra cómo podrías elaborar un trigger de cada tipo:

Con el código de arriba, las siguientes condiciones del trigger han sido creadas:

  • El timeTrigger se disparará una hora después de que la notificación es programada. El parámetro timeInterval pasado al inicializador UNTimeIntervalNotificationTrigger se mide en segundos.
  • El calendarTrigger se disparará cada día a las 10:00 PM. La fecha y hora exacta en que se dispara el trigger puede cambiarse fácilmente al modificar otras propiedades del objeto DateComponents que tu pasas al inicializador UNCalendarNotificationTrigger.
  • El locationTrigger se disparará cuando el usuario esté en un rango de 500 metros de la coordinada designada, en éste caso 40°N 120°E. Como puedes ver en el código, éste tipo de trigger puede ser usado para cualquier coordenada y/o tamaño de región y también puede desencadenar una notificación al ingresar o al salir de la región.

Después, necesitamos crear el contenido para la notificación. Ésto se hace creando una insancia de la clase UNMutableNotificationContent. Ésta clase debe ser usada pues la clase regular UNNotificationContent únicamente tiene acceso de sólo lectura para varias propiedades del contenido de la notificación.

El siguiente código muestra cómo puede ser creado el contenido para una notificación básica.

Si quieres una lista completa de las propiedades disponibles, por favor consulta la guía de la clase UNMutableNotificationContent.

Finalmente, ahora sólo necesitamos crear el objeto UNNotificationRequest y programarlo. Ésto puede hacerse con el siguiente código:

Inicialmente con éste código, creamos el objeto request al pasar un identifier, un objeto content y trigger al inicializador. Entonces llamamos al método add(_:completionHandler:) en el objeto UNUserNotificationCenter actual y usamos el completion handler para ejecutar la lógica basada en si la notificación fue o no programada correctamente.

3. Recibiendo Notificaciones

Cuando se usa el framework UserNotifications, el procesamiento de notificaciones entrantes es manejado por un objeto que designas conforme al protocolo UNUserNotificationCenterDelegate. Éste objeto puede ser cualquier cosa que quieras y no tiene que ser el delegado de la aplicación como en versiones previas de iOS.

Aunque una cosa importante a destacar, es que debes establecer tu delegado antes de que tu aplicación haya sido lanzada completamente. Para una aplicación iOS, ésto significa que debes asignar tu delegado dentro del método deapplication(_:willFinishLaunchingWithOptions:) o del método application(_:didFinishLaunchingWithOptions:) del delegado de tu aplicación. Establecer el delegado para las notificaciones del usuario se hace muy fácilmente con el siguiente código:

Ahora con tu delegado definido, cuando una notificación es recibida por la aplicación, sólo hay dos métodos por los que debes preocuparte. A ambos métodos se les pasa un objeto UNNotification, que representa la notificación que es recibida. Éste objeto contiene una propiedad date, que te dice exactamente cuando fue entregada la notificación, y una propioedad request, que es una instancia de la clase UNNotificationRequest mencionada anteriormente. Desde éste objeto request, puedes accesar al content o contenido de la notificación, así como (si es necesario) al trigger para la notificación. Éste objeto trigger será una instancia de una de las subclases UNNotificationTrigger mencionadas anteriormente o, en el caso de notificaciones push, una instancia de la clase UNPushNotificationTrigger.

El primer método definido por el protocolo UNUserNotificationCenterDelegate es el método userNotificationCenter(_:willPresent:withCompletionHandler:) Éste solo es llamado cuando tu aplicación se ejecuta en segundo plano y recibe una notificación. Desde aquí, puedes accesar al contenido de la notificación y mostrar tu interfaz personalizada dentro de tu aplicación si es necesario. Alternativamente, puedes decirle al sistema que presente la notificación con una variedad de opciones, como normalmente sería si tu aplicación no estuviera ejecutándose. Las opciones disponibles son:

  • Alerta para mostrar la interfaz generada por el sistema para la notificación
  • Sound para reproducir el sonido asociado con la notificación
  • Badge para editar el botón de tu aplicación en la pantalla de inicio del usuario

El siguiente código muestra un ejemplo de implemenetación del método userNotificationCenter(_:willPresent:withCompletionHandler:):

El otro método definido por el protocolo UNUserNotificationCenterDelegate es el método userNotificationCenter(_:didReceive:withCompletionHandler:). Éste método es llamado cuando el usuario interactúa con una notificación para tu aplicación de cualquier manera, incluyendo rechazarla o abrir tu aplicación desde él.

En lugar de un objeto UNNotification, éste método tiene un objeto UNNotificationResponse que se le pasa como un parámetro. Éste objeto contiene el objeto UNNotification que representa la notificación entregada. También incluye una propiedad actionIdentifier para determinar cómo el usuario interactuó con la notificación. En el caso de que la notificación sea rechazada o que tu aplicación sea abierta, el framework UserNotifications proporciona identificadores de acción constantes para compararlos.

El siguiente código muestra un ejemplo de la implementación del método userNotificationCenter(_:didReceive:withCompletionHandler:)

Por favor considera que para ambos métodos delegados, es esencial que llames al completion handler tan pronto como termines el proceso de la notificación. Una vez que lo hagas, el sistema sabe entonces que terminaste con la notificación y puede ejecutar cualquier proceso necesario, como poner la notificación en el Centro de Notificaciones del usuario.

4. Gesionando Notificaciones

En ocasiones un usuario de tu aplicación podría recibir múltiples notificaciones mientras tu aplicación no se está ejecutando. También podrían abrir tu aplicación directamente desde la pantalla de inicio y no a través de una notificación. En cualquiera de los casos, ninguno de los métodos del protocolo UNUserNotificationCenterDelegate serán llamados. Cuando se trabaja con notificaciones locales, a veces también podrías querer remover una notificación programada antes de que sea mostrada al usuario.

Debido a ésto, el framework UserNotifications proporciona los siguientes métodos en la instancia UNUserNotificationCenter para trabajar, con notificaciones locales pendientes y notificaciones entregadas que aún no han sido procesadas:

  • getPendingNotificationRequests(completionHandler:) te proporciona un array de objetos UNNotificantionRequest en el compleltion handler. Éste array contendrá todas las notificaciones locales que has programado y que no han sido desencadenadas.
  • removePendingNotificationRequess(withIdentifiers:) remueve todas las notificaciones locales con identifiers (identificadores) contenidos en el array String que le pasaste como parámetro.
  • removeAllPendingNotificationRequests remueve todas las notificaciones locales programadas para tu aplicación.
  • getDeliveredNotifications(completionHandler:) te proporciona un array de objetos UNNotification en el completion handler. Éste array contendrá todas las notificaciones entregadas para tu aplicación que aún son visibles en el Centro de Notificaciones del usuario.
  • removeDeliveredNotifications(withIdentifiers:) remueve todas las notificaciones con identificadores contenidos en el arreglo String que tu le pasas del Centro de Notificaciones del usuario.
  • removeAllDeliveredNotifications remueve todas las notificaciones entregadas para tu aplicación.

5. Notificaciones de Acción Personalizadas

El framework UserNotifications también facilita que tu aplicación aproveche las categorías de notificaciones personalizadas y acciones introducidas en iOS 8.

Primero, necesitas definir las acciones personalizadas y categorías que tu aplicación soporta usando las clases UNNotificationAction y UNNotificationCategory respectivamente. Para acciones donde quieres que el usuario pueda ingresar texto, puedes usar la clase UNTextInputNotificationAction, que es una subclase de UNNotificationAction. Una vez que tus acciones y categorías son definidas, solo necesitas llamar al método setNotificationCategories(_:) en la instancia actual de UNUserNotificationCenter. El siguiente código muestra cómo podrías fácilmente registrar acciones de responder y borrar para una notificación de categoría de mensaje en tu propia aplicación:

Después, cuando un usuario utiliza una de tus acciones de notificación personalizadas, es llamado el mismo método userNotificationCenter(_:didReceive:withCompletionHandler:) que cubrimos anteriormente. En éste caso, el identificador de acción del objeto UNNotificationResponse pasado será el mismo que el que definiste para tu acción personalizada. Es importante mencionar también que, si el usuario interactúo con una acción de notificación de ingreso de texto, entonces el objeto de respuesta pasado a éste método será de tipo UNTextInputNotificationResponse.

El siguiente código muestra un ejemplo de implementación de éste método, incluyendo la lógica para las acciones creadas anteriormente:

Adicionalmente, si quieres aprovechar acciones personalizadas para tus notificaciones locales, entonces simplemente puedes establecer la propiedad categoryIdentifier en tu objeto UNMutableNotificationContent cuando se crea la notificación.

Conclusión

El nuevo framework UserNotifications proporciona APIs funcionales y orientadas a objetos para trabajar con notificaciones locales y remotas en iOS, watchOS, y tvOS. Facilita programar notificaciones locales para una variedad de escenarios así como también simplifica magníficamente el flujo total del procesamiento de notificaciones entrantes y acciones personalizadas.

Como siempre, asegúrate de dejar tus comentarios o sugerencias en la sección de abajo. ¡Y consulta otros de nuestros artículos y tutoriales sobre nuevas funcionalidades en iOS 10 y watchOS 3!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.