Logo Site EngageLab Mark Colored Transparent
Documentación

Resumen de las nuevas actualizaciones de funciones de iOS

Novedades de iOS 14

Las nuevas funciones de iOS 14 incluyen principalmente App Clip, portapapeles, protección de la privacidad y otras, pero no hay nuevas funciones relacionadas con las notificaciones.

Novedades de iOS 13

Las nuevas funciones de iOS 13 incluyen principalmente Modo oscuro (Dark Mode), Swift UI y otras, pero no hay nuevas funciones relacionadas con las notificaciones.

Novedades de iOS 12

Agrupación de notificaciones push

En iOS 12, las notificaciones del mismo tipo se combinan en un grupo de notificaciones. Los usuarios pueden expandir todas las notificaciones del grupo pulsando el grupo de notificaciones

Para la agrupación de notificaciones se utilizan dos métodos: agrupación automática e identificador de hilo (thread identifier). Los desarrolladores no necesitan realizar ninguna acción adicional para la agrupación automática; el sistema agrupará los push según el bundleId de la aplicación. Si se necesita agrupar las notificaciones con mayor granularidad, será necesario utilizar identificadores de hilo.
Los usuarios pueden configurar la agrupación (automática, por aplicación, desactivada)

El atributo threadIdentifier existe desde iOS 10, pero es en iOS 12 cuando se implementa realmente la agrupación.

// The unique identifier for the thread or conversation related to this notification request. It will be used to visually group notifications together. @property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier __TVOS_PROHIBITED;
              
              // The unique identifier for the thread or conversation related to this notification request. It will be used to visually group notifications together.
@property (NS_NONATOMIC_IOSONLY, copy) NSString *threadIdentifier __TVOS_PROHIBITED;

            
Este bloque de código se muestra en una ventana flotante

Configuración del formato de resumen

Después de agrupar automáticamente las notificaciones, aparece un resumen de mensajes en la parte inferior. El formato predeterminado es: n notificaciones más. El formato es personalizable.
La primera opción: personalización del formato mediante UNNotificationCategory

+ (instancetype)categoryWithIdentifier:(NSString *)identifier actions:(NSArray<UNNotificationAction *> *)actions intentIdentifiers:(NSArray<NSString *> *)intentIdentifiers hiddenPreviewsBodyPlaceholder:(nullable NSString *)hiddenPreviewsBodyPlaceholder categorySummaryFormat:(nullable NSString *)categorySummaryFormat options:(UNNotificationCategoryOptions)options __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED;
              
              + (instancetype)categoryWithIdentifier:(NSString *)identifier
                               actions:(NSArray<UNNotificationAction *> *)actions
                     intentIdentifiers:(NSArray<NSString *> *)intentIdentifiers
         hiddenPreviewsBodyPlaceholder:(nullable NSString *)hiddenPreviewsBodyPlaceholder
                 categorySummaryFormat:(nullable NSString *)categorySummaryFormat
                               options:(UNNotificationCategoryOptions)options __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED;

            
Este bloque de código se muestra en una ventana flotante

La segunda opción es la personalización mediante UNNotificationContent

/// The argument to be inserted in the summary for this notification. @property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *summaryArgument __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED; /// A number that indicates how many items in the summary are represented in the summary. /// For example if a podcast app sends one notification for 3 new episodes in a show, /// the argument should be the name of the show and the count should be 3. /// Default is 1 and cannot be 0. @property (NS_NONATOMIC_IOSONLY, readonly, assign) NSUInteger summaryArgumentCount __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;
              
              /// The argument to be inserted in the summary for this notification.
@property (NS_NONATOMIC_IOSONLY, readonly, copy) NSString *summaryArgument __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;

/// A number that indicates how many items in the summary are represented in the summary.
/// For example if a podcast app sends one notification for 3 new episodes in a show,
/// the argument should be the name of the show and the count should be 3.
/// Default is 1 and cannot be 0.
@property (NS_NONATOMIC_IOSONLY, readonly, assign) NSUInteger summaryArgumentCount __IOS_AVAILABLE(12.0) __WATCHOS_PROHIBITED __TVOS_PROHIBITED;

            
Este bloque de código se muestra en una ventana flotante

Gestión de notificaciones

Apple añadió un botón «Gestionar» (Manage) para los mensajes, que aparece al deslizar hacia la izquierda.

Autorización temporal

La principal manifestación de la autorización temporal es que habrá dos botones en el mensaje push, para que el usuario elija activamente.

Notificación de advertencia

Por ejemplo, seguridad familiar, salud, seguridad pública y otros factores. Este mensaje requiere que el usuario realice una acción. El escenario más simple es cuando tenemos una cámara instalada en casa y vamos a trabajar. Si hay alguien en la casa, la cámara nos enviará un mensaje. Este tipo de notificación requiere un certificado especial.

Novedades de iOS 10

Instrucciones

iOS 10 añade varias funciones nuevas relacionadas con las notificaciones. Para más detalles, consultar el blog oficial de EngageLab.

Service Extension de iOS 10

Instrucciones

Service Extension se añadió en iOS 10.
A continuación se muestra la ilustración oficial: Esto significa que, antes de que APNs llegue a nuestro dispositivo, se procesa mediante una capa de Service Extension, lo que permite que los usuarios configuren sus propios ajustes y añade variedad a APNs.

Método de uso

Service Extension es fácil de usar. En primer lugar, se debe crear un Service Extension, como se muestra en la siguiente figura:

A continuación, hay un par de aspectos a tener en cuenta:

  • El Bundle Identifier de Service Extension no puede ser el mismo que el Bundle Identifier del Main Target (su propio App Target). De lo contrario, se informará de un error de BundleID duplicado.
  • El Bundle Identifier de Service Extension debe estar dentro del espacio de nombres del Main Target. Por ejemplo, si el BundleID del Main Target es io.mtpush.xxx, el BundleID de Service Extension debería tener un formato similar a io.mtpush.xxx.yyy. De lo contrario, puede producirse un error.

Ahora que el Service Extension se ha creado y se ha utilizado correctamente, en el proyecto se dispone de una clase que contiene dos métodos:

  • didReceiveNotificationRequest:(UNNotificationRequest _)request withContentHandler:(void (^)(UNNotificationContent _contentToDeliver))contentHandler
  • serviceExtensionTimeWillExpire

Veamos la explicación oficial del primer método:
«Llamar a contentHandler con el contenido de la notificación modificado para su entrega. Si el manejador no se llama antes de que expire el tiempo del servicio, se entregará la notificación sin modificar.»

En resumen, este método se llama cuando llega APNs y permite procesar el contenido enviado; a continuación, se utiliza contentHandler para entregar el contenido procesado. Pero si el procesamiento tarda demasiado, el APNs se mostrará tal cual.
Es decir, se pueden procesar las notificaciones en este método y personalizarlas para el usuario.

El segundo método, por su parte, es un complemento del primero. Realiza una devolución de llamada antes de que expire el tiempo, momento en el que se puede llevar a cabo un procesamiento urgente del mensaje de APNs.

Integración con iOS 9

Los cambios de iOS 9 afectan a las siguientes secciones del SDK:

  • Se añadió el formato de codificación bitCode. Cuando el SDK no es compatible con bitCode, los usuarios no pueden habilitar la opción bitCode durante la integración.
    • Síntoma: después de integrar el SDK, la compilación falla y el registro de errores contiene información de error de bitCode.
  • La conexión predeterminada es https. Si la solicitud es http, se debe configurar manualmente el plist para admitir el servicio http. Actualmente, todas nuestras solicitudes de servidor se dirigen al servicio http.
    • Síntoma: después de integrar el SDK, todos los servicios http relacionados con MTPush muestran un error de conexión o tiempo de espera. Esto puede ser la causa.

Solución para bitCode

  • MTPush iOS SDK v1.8.7 y posteriores ya admiten bitCode, una nueva función de iOS 9.

Solución para https

Este paso no es necesario para MTPush 2.0.0 o posterior.

  • Añadir de forma explícita el tipo Diccionario NSAppTransportSecurity en el Info.plist del proyecto actual.
  • Añadir NSAllowsArbitraryLoads de tipo Boolean bajo NSAppTransportSecurity y establecerlo en YES.

iOS 9 UIUserNotificationActionBehaviorTextInput

Versión compatible

La versión v1.8.0 está disponible.

  1. El cambio más importante en las notificaciones push en iOS 9 es la modificación del tipo Category de push. Sobre la base de las categorías push originales, se añadió un tipo de acción de texto. Este parámetro se utiliza para registrar los elementos introducidos mediante texto de acceso directo en la notificación.
  2. Esta categoría está compuesta por una serie de UIUserNotificationCategory. Cada objeto UIUserNotificationCategory permite añadir un conjunto de parámetros de tipo UIMutableUserNotificationAction para incrementar los elementos de la barra de notificaciones. En iOS 9, el tipo UIMutableUserNotificationAction original añade el tipo de entrada de texto (UIUserNotificationActionBehaviorTextInput), que se configura mediante behavior (una propiedad disponible solo en iOS 9).
  3. iOS 9 utiliza dos nuevos métodos de devolución de llamada para gestionar el evento de pulsación de un botón:
- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0) - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)
              
              - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forLocalNotification:(UILocalNotification *)notification withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullableNSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0)

            
Este bloque de código se muestra en una ventana flotante

Nota:

  • Cuando la acción es UIUserNotificationActionBehaviorTextInput, se debe obtener el texto introducido mediante responseInfo UIUserNotificationActionResponseTypedTextKey y obtener el tipo de botón pulsado mediante UIUserNotificationTextInputActionButtonTitleKey.
  • Cuando la acción es UIUserNotificationActionBehaviorDefault, responseInfo es nil; se debe distinguir la acción pulsada mediante identifier para realizar el procesamiento.

Configuración del cliente

Configurar notificaciones con respuestas rápidas

# ifdef __IPHONE_9_0 UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc]init]; replyAction.title = @"Reply"; replyAction.identifier = @"comment-reply"; replyAction.activationMode = UIUserNotificationActivationModeBackground; replyAction.behavior = UIUserNotificationActionBehaviorTextInput; UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init]; category.identifier = @"reply"; [category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault]; # endif
              
              # ifdef __IPHONE_9_0 
 UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc]init];
 replyAction.title = @"Reply";
 replyAction.identifier = @"comment-reply";
 replyAction.activationMode = UIUserNotificationActivationModeBackground;
 replyAction.behavior = UIUserNotificationActionBehaviorTextInput;
  
 UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc]init];
 category.identifier = @"reply";
 [category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault];
# endif

            
Este bloque de código se muestra en una ventana flotante

Usar funciones de devolución de llamada

- (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0) {if ([identifier isEqualToString:@"comment-reply"]) {NSString *response = responseInfo[UIUserNotificationActionResponseTypedTextKey]; // Process the input text } completionHandler();}
              
              - (void)application:(UIApplication *)application handleActionWithIdentifier:(nullable NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void(^)())completionHandler NS_AVAILABLE_IOS(9_0) {if ([identifier isEqualToString:@"comment-reply"]) {NSString *response = responseInfo[UIUserNotificationActionResponseTypedTextKey];
 // Process the input text
 }
 completionHandler();}

            
Este bloque de código se muestra en una ventana flotante

Configuración del lado del servidor

Formato de contenido del servidor: en aps se incrementa el campo category; cuando el campo coincide con el identifier de UIMutableUserNotificationCategory del cliente, se desencadena la acción configurada y se muestra el botón.

payload example: {"aps":{"alert":"example", "sound":"default", "badge": 1, "category":"reply"}}
              
              payload example:
{"aps":{"alert":"example", "sound":"default", "badge": 1, "category":"reply"}}

            
Este bloque de código se muestra en una ventana flotante

iOS 8 UILocalNotification

En iOS 8 se añadieron tres parámetros a UILocalNotification: region, regionTriggersOnce y category.

  • region: controla que, cuando el usuario entra o sale de una ubicación geográfica, se active la notificación. Para usar esta función, el usuario debe conceder el permiso "when-in-use" para CoreLocation.
  • regionTriggersOnce(BOOL): cuando es YES, las notificaciones se activan solo una vez; cuando es NO, las notificaciones se activan en cada entrada o salida.
  • category: si localNotification se registra mediante + [UIUserNotificationSettings SettingsForUserNotificationTypes: userNotificationActionSettings:], se puede obtener la categoría de notificación registrada a través de category.

Configuración del cliente

Uso de UILocalNotification

// set localNotification CLLocationCoordinate2D coordinate2D; coordinate2D.latitude = 100.0; coordinate2D.longitude = 100.0; CLRegion *currentRegion = [[CLCircularRegion alloc] initWithCenter:coordinate2D radius:CLLocationDistanceMax identifier:@"test"]; [APService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:120] alertBody:@"test ios8 notification" badge:0 alertAction:@"Cancelar" identifierKey:@"1" userInfo:nil soundName:nil region:currentRegion regionTriggersOnce:YES category:@"test"];
              
              // set localNotification
  CLLocationCoordinate2D coordinate2D;
  coordinate2D.latitude = 100.0;
  coordinate2D.longitude = 100.0;
  CLRegion *currentRegion =
      [[CLCircularRegion alloc] initWithCenter:coordinate2D
                                        radius:CLLocationDistanceMax
                                    identifier:@"test"];
 
  [APService setLocalNotification:[NSDate dateWithTimeIntervalSinceNow:120]
                        alertBody:@"test ios8 notification"
                            badge:0
                      alertAction:@"Cancelar"
                    identifierKey:@"1"
                         userInfo:nil
                        soundName:nil
                           region:currentRegion
               regionTriggersOnce:YES
                         category:@"test"];

            
Este bloque de código se muestra en una ventana flotante

iOS 7 Background Remote Notification

El principal cambio de iOS 7 en las notificaciones push permite ejecutar código en segundo plano cuando la app recibe una notificación, por ejemplo, para obtener actualizaciones del servidor. Esto mejora la experiencia en chats multimedia, actualizaciones de correo y sincronización de suscripciones basada en notificaciones.

Las siguientes imágenes oficiales de Apple comparan las notificaciones remotas con las de versiones anteriores.

Si solo se incluye content-available: 1, sin badge, sound ni contenido del mensaje, se pueden actualizar contenidos sin interrumpir al usuario. Estas son las notificaciones remotas silenciosas (Silent Remote Notifications).

Configuración del cliente

Habilitar Remote notifications

En Xcode, habilite Remote notifications en Capabilities de la app, como se muestra a continuación:

Modificar la función de gestión de notificaciones

Después de habilitar Background Modes > Remote notifications, utilice la siguiente función para gestionar las notificaciones. El código de push en segundo plano también se ejecuta en esta función.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
              
              - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;

            
Este bloque de código se muestra en una ventana flotante

Configuración de push en el servidor

El mensaje debe incluir content-available: 1 para permitir la ejecución en segundo plano. Sin este campo, se comporta como una notificación normal de las versiones anteriores a iOS 7.

Enviar push desde Web Portal

Seleccione el parámetro correspondiente en la configuración opcional.

Enviar push mediante la API

En Push API v3 añada el campo "content-available": true en el objeto ios.

Limitaciones y consideraciones

  • Apple limita la frecuencia de las notificaciones remotas silenciosas, aunque no especifica la frecuencia exacta. Por ello, no todas llegarán al cliente y activarán la función según lo previsto.
  • El tiempo de ejecución de la app en segundo plano es limitado. Para descargar archivos grandes, consulte la documentación de NSURLSession de Apple.
  • Las notificaciones remotas en segundo plano requieren que la app esté en estado Background o Suspended. Si el usuario finaliza la app desde el selector de aplicaciones, no se activará para ejecutar código en segundo plano.

Para obtener más información, consulte la documentación oficial de desarrollo para iOS de Apple.

Icon Solid Transparent White Qiyu
Contactar con ventas