Notification Extension: kernconcepten, extensietypen en configuratie

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

Notification Extension is een iOS-mechanisme waarmee de inhoud en weergave van pushmeldingen kunnen worden aangepast voordat ze aan de gebruiker worden getoond. Extensies werken aan de kant van het besturingssysteem in een apart proces: UNNotificationServiceExtension verwerkt inkomende inhoud en UNNotificationContentExtension beheert de interface. Volgens Apple Developer Documentation, 2026 krijgt Service Extension tot 30 seconden om taken uit te voeren voordat de melding wordt weergegeven. Deze beperking is kritiek bij het laden van bijlagen of het decoderen van gegevens.

Belangrijkste punten

  • Service Extension — onderschept de melding vóór weergave, maakt het wijzigen van tekst, toevoegen van media en decoderen van gegevens mogelijk met een limiet van 30 seconden.
  • Content Extension — creëert een aangepaste meldingsinterface met willekeurige UI, knoppen en aanraakverwerking via storyboard of SwiftUI.
  • Media-bijlagen — afbeeldingen, video en audio worden toegevoegd via UNNotificationAttachment in Service Extension voordat ze worden doorgegeven aan Content Extension.
  • Registratie — beide extensies worden geregistreerd in Info.plist als afzonderlijke targets met specificatie van meldingscategorieën en NSExtensionPointIdentifier.
  • Beperkingen — extensies hebben geen toegang tot de hoofdapplicatie, werken in een geïsoleerde sandbox met een geheugenlimiet van 50 MB.

Wat is Notification Extension

Notification Extension is een softwarecomponent van iOS die het standaardgedrag van pushmeldingen uitbreidt door de mogelijkheid toe te voegen om inhoud te wijzigen en de interface aan te passen. In tegenstelling tot gewone meldingen die door het systeem in standaardvorm worden weergegeven, stellen extensies de ontwikkelaar in staat om de inhoud vóór weergave te beïnvloeden en een unieke gebruikersinterface te creëren.

Twee typen meldingsextensies

Apple biedt twee typen Notification Extension voor verschillende doeleinden: UNNotificationServiceExtension is verantwoordelijk voor het verwerken van inkomende payload, en UNNotificationContentExtension beheert de weergave. Service Extension wordt gestart vóór weergave van de melding en heeft beperkte tijd om uit te voeren — tot 30 seconden volgens Apple Developer Documentation. Content Extension wordt geactiveerd nadat de gebruiker met de melding heeft interactie en toont een aangepaste weergave.

Verschil met standaardmeldingen

Een standaard iOS-pushmelding wordt automatisch door het systeem weergegeven op basis van de velden alert, title en subtitle uit de JSON-payload. Notification Extension neemt de controle over: Service Extension ontvangt de ruwe payload, wijzigt deze en geeft deze door aan het systeem voor weergave. Content Extension vervangt de standaardbanner door een willekeurige interface met alle bedieningselementen.

Levenscyclus van de extensie

Wanneer het apparaat een pushmelding ontvangt met de sleutel mutable-content: 1, start het systeem Service Extension in een apart proces. Het extensieproces is geïsoleerd van de hoofdapplicatie en heeft een eigen sandbox met een geheugenlimiet van 50 MB. Nadat de verwerking is voltooid, roept de extensie de completion handler aan en geeft de gewijzigde UNNotificationContent aan het systeem voor weergave.

UNNotificationServiceExtension: inhoud wijzigen

UNNotificationServiceExtension is het belangrijkste hulpmiddel voor het programmatisch wijzigen van pushmeldingen voordat ze aan de gebruiker worden getoond. De extensie wordt automatisch geactiveerd bij ontvangst van een melding waarvan de payload de vlag mutable-content: 1 heeft. Binnen 30 seconden kan de extensie een mediabijlage laden, de tekst wijzigen, gecodeerde gegevens decoderen of de inhoud verrijken.

Methoden van het UNNotificationServiceExtension-protocol

De extensie implementeert twee belangrijke methoden uit het UNNotificationServiceExtension-protocol. De methode didReceive ontvangt het inkomende verzoek met ruwe UNNotificationRequest en maakt wijziging mogelijk via een completion handler met nieuwe UNNotificationContent. De methode serviceExtensionTimeWillExpire wordt door het systeem aangeroepen één seconde voordat de time-out verloopt — hier moet de verwerking worden voltooid en het huidige (mogelijk gedeeltelijke) resultaat worden doorgegeven.

Voorbeeld: een afbeelding toevoegen aan een melding

Beschouw een scenario waarin de server een push stuurt met de URL van een afbeelding in een aangepast veld. Service Extension laadt deze afbeelding via het netwerk, maakt een UNNotificationAttachment en voegt deze toe aan de inhoud. UNNotificationAttachment accepteert een lokaal bestand van afbeelding, video of audio en kopieert het automatisch naar de sandbox van de extensie. Na het maken van de attachment geeft de extensie de bijgewerkte inhoud door aan het systeem.

swift
class NotificationService: UNNotificationServiceExtension {

    override func didReceive(_ request: UNNotificationRequest,
        withContentHandler contentHandler:
        @escaping (UNNotificationContent) -> Void) {

        let userInfo = request.content.userInfo
        guard let imageURL = URL(string: userInfo["image-url"] as! String)
        else { contentHandler(request.content); return }

        let attachment = try! UNNotificationAttachment(
            identifier: "image", url: imageURL,
            options: [UNNotificationAttachmentOptionsTypeHintKey: "jpg"])

        let modifiedContent = request.content.mutableCopy()
            as! UNMutableNotificationContent
        modifiedContent.attachments = [attachment]
        contentHandler(modifiedContent)
    }

    override func serviceExtensionTimeWillExpire() {
        contentHandler?(bestAttemptContent ?? request.content)
    }
}

Caching en hergebruik

Bij frequent verzenden van meldingen met dezelfde bijlagen wordt aanbevolen om gedownloade bestanden op het apparaat te cachen. FileManager biedt toegang tot de cachemap van de extensie, die bewaard blijft tussen starts. Dit verkort de verwerkingstijd van volgende meldingen en vermindert de netwerkbelasting. Volgens Apple kan het cachen van bijlagen de verwerkingstijd verkorten tot 2–5 seconden in plaats van volledig laden.

UNNotificationContentExtension: aangepaste interface

UNNotificationContentExtension maakt het mogelijk om de standaard meldingsbanner te vervangen door een aangepaste interface gemaakt in Interface Builder of SwiftUI. De extensie wordt geactiveerd wanneer de gebruiker een actie uitvoert met de melding: tikken, naar beneden vegen of 3D Touch. Content Extension ontvangt de reeds door Service Extension verwerkte inhoud en geeft deze weer in een aangepaste weergave.

Storyboard en meldingscategorieën

Elke Content Extension wordt via Info.plist gekoppeld aan een of meer meldingscategorieën. De categorie wordt op de server bepaald door het veld category in de APNS-payload. Het systeem selecteert automatisch de juiste extensie op basis van de categorie van de ontvangen melding. De interface wordt opgebouwd via storyboard met behulp van standaard UIKit-componenten of SwiftUI View.

Verwerken van gebruikersacties

Content Extension ondersteunt aangepaste knoppen en aanraking handlers gedefinieerd in UNNotificationAction. UNNotificationAction wordt gemaakt in de registratiefase van de categorie en kan tekstinvoer zijn via UNTextInputNotificationAction. Wanneer de gebruiker op een knop drukt, ontvangt de extensie de didReceive-callback met de actie-ID en kan de bijbehorende logica uitvoeren — een URL openen, een verzoek naar de server sturen of de interface bijwerken.

Prestatiebeperkingen

Content Extension werkt in een geïsoleerd proces met een eigen uitvoeringscyclus en een geheugenlimiet van ongeveer 50 MB. De prestaties van de extensie zijn kritiek omdat de systeem-watchdog het proces beëindigt bij overschrijding van limieten. Het wordt aanbevolen om zware berekeningen, het laden van grote afbeeldingen en lange netwerkverzoeken binnen Content Extension te vermijden.

Media-bijlagen en UNNotificationAttachment

UNNotificationAttachment is een object dat een mediabestand toevoegt aan een pushmelding: afbeelding, video, audio of GIF. De bijlage wordt gemaakt van een lokaal bestands-URL dat zich in de sandbox van de extensie moet bevinden. De maximale grootte van de bijlage mag niet groter zijn dan 10 MB, anders zal het systeem de attachment bij het maken weigeren.

Ondersteunde formaten

Apple ondersteunt een beperkte set formaten voor mediabijlagen. Afbeeldingen — JPEG, PNG, GIF (inclusief geanimeerd), TIFF. Video — MPEG, MP4, MOV met een maximale duur van 30 seconden. Audio — MP3, AAC, WAV, CAF. Voor elk formaat kan het type worden gespecificeerd via UNNotificationAttachmentOptionsTypeHintKey, wat het systeem helpt het bestand correct te verwerken.

Bijlage laden via het netwerk

Aangezien de push-payload alleen de URL bevat en niet het bestand zelf, moet het laden van de bijlage binnen Service Extension worden uitgevoerd. De maximale laadtijd is beperkt tot 30 seconden, daarom wordt aanbevolen URLSession te gebruiken met minimale instellingen en laden bij zwak signaal uit te schakelen. Als de bijlage niet op tijd is geladen, wordt de melding zonder media weergegeven — dit is het standaardgedrag van het systeem.

Implementatievoorbeeld in Swift

Beschouw een volledig voorbeeld van Notification Extension dat een afbeelding laadt, downloadt en toevoegt aan de melding. NotificationService erft van UNNotificationServiceExtension en overschrijft de methode didReceive. In het voorbeeld wordt de verwerking van optionele velden, het maken van een attachment en het aanroepen van de completion handler met gewijzigde inhoud getoond.

swift
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
        self.bestAttemptContent =
            (request.content.mutableCopy()
                as! UNMutableNotificationContent)

        guard let attachmentURLString =
            bestAttemptContent?.userInfo["attachment-url"] as? String,
            let url = URL(string: attachmentURLString)
        else {
            contentHandler(request.content)
            return
        }

        URLSession.shared.downloadTask(with: url) {
            [weak self] localURL, _, error in
            guard let localURL = localURL, error == nil
            else {
                contentHandler(request.content)
                return
            }
            let attachment = try! UNNotificationAttachment(
                identifier: "media", url: localURL)
            self?.bestAttemptContent?.attachments = [attachment]
            contentHandler(self?.bestAttemptContent
                ?? request.content)
        }.resume()
    }

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

Info.plist configureren voor de extensie

Voor correcte werking van de extensie moeten de meldingscategorieën in Info.plist worden geregistreerd. De sleutel NSExtensionPointIdentifier wordt ingesteld op com.apple.usernotifications.service voor Service Extension of com.apple.usernotifications.content voor Content Extension. De categorieën worden gedefinieerd in AppDelegate bij het starten van de app via UNUserNotificationCenter, en de extensie wordt alleen geactiveerd voor meldingen met de overeenkomstige categorie in de payload.

Veelgestelde vragen

Wat is het verschil tussen Service Extension en Content Extension?

Service Extension wijzigt de inhoud vóór weergave van de melding — voegt media toe, wijzigt tekst, decodeert gegevens. Content Extension vervangt de meldingsinterface door een aangepaste na interactie van de gebruiker. Service Extension werkt vóór weergave, Content Extension — erna.

Hoeveel tijd is er voor verwerking in Service Extension?

Het systeem geeft 30 seconden voor het uitvoeren van code in didReceive. Als de verwerking niet binnen deze tijd is voltooid, wordt serviceExtensionTimeWillExpire aangeroepen, waar het huidige resultaat moet worden doorgegeven. Het wordt aanbevolen om binnen 10–15 seconden te blijven, rekening houdend met het laden van bijlagen.

Kan SwiftUI worden gebruikt in Content Extension?

Ja, SwiftUI wordt ondersteund in Content Extension vanaf iOS 16. De View wordt ingepakt in UIHostingController en toegevoegd aan het storyboard. Vanwege geheugenbeperkingen wordt echter aanbevolen SwiftUI alleen te gebruiken voor eenvoudige interfaces met een minimaal aantal elementen.

Hoe moeten fouten bij het laden van bijlagen worden afgehandeld?

Bij een laadfout of tijdsoverschrijding roept u eenvoudigweg de completion handler aan met de originele inhoud zonder attachment. Het systeem toont de melding in standaardvorm zonder media. Log fouten via OSLog voor diagnose, maar blokkeer de weergave van de melding niet.

Wat zijn de geheugenbeperkingen van Notification Extension?

De extensie werkt in een geïsoleerd proces met een limiet van ongeveer 50 MB. Bij overschrijding beëindigt het systeem het proces via de watchdog. Vermijd het laden van grote bestanden, het opslaan van afbeeldingen in het geheugen en geheugenlekken bij het werken met URLSession.

Samenvatting

  • Notification Extension — iOS-mechanisme voor het wijzigen van pushmeldingen, inclusief Service Extension (inhoud) en Content Extension (interface).
  • Service Extension verwerkt de payload vóór weergave van de melding met een limiet van 30 seconden, kan mediabijlagen toevoegen en gegevens decoderen.
  • Content Extension vervangt de standaardbanner door een aangepaste interface via UIKit of SwiftUI met ondersteuning voor interactieve knoppen.
  • UNNotificationAttachment voegt afbeeldingen, video en audio toe aan de melding en ondersteunt formaten JPEG, PNG, MP4, MP3 en andere.
  • Registratie van extensies gebeurt via Info.plist met specificatie van NSExtensionPointIdentifier en meldingscategorieën voor activering.
  • Beperkingen — geheugenlimiet van 50 MB, geïsoleerde sandbox zonder toegang tot de hoofdapplicatie, beperkte uitvoeringstijd.
  • Notification Extension is een essentieel hulpmiddel voor het creëren van rijke gebruikersmeldingen, wat de betrokkenheid en functionaliteit van pushcommunicatie in iOS verhoogt.

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