Todo lo que siempre quiso saber sobre las notificaciones en iOS

Pretty Little Alerts ..?

Las notificaciones son una forma de informar a los usuarios cuando hay nuevos datos disponibles para sus aplicaciones, incluso cuando la aplicación no se está ejecutando en primer plano.

Por ejemplo, una aplicación de mensajería puede informar al usuario cuando ha llegado un nuevo mensaje y una aplicación de calendario puede informar al usuario de una próxima cita.

Con el lanzamiento de iOS-10, Apple introdujo nuevos marcos para admitir notificaciones, ya sean locales o remotas.Esta versión se centró en notificaciones personalizadas .

Sin perder tiempo, vayamos rápidamente a los detalles.

Tipos de notificaciones

En términos generales, podemos clasificar las notificaciones en dos categorías:

  • Notificaciones locales : la aplicación configura los detalles de la notificación localmente y transmite esos detalles al sistema. Luego, el sistema gestiona la entrega de la notificación cuando la aplicación no está en primer plano.
  • Notificaciones remotas : utiliza uno de los servidores de su empresa para enviar datos a los dispositivos del usuario a través del servicio de notificaciones push de Apple (APN).

Más adelante en el artículo, veremos cómo podemos obtener ambos tipos de notificación. Primero comencemos con una introducción a este nuevo marco de notificación que podemos usar para nuestra causa.

¿Qué hay de nuevo en iOS-10 para las notificaciones?

Con el lanzamiento de iOS-10 , Apple introdujo dos nuevos marcos para manejar notificaciones:

  • Marco de notificaciones de usuario : gestiona notificaciones tanto locales como remotas.
  • Marco de interfaz de usuario de notificaciones de usuario : personaliza la apariencia de la interfaz de notificación del sistema.

Usaremos estos dos marcos y algunas API específicas de la plataforma para configurar nuestras notificaciones.

Junto con los marcos, la extensión de la aplicación del servicio de notificaciónTambién se introdujo que le permite modificar el contenido de las notificaciones remotas antes de que se entreguen.

Apple también permite personalizar la interfaz de usuario de su notificación a través de la extensión de contenido de la notificación .

¿Es demasiado para recordar? Sí ... seguramente lo es. Pero no se preocupe. Veremos todo paso a paso junto con el código correspondiente. Relájate. ?

Lo primero es lo primero: configúrelo.

Solicitar autorización

Para que nuestra aplicación notifique al usuario de algo, necesitamos saber si la persona que la usa realmente quiere eso en primer lugar. ¿Quizás no les gusta que su teléfono suene y muestre alertas todo el tiempo? o tal vez realmente quieren las actualizaciones, pero no ese sonido irritante… ¡naahhh!

Entonces, en primer lugar, debemos obtener el permiso del usuario al que vamos a notificar. Y eso es bastante simple: solo dos líneas de código y terminamos:

Debe escribir ese código en el AppDelegate’smétodo, application:didFinishLaunchingWithOptions:antes de regresar de él.

Tenga en cuenta: debido a que el sistema guarda la respuesta del usuario, las llamadas al requestAuthorization(options:completionHandler:)método durante lanzamientos posteriores no vuelven a preguntar al usuario.

Agregar categorías y acciones: notificaciones procesables

El marco de notificaciones de usuario admite la adición de categorías y acciones a las notificaciones.

Categorías : defina los tipos de notificaciones que admite la aplicación y comunique al sistema cómo queremos que se presente una notificación.

Acciones : cada categoría puede tener hasta cuatro acciones asociadas. Las acciones son básicamente botones personalizados, que al tocarlos descartan la interfaz de notificación y reenvían la acción seleccionada a la aplicación para su manejo inmediato.

Okayyy! Y qué significa eso..??? Algún código puede ayudarlo a comprender mejor:

En el código anterior, simplemente creamos una categoría llamada INVITACIÓNcon cuatro acciones diferentes - remindLater , aceptar , declinar , ycomentar .

Las categorías y acciones se identifican de forma única por sus identificadores. Siempre que se envía una notificación con una categoría, el sistema presenta la notificación junto con todas las acciones asociadas con esa categoría una vez que el usuario la expande. Así es como se verá:?

Defina todas las categorías y acciones justo debajo de donde configuró las notificaciones en el application:didFinishLaunchingWithOptions:método.

Incluya el identificador de categoría (por ejemplo, INVITACIÓN) al programar su notificación, ya sea de forma local o remota. Veremos cómo hacerlo en la siguiente sección.

Programación de notificaciones locales

Ahora que hemos terminado con la configuración de nuestras notificaciones, veamos cómo programar una desde la aplicación .

Programar una notificación local requiere solo tres pasos simples:

  1. Prepara el contenido
  2. Agregar un disparador: cuándo debe activarse la notificación
  3. Programe su entrega

Sigamos con el código rápidamente, para no confundirnos con todo lo que sucede aquí. LOL?

En el código anterior, junto con el resto del contenido, también hemos proporcionado un categoryIdentifiersoporte para notificaciones procesables. En caso de que no lo hagamos, el sistema adoptará su comportamiento predeterminado.

Eso es. Eso es todo lo que se necesita. Y sí, definitivamente funciona ... jejeje. Pruébelo antes de seguir adelante. Puede descargar la muestra desde aquí.

Tenga en cuenta : las aplicaciones se comportan de manera diferente en los estados de fondo y primer plano cuando se envía una notificación.

  1. La aplicación no se está ejecutando / Aplicación en segundo plano : el sistema muestra notificaciones locales directamente al usuario. No recibimos ninguna devolución de llamada en la aplicación por eso.
  2. Aplicación en primer plano : el sistema le da a la aplicación la oportunidad de manejar la notificación internamente. El sistema silencia las notificaciones de las aplicaciones en primer plano de forma predeterminada .

Cuando la aplicación está en primer plano mientras se entrega la notificación, obtenemos el UNUserNotificationCenterDelegate'smétodo de devolución de llamada , userNotificationCenter(_:willPresent:withCompletionHandler:)donde puede decidir si manejar la notificación en silencio o alertar al usuario sobre ella.

No olvide ajustarse AppDelegateal UNUserNotificationCenterDelegateprotocolo y configurarlo como delegado del UNUserNotificationCenterobjeto compartido en application:didFinishLaunchingWithOptions:.

let center = UNUserNotificationCenter.current()
center.delegate = self

Hemos terminado con las notificaciones locales por ahora. Pasemos a cómo podemos programar una notificación desde fuera de nuestra aplicación. Antes de eso, echemos un vistazo a cómo responder a las acciones personalizadas.

Responder a las acciones del usuario

¿Configurando notificaciones? ✔ ¿Programando notificaciones? ✔

¿Qué hay de tocar una notificación o cualquier acción personalizada en la notificación? ¿A dónde conducirá? En ambos casos, el sistema notifica a la aplicación la elección del usuario.

Siempre que el usuario realiza alguna acción en la notificación, la respuesta se envía al UNUserNotificationCenterDelegate'smétodo - userNotificationCenter(_:didReceive:withCompletionHandler:), donde podemos proporcionar un manejo específico para cada acción.

Tenga en cuenta: si la aplicación no se está ejecutando cuando se recibe una respuesta, el sistema inicia la aplicación en segundo plano para procesar la respuesta.

Notificaciones remotas

Las notificaciones automáticas o las notificaciones remotas, sin importar cómo las llamemos, son una de las más utilizadas con muchos casos de uso.

Ya sean las redes sociales o el calendario o cualquiera de las aplicaciones de utilidades, podemos verlas en casi todas partes. Desde aplicaciones de noticias que nos notifican el contenido más reciente, hasta el propio Medium que nos alerta de los últimos artículos publicados.

¿Alguna vez te has preguntado cómo hacen eso? Notificaciones locales Podría ser ... hace lo mismo, ¿verdad? ¿Quizás podamos hacer alguna configuración más en el local y hacer que funcione?

Pero Medium, por ejemplo, no tiene acceso a la aplicación en nuestro dispositivo personal, entonces, ¿cómo podría programar notificaciones? ¡Exactamente! No puede. Esto es algo diferente y algo más que los locales.

Ok, ¿qué tal si enviamos la notificación desde algún punto y la mostramos en otro punto? ¿Responderá esto a nuestra pregunta? Sí, seguramente lo hará. ¿Pero cómo hacer eso? Notificaciones remotas es.

Eso es exactamente lo que hacen. Esta es la característica que ha resuelto EL GRAN PROBLEMA de “Mantenerse al día”.

Terminología

  • APN : la pieza central de la función de notificaciones remotas. Es un servicio en la nube que permite que las aplicaciones de terceros aprobadas instaladas en dispositivos Apple envíen notificaciones automáticas desde un servidor remoto a los usuarios a través de una conexión segura.
  • Token de dispositivo: un token específico de la aplicación que es único a nivel mundial e identifica una combinación de aplicación y dispositivo. Permite la comunicación entre el proveedor, los APN y el dispositivo.
  • Proveedor: servidor que realmente envía la notificación remota, incluido el token del dispositivo y otra información a los APN.

Nota importante : nunca guarde en caché los tokens del dispositivo en su aplicación. En su lugar, obténgalos del sistema cuando los necesite.

APNs emite un nuevo token de dispositivo a su aplicación cuando ocurren ciertos eventos. Se garantiza que el token del dispositivo será diferente, por ejemplo, cuando un usuario restaura un dispositivo a partir de una copia de seguridad, cuando el usuario instala su aplicación en un nuevo dispositivo y cuando el usuario reinstala el sistema operativo.

Cuando intenta recuperar un token de dispositivo pero no ha cambiado, el método de recuperación regresa rápidamente.

Tenga en cuenta: la capacidad de los APN para enviar notificaciones remotas a una aplicación que no se está ejecutando requiere que la aplicación se haya iniciado al menos una vez.

Como funciona realmente

A continuación se muestra una pequeña y rápida explicación de cómo todas las tecnologías anteriores funcionan juntas en sincronización para completar el flujo de trabajo de notificaciones remotas.

  1. Aplicaciónse registra con APN
  2. APNs envía el token del dispositivo al dispositivo y luego lo envía a la aplicación
  3. La aplicación envía este token de dispositivo al proveedor
  4. El proveedor envía notificaciones con ese token de dispositivo a los APN, que luego lo envía al dispositivo, que luego lo envía a la aplicación .

Si llega una notificación para su aplicación con el dispositivo encendido pero con la aplicación no ejecutándose, el sistema aún puede mostrar la notificación. Si el dispositivo está apagado cuando los APN envían una notificación, los APN retienen la notificación e intentan nuevamente más tarde.

Manejarlo en la aplicación

Ahora que sabemos qué son las notificaciones remotas y qué cosas se necesitan para que funcionen, pasemos ahora a cómo podemos hacer que nuestra aplicación las admita. ¿Porque no pasa nada por sí solo ?. Necesitamos hacer algunas configuraciones para que funcionen.

Para poder manejar notificaciones remotas, nuestra aplicación debe:

  1. Habilite las notificaciones remotas en las capacidades : solo un clic y habrá terminado con este paso. En la pestaña Capacidades de nuestro proyecto Xcode, habilite la opción Notificaciones automáticas. Asegúrese de que se agreguen notificaciones automáticas al ID de la aplicación que estamos usando para el proyecto.

2. Regístrese en el servicio de notificaciones push de Apple (APN) y reciba un token de dispositivo específico de la aplicación

Solicitar registrarse en APN es rápido y fácil. Simplemente agregue el siguiente código en el UIApplicationDelegate’smétodo application:didFinishLaunchingWithOptions:antes de regresar.

UIApplication.shared.registerForRemoteNotifications()

Ahora hay dos posibilidades: o nos registramos correctamente o el proceso falla.

En el registro exitoso, los APN envían un token de dispositivo específico de la aplicación al dispositivo en el UIApplicationDelegate’smétodo— application:didRegisterForRemoteNotificationsWithDeviceToken:.

En caso de error, recibimos una devolución de llamada en el UIApplicationDelegate’smétodo— application:didFailToRegisterForRemoteNotificationsWithError:.

3. Envíe el token del dispositivo al servidor del proveedor de notificaciones.

A partir de ahora, hemos recibido el token de dispositivo de APN . Ahora, debemos enviar este token a nuestro proveedor, que lo usará al enviar notificaciones a nuestro dispositivo.

Como no tenemos un proveedor, por ahora podemos usar Easy APNs Provider para probar nuestras notificaciones push. Más abajo, veremos cómo exactamente podemos hacer uso de esta herramienta.

Por ahora, simplemente descárguelo e instálelo en su Mac.

4. Implementar soporte para manejar notificaciones remotas entrantes

Tenemos nuestro token de dispositivo y nuestro proveedor también lo sabe. A continuación, el Proveedor enviará la notificación que incluye este token y otra información, y la obtendremos en nuestro dispositivo.

¿Ahora que? ¿Qué pasará cuando llegue? ¿Cómo aparecerá en el dispositivo? ¿Qué pasará cuando hagamos tapping? ¿Qué pasa con todas las acciones que configuramos anteriormente? ¿Podemos traerlos aquí?

Demasiadas preguntas ❓❓❓Bueno, no te preocupes. Tendremos respuestas a todos ellos uno por uno.

¿Qué pasará cuando llegue? Recibiremos una devolución de llamada en el UIApplicationDelegate’smétodo— application(_:didReceiveRemoteNotification:fetchCompletionHandler:). Le dice a la aplicación que ha llegado una notificación remota que indica que hay datos para recuperar.

¿Cómo aparecerá en el dispositivo? Aparecerá con la interfaz de notificación predeterminada. Si la carga útil de la notificación está configurada con categoría , aparecerá como la notificación procesable con todas las acciones adjuntas a esa categoría. Discutiremos la carga útil en la siguiente sección.

¿Qué pasará cuando hagamos tapping? Igual que las notificaciones locales. UNUserNotificationCenterDelegate'smétodo: userNotificationCenter(_:didReceive:withCompletionHandler:)se llama con el objeto de respuesta.

Manejarlo en el proveedor

Hemos cubierto la mayoría de las cosas que necesitamos para integrar las notificaciones automáticas en nuestra aplicación. Aunque sabemos cómo manejarlos en la aplicación, todavía estamos cortos de manejarlos en el proveedor.

Tenemos el proveedor. Sabe qué token de dispositivo usar, pero eso por sí solo no mostrará una notificación en nuestro dispositivo con algún título y otros detalles. Tampoco hará aparecer ninguna de las acciones.

Entonces, enviar notificaciones del proveedor requiere los siguientes elementos:

  1. Un token de dispositivo
  2. Certificado APNs : podemos obtenerlo de la cuenta de desarrollador
  3. Carga útil : cualquier dato personalizado que desee enviar a su aplicación e incluye información sobre cómo el sistema debe notificar al usuario. Es simplemente un diccionario JSON con algunos pares clave-valor. La siguiente ilustración puede ayudarlo a comprenderlo mejor.

Veamos qué hay en ese diccionario JSON :

  1. apsdiccionario- el más importante. Contiene claves definidas por Apple y se utiliza para determinar cómo el sistema que recibe la notificación debe alertar al usuario.
  2. alertadiccionario- es más un elemento que se explica por sí mismo. Proporciona el contenido de la notificación.
  3. categoría : para notificaciones procesables. Todas las acciones adjuntas a esa categoría estarán disponibles en las notificaciones.
  4. contenido disponible- Para admitir una notificación de actualización en segundo plano, establezca esta tecla en 1.
  5. contenido mutable- Para habilitar la modificación de una notificación a través de la extensión de la aplicación del servicio de notificación , establézcalo en 1.

Aquí puede leer más sobre cómo personalizar la carga útil según sus requisitos. Esta es una referencia a las claves que podemos agregar en el diccionario aps

Extensión de la aplicación del servicio de notificación

En este punto, sabemos qué notificaciones remotasson, cómo funcionan, todo lo que necesitamos para que funcionen, ¡prácticamente todo! Ya que acabamos de hacer que funcionen perfectamente✌️.

Ahora la pregunta es, ¿y si queremos modificar algún contenido en la notificación recibida del proveedor, antes de presentarlo en el dispositivo? ¿Qué pasa si la notificación contiene algún enlace de imagen que necesitamos descargar antes de entregarlo al usuario? ¿Podemos hacer eso con lo que ya sabemos? No tenemos acceso al proveedor ... entonces, ¿cómo lo tendremos?

En realidad, no podemos. No podemos cambiar lo que obtenemos, pero definitivamente podemos cambiar lo que presentamos.

De eso se trata la Extensión de la aplicación del Servicio de notificación: modificar el contenido de las notificaciones remotas antes de la entrega. Es tan simple como parece. Sin código elegante, nada. Realmente es muy simple.

Adición de la extensión del servicio de notificación al proyecto

Las extensiones en un proyecto de xcode se agregan como destino. Seleccione Archivo - Nuevo - Destino - Extensión del servicio de notificación.

Prerrequisitos

Antes de comenzar a modificar el contenido, existen algunas restricciones sobre cuándo se permite modificar el contenido.

El contenido se puede modificar solo si:

  • La notificación remota está configurada para mostrar una alerta.
  • El diccionario aps de la notificación remota incluye la clave de contenido mutable con el valor establecido en 1.

No podemos modificar las notificaciones silenciosas o aquellas que solo reproducen un sonido o identifican el icono de la aplicación.

Por lo tanto, para soportar cualquier modificación en el contenido de las notificaciones, se deben cumplir estas condiciones.

Modificando el contenido

El destino de extensión del servicio de notificación predeterminado proporcionado por Xcode contiene una subclase de la UNNotificationServiceExtensionclase para que la modifiquemos.

Contiene dos métodos:

  1. didReceive(_:withContentHandler:)- realice los cambios necesarios en la notificación y notifique al sistema cuando haya terminado. Este método tiene una cantidad de tiempo limitada (aproximadamente 30 segundos) para realizar su tarea y ejecutar el bloque de finalización proporcionado.
  2. serviceExtensionTimeWillExpire()- Nos dice que la extensión está a punto de terminar. Danos una última oportunidad para enviar nuestros cambios. Si no actualizamos el contenido de la notificación antes de que expire el tiempo, el sistema muestra el contenido original.

Veamos un ejemplo. Cambiaremos el cuerpo en la carga útil en el fragmento de código 7 a " Dirección: Sea Shells Apartments, Mumbai ".

Toda la implementación predeterminada de ambos métodos la proporciona la propia extensión. Solo tenemos que hacer los cambios que queramos, como en la Línea 8 en el fragmento de código anterior. Solo una línea de código por ahora. Del mismo modo, puede modificar otros campos según sus requisitos.

Extensión de contenido de notificación

Tener una interfaz de usuario llamativa siempre es mejor que una simple interfaz de usuario predeterminada. Agregar algunos colores y fuentes bonitas nunca es una mala idea. Vamos a hacer lo mismo con nuestras notificaciones para que se vean ¡Wow !?

Y y ... Apple está aquí para rescatarnos de nuevo. Extensión de contenido de notificación . Esto presenta una interfaz personalizada para una entrega local.onotificación remota .

Agregar extensión de contenido de notificación al proyecto

Creo que ya sabemos cómo hacer eso. Nosotros no? Vamos a hacer lo mismo que hicimos para agregar la Extensión del servicio de notificación . Seleccione Archivo - Nuevo - Destino - Extensión de contenido de notificación.

Agregar algunas claves a Info.plist de la extensión

Para admitir la interfaz de usuario personalizada para notificaciones locales y remotas, debemos realizar algunos cambios en el archivo Info.plist de la extensión de contenido.

  1. UNNotificationExtensionCategory (reqd.) : Una cadena o una matriz de cadenas. Cada cadena contiene el identificador de una categoría declarada por la aplicación. La categoría , debo decir, es realmente muy importante para las notificaciones. La interfaz de usuario personalizada solo aparecerá para las notificaciones que se encuentran en las categorías especificadas.
  2. UNNotificationExtensionInitialContentSizeRatio (reqd.) : Un número de punto flotante que representa el tamaño inicial de la vista del controlador de vista expresado como una relación entre su altura y su ancho . Es el controlador de vista que usaremos para crear una interfaz de usuario personalizada. Lo discutiremos en la próxima sección.
  3. UNNotificationExtensionDefaultContentHidden - si es verdadero : muestra solo contenido personalizado. Si es falso : muestra contenido personalizado + predeterminado.
  4. UNNotificationExtensionOverridesDefaultTitle —si es verdadero : establece el título de la notificación en el título del controlador de vista. Si es falso : el título de la notificación se establece en el nombre de la aplicación.

Aquí hay una ilustración que puede ayudarnos a comprender mejor las claves anteriores.

En la ilustración anterior, las claves en Info.plist están configuradas como:

  1. UNNotificationExtensionCategory - INVITACIÓN
  2. UNNotificationExtensionInitialContentSizeRatio - 1
  3. UNNotificationExtensionDefaultContentHidden - falso
  4. UNNotificationExtensionOverridesDefaultTitle - falso

Creando la IU personalizada

La extensión de contenido de notificación nos proporciona una UIViewControllerque se ajusta al UNNotificationContentExtensionprotocolo. Este controlador presenta la interfaz de la notificación. El Storyboardarchivo en la extensión contiene un único ViewController que podemos usar para crear cualquier interfaz de usuario que deseemos que presente la notificación.

Una vez que creamos la interfaz de usuario, necesitamos conectar los elementos en el NotificationViewControllerpara completar los detalles. Siempre que llega una notificación con una categoría esperada , recibimos una devolución de llamada en el UNNotificationContentExtension’smétodo - didReceive(_:). Este es el lugar donde podemos agregar detalles a nuestra interfaz de usuario personalizada.

Casi hemos terminado con la interfaz de usuario personalizada de nuestra notificación. Solo 1 cosa más. Dado que la interfaz de usuario personalizada está adjunta a la categoría de notificaciones ,que puede tener algunas acciones adjuntas. Y ... ¡tienes razón! ? Obtendremos nuestras acciones automáticamente sin ningún manejo personalizado. ¿¡Brillante!?

Contenido + Hermosa interfaz de usuario + Acciones personalizadas : todo listo. ¿Qué más podemos pedir? Apple, ¿eres genial?

Un último punto: también podemos agregar manejo a las acciones personalizadas en la extensión. El sistema llama al didReceive(_:completionHandler:)método para responder a las acciones seleccionadas. Si nuestro controlador de vista no implementa ese método, el sistema entrega la acción seleccionada a su aplicación para su manejo.

Si se implementa, necesitamos manejar todas las acciones posibles en este método. Una cosa que es importante aquí es el completioncierre.

completion: El bloque que se ejecutará cuando termine de realizar la acción. Debe llamar a este bloque en algún momento durante su implementación. El bloque no tiene valor de retorno.

El cierre acepta un solo parámetro dismissde tipo UNNotificationContentExtensionResponseOption. Ofrecemos las siguientes opciones:

  1. doNotDismiss - No descarte la interfaz de notificación.
  2. dismiss - Descartar la interfaz de notificación.
  3. dismissAndForwardAction--Descarte la interfaz de notificación y reenvíe la notificación a la aplicación.

Eso resume nuestras notificaciones. ¿Demasiado para recordar? ¿La práctica hace progreso ?. ¡Intente hacer sus propias notificaciones ahora!

Proyecto de muestra

Puede descargar el proyecto de muestra desde aquí.

Y el proyecto de muestra para la extensión de contenido de notificación se puede encontrar aquí.

Otras lecturas

No olvide leer mis otros artículos:

  1. Todo sobre Codable en Swift 4
  2. Coloréalo con GRADIENTS - iOS
  3. Codificación para iOS 11: cómo arrastrar y soltar en colecciones y tablas
  4. Todo lo que necesita saber sobre las extensiones Today (widget) en iOS 10
  5. La selección de UICollectionViewCell se hizo fácil .. !!

No dude en dejar comentarios en caso de que tenga alguna pregunta.