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 — 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.
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.
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.
| Scenario | Zonder extensie | Met extensie |
|---|---|---|
| Afbeelding | Niet ondersteund | Wordt gedownload en weergegeven |
| Versleuteling | Server bewaart de sleutel | Ontsleuteling op apparaat |
| Tekst | Vast ingesteld op server | Dynamische vervanging |
| Validatie | Niet gecontroleerd | Kwaadaardige meldingen annuleren |
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.
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.
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.
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.
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.
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)
}
}
}
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.
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.
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)
}
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.
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.
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.
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()
}
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.
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.
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.
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.
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
)
}
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
Het systeem roept serviceExtensionTimeWillExpire aan en toont vervolgens de oorspronkelijke melding zonder wijzigingen. Alle gedownloade bestanden en wijzigingen worden verworpen.
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.
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.
De extensie moet worden ondertekend met hetzelfde ontwikkelaarscertificaat als de hoofdapp. Voor productie is een productiecertificaat met ingeschakelde Push Notifications-capability vereist.
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
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