Notification Service Extension: wat het is, content verwerken voordat het wordt weergegeven op iOS

Auteur: IT Sectr Gepubliceerd: 2026-03-21 Leestijd: 8 min

Notification Service Extension — is een iOS-extensie die een pushmelding onderschept voordat deze aan de gebruiker wordt getoond en de inhoud kan wijzigen. De extensie kan versleutelde gegevens ontsleutelen, media-bijlagen downloaden, tekst wijzigen of aangepaste velden toevoegen. Volgens Apple Developer, 2025 heeft Notification Service Extension maximaal 30 seconden om een taak op de achtergrond uit te voeren.

Belangrijkste

  • Notification Service Extension — iOS-extensie voor het verwerken van pushmeldingen voordat ze worden weergegeven.
  • De extensie erft van UNNotificationServiceExtension en implementeert de didReceive-methode.
  • Tot 30 seconden achtergronduitvoering beschikbaar voor het downloaden en verwerken van gegevens.
  • Belangrijkste scenario’s: payload ontsleutelen, afbeeldingen en video downloaden, inhoud valideren.
  • De extensie kan de weergave van de melding uitstellen of volledig annuleren via contentHandler.

Wat is Notification Service Extension

Notification Service Extension — is een app-extensie in iOS die wordt gestart voordat een pushmelding wordt weergegeven. Hiermee kan de server een minimale payload sturen, en de extensie deze aanvullen met inhoud: afbeeldingen downloaden, gegevens ontsleutelen, tekst vervangen. De gebruiker ziet een kant-en-klare, verwerkte melding.

Hoe het werkt

Wanneer iOS een pushmelding ontvangt, controleert het systeem of er een extensie voor deze app is geregistreerd. Als de extensie is geregistreerd, start iOS deze in een achtergrondproces en geeft de meldingsinhoud door via de methode didReceive(_:withContentHandler:). De extensie verwerkt de inhoud en roept contentHandler aan met de gewijzigde inhoud. Als de extensie niet binnen 30 seconden klaar is, toont het systeem de oorspronkelijke melding.

Wanneer Service Extension gebruiken

Service Extension is noodzakelijk in scenario’s waar de meldingsinhoud verwerking op het apparaat vereist. Beveiligde communicatie: de server stuurt een versleutelde payload, de extensie ontsleutelt deze lokaal. Rijke media-meldingen: de server stuurt een afbeeldings-URL, de extensie downloadt en voegt deze toe. Dynamische lokalisatie: de extensie vervangt tekst in de taal van het apparaat.

ScenarioZonder extensieMet extensie
AfbeeldingNiet ondersteundWordt gedownload en weergegeven
VersleutelingServer bewaart de sleutelOntsleuteling op apparaat
TekstVast ingesteld op serverDynamische vervanging
ValidatieNiet gecontroleerdKwaadaardige meldingen annuleren

Beperkingen en uitvoeringstijd

Notification Service Extension werkt in een beperkte omgeving. Maximale uitvoeringstijd — 30 seconden. De extensie heeft geen toegang tot de hoofdopslag van de app (behalve App Group). De grootte van de extensie is beperkt tot 50 MB. Bij tijdsoverschrijding roept het systeem contentHandler aan met de oorspronkelijke inhoud en gaan alle wijzigingen verloren.

Extensie maken en Info.plist configureren

In Xcode wordt Notification Service Extension toegevoegd door een nieuw target van het type Notification Service Extension te maken. Xcode genereert een klassjabloon NotificationService dat overerft van UNNotificationServiceExtension, met twee methoden: didReceive en serviceExtensionTimeWillExpire.

Target toevoegen aan project

Kies in Xcode File → New → Target → Notification Service Extension. Geef een naam op (bijv. PushNotificationService) en de taal Swift. Zorg ervoor dat het target is toegevoegd aan de hoofdapp en de juiste handtekening heeft. Na het maken wordt de klasse NotificationService.swift gegenereerd met de basisimplementatie.

Info.plist-structuur van de extensie

De Info.plist van de extensie bevat de sleutel NSExtension met subsleutels NSExtensionPointIdentifier (com.apple.usernotifications.service) en NSExtensionPrincipalClass (de naam van uw controller). Optioneel kunt u NSExtensionAttributes opgeven met activatieregels voor de extensie. Deze instellingen worden automatisch gegenereerd door Xcode.

Voorbeeld van een basisextensie

De basisimplementatie overschrijft didReceive, wijzigt de meldingsinhoud en roept contentHandler aan. Als de verwerking te lang duurt, wordt serviceExtensionTimeWillExpire aangeroepen, waar u het werk met de huidige status moet voltooien.

swift
import UserNotifications

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(
        request: UNNotificationRequest,
        withContentHandler handler: @escaping (UNNotificationContent) -> Void
    ) {
        contentHandler = handler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let bestAttemptContent = bestAttemptContent {
            bestAttemptContent.title = "[Verwerkt] \(bestAttemptContent.title)"
            contentHandler?(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler,
           let bestAttemptContent = bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }
}

Versleutelde payload ontsleutelen

Een van de belangrijkste toepassingen van Service Extension is het ontsleutelen van de meldingsinhoud op het apparaat. De server stuurt een versleutelde payload en de extensie ontsleutelt deze met een sleutel die is opgeslagen in Keychain of App Group. Dit garandeert dat de inhoud niet kan worden onderschept tijdens de overdracht.

Architectuur van veilige levering

De server versleutelt de meldingsinhoud met een symmetrische sleutel (AES-256). De versleutelingssleutel wordt vooraf overeengekomen tussen client en server. De extensie ontvangt een versleutelde string in het data-veld van de payload, ontsleutelt deze en plaatst deze in de meldingsvelden. De gebruikerssleutel kan worden verkregen uit Keychain na authenticatie.

swift
override func didReceive(
    request: UNNotificationRequest,
    withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
    guard let content = request.content.mutableCopy()
        as? UNMutableNotificationContent else {
        handler(request.content)
        return
    }

    guard let encryptedData = content.userInfo["encrypted_data"]
        as? String else {
        handler(content)
        return
    }

    let decrypted = CryptoService.decrypt(encryptedData)
    content.body = decrypted.body
    content.title = decrypted.title
    handler(content)
}

Veilig opslaan van sleutels

De ontsleutelingssleutel mag niet worden opgeslagen in de code van de extensie of in NSUserDefaults. Gebruik iOS Keychain met toegang via App Group, zodat zowel de app als de extensie de sleutel kunnen lezen. Gebruik Security.framework met het AES-256-GCM-algoritme om een sleutel aan de clientzijde te genereren.

Media-bijlagen downloaden en toevoegen

Het meest voorkomende gebruik van Notification Service Extension — het downloaden van afbeeldingen, GIF’s en video’s voor weergave in de melding. De server stuurt de URL van het mediabestand en de extensie downloadt het, slaat het op in een tijdelijke map en maakt UNNotificationAttachment aan.

Proces van media downloaden en toevoegen

De extensie ontvangt de afbeeldings-URL uit het payload-veld van de melding. Met URLSession downloadt de extensie het bestand naar een tijdelijke map. Na het voltooien van de download wordt UNNotificationAttachment gemaakt met de lokale URL. De bijlage wordt doorgegeven aan de gewijzigde inhoud. iOS geeft automatisch de afbeelding weer in de standaardinterface of in Notification Content Extension.

swift
private func downloadAndAttachMedia(
    content: UNMutableNotificationContent,
    mediaUrl: String,
    handler: @escaping (UNNotificationContent) -> Void
) {
    guard let url = URL(string: mediaUrl) else {
        handler(content)
        return
    }

    let task = URLSession.shared.downloadTask(with: url) { localUrl, _, error in
        guard let localUrl = localUrl, error == nil else {
            handler(content)
            return
        }

        let attachment = try? UNNotificationAttachment(
            identifier: "media",
            url: localUrl,
            options: nil
        )

        if let attachment = attachment {
            content.attachments = [attachment]
        }
        handler(content)
    }
    task.resume()
}

Ondersteunde mediaformaten

iOS ondersteunt de volgende formaten voor weergave in meldingen: JPEG, PNG, GIF (statisch), MPEG-4 video tot 50 MB. Voor audiobestanden worden MP3, AAC en ALAC ondersteund. Belangrijk: alle mediabestanden moeten binnen de limiet van 30 seconden worden gedownload. Voor grote bestanden wordt server-side bijsnijden of progressief downloaden aanbevolen.

Tijdbeheer en fallback-scenario’s

Beheer van de 30-secondenlimiet — een belangrijke taak bij het ontwikkelen van Notification Service Extension. Als de extensie de verwerking niet op tijd voltooit, roept het systeem serviceExtensionTimeWillExpire aan en toont de oorspronkelijke inhoud. Er moeten fallback-scenario’s worden voorzien voor elk type verwerking.

Prioriteitenstrategie

Verdeel taken op prioriteit. Kritieke wijzigingen (ontsleuteling, basislokalisatie) voert u eerst uit. Optionele verbeteringen (afbeeldingen downloaden, tekst verrijken) — in de tweede plaats. Gebruik URLSession met time-outs voor netwerkverzoeken om niet de hele limiet aan één bewerking te besteden.

Fallback bij fouten

Als het downloaden van een afbeelding mislukt of het ontsleutelen van de payload een fout retourneert, moet de extensie contentHandler aanroepen met de oorspronkelijke inhoud. Beëindig de extensie nooit zonder contentHandler aan te roepen — dit leidt tot verlies van de melding. Veilige fallback moet altijd in de extensiecode worden voorzien.

swift
override func didReceive(
    request: UNNotificationRequest,
    withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
    let content = (request.content.mutableCopy()
        as? UNMutableNotificationContent) ?? request.content

    // Kritieke taak: ontsleutelen
    var decryptedContent = tryDecryptPayload(content)

    // Optionele taak: media
    guard let mediaUrl = decryptedContent.userInfo["media_url"]
        as? String else {
        handler(decryptedContent)
        return
    }

    downloadAndAttachMedia(
        content: decryptedContent,
        mediaUrl: mediaUrl,
        handler: handler
    )
}

Testen van de extensie

Gebruik Xcode om de Notification Service Extension te testen: selecteer het extensie-target, voer uit op de simulator en stuur een pushmelding via de terminal of Firebase Console. Log elke verwerkingsfase via os_log — dit helpt bij het diagnosticeren van tijd- en laadfouten.

Veelgestelde vragen

Wat gebeurt er als de extensie de 30 seconden niet haalt?

Het systeem roept serviceExtensionTimeWillExpire aan en toont vervolgens de oorspronkelijke melding zonder wijzigingen. Alle gedownloade bestanden en wijzigingen worden verworpen.

Kan het tonen van de melding vanuit de extensie worden geannuleerd?

Ja, als u contentHandler aanroept met lege inhoud (UNNotificationContent met lege velden), wordt de melding niet getoond. Dit wordt gebruikt voor het filteren van spammeldingen of onjuiste gegevens.

Hoe geef ik een autorisatietoken door voor het downloaden van media?

Het token kan worden doorgegeven in de userInfo van de meldings-payload of worden verkregen uit Keychain via App Group. Het wordt afgeraden om tokens op te slaan in UserDefaults van de extensie.

Is er een speciale certificaatconfiguratie nodig voor de extensie?

De extensie moet worden ondertekend met hetzelfde ontwikkelaarscertificaat als de hoofdapp. Voor productie is een productiecertificaat met ingeschakelde Push Notifications-capability vereist.

Hoe debug ik de extensie op een echt apparaat?

Sluit het apparaat aan op Xcode, selecteer het extensie-target in het opstartschema en stuur een pushmelding via Firebase Console. Breakpoints werken in de extensie hetzelfde als in de hoofdapp.

Samenvatting

  • Notification Service Extension — iOS-extensie voor het op de achtergrond verwerken van pushmeldingen voordat ze worden weergegeven.
  • Maximale uitvoeringstijd — 30 seconden, waarna het systeem de oorspronkelijke inhoud toont.
  • Belangrijkste toepassingen: payload ontsleutelen, media downloaden, inhoud valideren en lokaliseren.
  • De extensie erft van UNNotificationServiceExtension met de methoden didReceive en serviceExtensionTimeWillExpire.
  • Gebruik URLSession voor het downloaden van media, iOS Keychain voor het opslaan van sleutels.
  • Voorzie altijd een fallback — roep contentHandler aan met de oorspronkelijke inhoud bij fouten.
  • Combineer Service Extension met Content Extension voor volledige controle over meldingen.

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook