La conferencia de la WWDC se celebró y todavía hay muchos informes que vale la pena ver. Hubo temas clave a los que Apple prestó especial atención. Core ML, atajos de Siri y, por supuesto, cambios en las notificaciones.
Dado que no todos tienen suficiente tiempo libre para abrirse camino a través de la jungla de documentación, que, como suele suceder, deja mucho que desear en la etapa de prueba beta, preparé una revisión de las nuevas características y apoyé el material con una implementación práctica. Lea, comprenda e integre en sus aplicaciones.
Comencemos con una descripción general de las características que Apple ha agregado.
Agrupación de notificaciones
Para implementar, no necesita hacer nada. iOS 12 agrupará automáticamente los mensajes por usted. Pero hay matices que se relacionan con la personalización, localización y agrupación, pero no se basan en el identificador de la aplicación, sino, por ejemplo, según el nombre del usuario que envió la notificación.
Además, si va a probar la agrupación de notificaciones, preste atención: comenzarán a recopilarse en un paquete solo si todas las notificaciones no caben en la pantalla a la vez. Por ejemplo, en la pantalla del iPhone 8 para esto necesita colocar 5 o más notificaciones.
Para no sobrecargar este material, pongo la información en un artículo separado .
Cambios en la API NSExtensionContext
El siguiente elemento son nuevas oportunidades para notificaciones, y en particular la clase NSExtensionContext . Es responsable de interactuar con widgets, Siri, reproducir contenido multimedia. Estamos más interesados en las notificaciones. Se agregaron dos métodos y una variable:
var notificationActions: [UNNotificationAction] { get set }
La variable permite reemplazar el conjunto de acciones disponibles durante la interacción con la notificación:
func dismissNotificationContentExtension() func performNotificationDefaultAction()
Los métodos abren la aplicación u ocultan la notificación.
Para demostrar las posibilidades, escribiremos una pequeña aplicación.
Primero, agregue a la aplicación enviando notificaciones locales:
let actions = [ UNNotificationAction(identifier: "like-action", title: "Like", options: []), UNNotificationAction(identifier: "open-app", title: "Open App", options: []), UNNotificationAction(identifier: "dismiss", title: "Dismiss", options: []), ] let simpleCategory = UNNotificationCategory(identifier: "category-simple", actions: actions, intentIdentifiers: [], options: []) UNUserNotificationCenter.current().setNotificationCategories([simpleCategory])
- Creamos algunas acciones. El encabezado, un identificador que le permite distinguir entre acciones de procesamiento y opciones, se pasa al inicializador. Las opciones pueden indicar que se requiere autenticación de usuario para completar la acción.
- Definimos una categoría con un identificador. El identificador de categoría le permite procesar y mostrar diferentes tipos de notificaciones de diferentes maneras.
- El último paso es establecer la categoría para el centro de notificaciones.
El segundo método enviará una notificación local después de un período de tiempo específico para que podamos minimizar la aplicación o bloquear el teléfono:
UNUserNotificationCenter.current().getNotificationSettings { (settings) in guard settings.authorizationStatus == .authorized else { return } let content = UNMutableNotificationContent() content.title = "Cat Title" content.subtitle = "Cat Subtitle" content.body = "Cat Body" content.sound = .default content.categoryIdentifier = "category-simple" let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false) let uuid = UUID().uuidString let request = UNNotificationRequest(identifier: uuid, content: content, trigger: trigger) UNUserNotificationCenter.current().add(request, withCompletionHandler: { (error) in }) }
- Verifique si el usuario nos permitió enviar notificaciones.
- Creamos una notificación con un encabezado y texto e indicamos la categoría a la que pertenecerá. En este caso, "categoría simple".
- Ajuste el gatillo disparador después de 3 segundos.
- Complete la solicitud para enviar una notificación. En este caso, usamos el UUID como identificador. Este identificador puede ser necesario si queremos cancelar la notificación programada.
- Agregue nuestra solicitud al centro de notificaciones.
A continuación, debe agregar un nuevo objetivo de Extensión de contenido de notificación a la aplicación. Le permite personalizar la visualización de notificaciones y el procesamiento de acciones.
Se creará un archivo plist, ViewController y Storyboard:
En el archivo plist, estamos interesados en las siguientes claves:
- UNNotificationExtensionCategory : el nombre de la categoría que se procesará. Como antes, especifique "categoría simple".
- UNNotificationExtensionInitialContentSizeRatio : la relación entre el alto de la notificación y su ancho. Afecta el tamaño de la notificación después de mostrarla en su totalidad.
- UNNotificationExtensionUserInteractionEnabled : habilita o deshabilita la interacción con controles personalizados. En nuestro caso, será un botón con un corazón.
- UNNotificationExtensionDefaultContentHidden : oculta el contenido de la notificación, que se genera de manera predeterminada.
En el guión gráfico, cree UIImageView, UILabel para mostrar el título de la notificación y UIButton para interactuar con la aplicación.
En View Controller, creamos métodos para abrir la aplicación y ocultar la notificación:
func openApp() { extensionContext?.performNotificationDefaultAction() } func dismissNotification() { extensionContext?.dismissNotificationContentExtension() }
Implementamos los métodos del protocolo UNNotificationContentExtension .
El primero le permitirá mostrar el texto necesario:
func didReceive(_ notification: UNNotification) { self.notificationTitleLabel.text = notification.request.content.body }
El segundo es necesario para manejar acciones de UNNotificationAction . En el mismo método, las acciones se sustituyen mediante la asignación extensionContext? .NotificationActions :
func didReceive(_ response: UNNotificationResponse, completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) { switch response.actionIdentifier { case "like-action": let actions = [ UNNotificationAction(identifier: "1-star", title: "★", options: []), UNNotificationAction(identifier: "2-star", title: "★ ★", options: []), UNNotificationAction(identifier: "3-star", title: "★ ★ ★", options: []), ] extensionContext?.notificationActions = actions case "open-app": openApp() default: dismissNotification() } }
El procesamiento de los golpes cardíacos se realiza como de costumbre a través de IBAction :
@IBAction func defaultButtonTapped(_ sender: UIButton) { openApp() }
Lanzamos la aplicación y vemos lo que obtenemos:
- Se procesan las prensas de UIButton .
- El uso de UNNotificationAction le permite reemplazar las opciones disponibles para la interacción.
Interacción con la configuración de notificaciones
La siguiente innovación le permite agregar un nuevo elemento de menú a la configuración de notificaciones. Cuando lo tocas, se llamará a un método que puedes implementar en la aplicación. Por ejemplo, un usuario puede acceder directamente a su aplicación desde la configuración del sistema e incluir solo las notificaciones que realmente desea recibir. ¿Qué se debe hacer para la implementación?
Primero, al autorizar notificaciones, agregamos un parámetro más: proporcionaAppNotificationSettings :
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .sound, .providesAppNotificationSettings])
En segundo lugar, implementamos el método userNotificationCenter (_: openSettingsFor :) del protocolo UNUserNotificationCenterDelegate :
extension AppDelegate: UNUserNotificationCenterDelegate { func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { openSettings() } func openSettings() { let storyboard = UIStoryboard(name: "Settings", bundle: nil) let settings = storyboard.instantiateViewController(withIdentifier: "Settings") window?.rootViewController = settings } }
Notificaciones provisionales
El usuario no siempre comprende si desea recibir notificaciones de su aplicación. Por lo tanto, cuando inicia la aplicación por primera vez, es difícil para él tomar esa decisión. Con alta probabilidad rechazará su oferta. Para tales situaciones, Apple sugiere usar la Autorización Provisional. Al solicitar autorización para enviar notificaciones, se agrega un parámetro más: provisional . autorización El estado de tales notificaciones también entra en la aplicación con estado provisional .
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .provisional])
El usuario no recibirá una solicitud de autorización al iniciar la aplicación. Sin embargo, para no molestarlo, la aplicación se coloca en la llamada cárcel . Para notificaciones, sonidos, las insignias están deshabilitadas; solo se muestran en el Centro de notificaciones. No aparecerán en la pantalla bloqueada ni en forma de pancartas.
Cuando un usuario recibe una notificación, aparecen dos botones adicionales. Uno bloqueará por completo las notificaciones u ofrecerá ir a la configuración, y el segundo traducirá sus notificaciones al estado autorizado:
Alertas críticas
El último cambio agrega otro tipo de notificación: Alertas críticas . Estas notificaciones ignoran por completo la configuración de su teléfono, el sonido silenciado o el modo de no molestar. Apple recomienda usarlos en aplicaciones médicas (por ejemplo, el nivel de azúcar aumentó bruscamente en el usuario del dispositivo), así como para garantizar la seguridad de los usuarios en el hogar o en lugares públicos.
La solicitud de autorización contiene un carácter especial:
Se agrega un nuevo elemento en la configuración y se muestra un icono adicional en la pantalla de notificación:
Para enviar notificaciones críticas, deberá pasar por el proceso de validación de su aplicación en el sitio web de Apple .
Para usar notificaciones, use el parámetro criticalAlert :
UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert, .criticalAlert])
Y formamos el contenido de la notificación:
let content = UNMutableNotificationContent() content.title = "WARNING" content.body = "Storm alert" content.categoryIdentifier = "storm-alert" content.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0)
Para las alertas críticas, puede especificar el volumen con el que se activará la notificación, independientemente de la configuración del usuario.
Espero que este material simplifique el proceso de introducción de nuevas notificaciones en su aplicación. Si no pudo resolver algunas etapas de la implementación, le sugiero que se familiarice con el código en github o haga una pregunta en los comentarios.
También puede ver un artículo de e-Legion sobre notificaciones para iOS 10 o una grabación de informe de WWDC - Novedades en las notificaciones de usuarios. Podremos discutir las innovaciones en MBLT DEV 2018 en Moscú el 28 de septiembre.
Que tengan un buen día y lobos marinos para todos ^ _ ^
UPD: La segunda parte del artículo sobre la agrupación de notificaciones ya en Habré.