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










