Middle
¿Qué es una extensión del servicio de notificaciones?
sobes.tech AI
Respuesta de la IA
La extensión del servicio de notificaciones (Notification Service Extension) es un pequeño complemento ejecutable integrado en su aplicación iOS. Permite modificar la apariencia del contenido de una notificación push remota antes de que se muestre al usuario.
Funciones principales:
- Modificación del contenido: Cambiar el título, subtítulo, texto o agregar adjuntos (imágenes, videos) a la notificación.
- Descifrado de contenido cifrado: Descifrar datos cifrados enviados junto con la notificación antes de mostrarlos al usuario.
- Notificaciones enriquecidas: En combinación con la extensión de contenido de notificaciones (Notification Content Extension), permite crear interfaces personalizadas para mostrar notificaciones.
Ciclo de vida:
- Al recibir una notificación remota con la clave
mutable-content: 1, el sistema inicia la ejecución de la extensión del servicio de notificaciones. - Se implementa el método
didReceive(_:withContentHandler:), en el cual se procesa y modifica la notificación. - El contenido modificado se pasa al manejador de finalización
contentHandler. - El sistema muestra la notificación modificada.
Restricciones:
- Ejecución de corta duración (generalmente unos 30 segundos).
- Acceso limitado a recursos del sistema.
- No puede realizar tareas en segundo plano prolongadas.
Ejemplo de implementación básica:
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modificar el contenido de la notificación aquí...
bestAttemptContent.title = "\(bestAttemptContent.title ?? "Sin título") [modificado]"
contentHandler(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
// Se llama justo antes de que el sistema termine la extensión.
// Usa esto como una oportunidad para entregar tu "mejor intento" de contenido modificado,
// de lo contrario, se entregará la carga útil original.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}