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
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.
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.
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.
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 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.
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.
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.
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)
}
}
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 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.
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.
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.
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.
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.
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.
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.
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.
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)
}
}
}
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
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.
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.
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.
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.
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
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.
Lees ook