Middle
Cos'è un'estensione del servizio di notifiche?
sobes.tech AI
Risposta dell'AI
L'estensione del servizio di notifica (Notification Service Extension) è un piccolo componente eseguibile integrato nella tua app iOS. Permette di modificare l'aspetto del contenuto di una notifica push remota prima che venga mostrata all'utente.
Funzioni principali:
- Modifica del contenuto: Cambiare il titolo, il sottotitolo, il testo o aggiungere allegati (immagini, video) alla notifica.
- Decriptazione del contenuto criptato: Decifrare i dati criptati inviati insieme alla notifica prima di mostrarli all'utente.
- Notifiche ricche: In combinazione con l'estensione del contenuto della notifica (Notification Content Extension), permette di creare interfacce personalizzate per la visualizzazione delle notifiche.
Ciclo di vita:
- Quando si riceve una notifica remota con la chiave
mutable-content: 1, il sistema avvia l'esecuzione dell'estensione del servizio di notifica. - Viene implementato il metodo
didReceive(_:withContentHandler:), in cui si elabora e modifica la notifica. - Il contenuto modificato viene passato al gestore di completamento
contentHandler. - Il sistema mostra la notifica modificata.
Limitazioni:
- Esecuzione di breve durata (solitamente circa 30 secondi).
- Accesso limitato alle risorse di sistema.
- Non può eseguire compiti prolungati in background.
Esempio di implementazione di base:
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 {
// Modifica il contenuto della notifica qui...
bestAttemptContent.title = "\(bestAttemptContent.title ?? "Senza Titolo") [modificato]"
contentHandler(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
// Chiamato poco prima che l'estensione venga terminata dal sistema.
// Usa questa come un'opportunità per consegnare il "miglior tentativo" di contenuto modificato,
// altrimenti verrà consegnato il payload push originale.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}