Sobes.tech
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:

  1. Quando si riceve una notifica remota con la chiave mutable-content: 1, il sistema avvia l'esecuzione dell'estensione del servizio di notifica.
  2. Viene implementato il metodo didReceive(_:withContentHandler:), in cui si elabora e modifica la notifica.
  3. Il contenuto modificato viene passato al gestore di completamento contentHandler.
  4. 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)
        }
    }

}