Notification Service Extension ist eine iOS-Erweiterung, die eine Push-Benachrichtigung abfängt, bevor sie dem Benutzer angezeigt wird, und ermöglicht, den Inhalt zu modifizieren. Die Erweiterung kann verschlüsselte Daten entschlüsseln, Medienanhänge herunterladen, Text ändern oder benutzerdefinierte Felder hinzufügen. Laut Apple Developer, 2025 hat Notification Service Extension bis zu 30 Sekunden Zeit, um die Aufgabe im Hintergrund abzuschließen.
Wichtige Punkte
Notification Service Extension ist eine App-Erweiterung in iOS, die ausgeführt wird, bevor eine Push-Benachrichtigung angezeigt wird. Sie erlaubt dem Server, einen minimalen Payload zu senden, während die Erweiterung ihn mit Inhalten anreichert: Bilder herunterladen, Daten entschlüsseln, Text ersetzen. Der Benutzer sieht die bereits verarbeitete Benachrichtigung.
Wenn iOS eine Push-Benachrichtigung erhält, prüft das System, ob eine Erweiterung für die App vorhanden ist. Wenn die Erweiterung registriert ist, startet iOS sie in einem Hintergrundprozess und übergibt den Benachrichtigungsinhalt über die Methode didReceive(_:withContentHandler:). Die Erweiterung verarbeitet den Inhalt und ruft contentHandler mit dem modifizierten Inhalt auf. Wenn die Erweiterung nicht innerhalb von 30 Sekunden abschließt, zeigt das System die ursprüngliche Benachrichtigung an.
Service Extension ist in Szenarien erforderlich, in denen Benachrichtigungsinhalte eine Verarbeitung auf dem Gerät erfordern. Sichere Kommunikation: Der Server sendet einen verschlüsselten Payload, die Erweiterung entschlüsselt ihn lokal. Rich Media-Benachrichtigungen: Der Server sendet eine Bild-URL, die Erweiterung lädt sie herunter und hängt sie an. Dynamische Lokalisierung: Die Erweiterung setzt Text in der Gerätesprache ein.
| Szenario | Ohne Erweiterung | Mit Erweiterung |
|---|---|---|
| Bild | Nicht unterstützt | Heruntergeladen und angezeigt |
| Verschlüsselung | Server speichert den Schlüssel | Entschlüsselung auf dem Gerät |
| Text | Auf dem Server festgelegt | Dynamische Ersetzung |
| Validierung | Nicht geprüft | Schädliche Benachrichtigungen abbrechen |
Notification Service Extension läuft in einer eingeschränkten Umgebung. Die maximale Ausführungszeit beträgt 30 Sekunden. Die Erweiterung hat keinen Zugriff auf den Hauptspeicher der App (außer App Group). Die Größe der Erweiterung ist auf 50 MB begrenzt. Bei Zeitüberschreitung ruft das System contentHandler mit dem ursprünglichen Inhalt auf, und alle Änderungen gehen verloren.
In Xcode wird Notification Service Extension durch Erstellen eines neuen Targets vom Typ Notification Service Extension hinzugefügt. Xcode generiert eine Vorlagenklasse NotificationService, die von UNNotificationServiceExtension erbt, mit zwei Methoden: didReceive und serviceExtensionTimeWillExpire.
Wählen Sie in Xcode File → New → Target → Notification Service Extension. Geben Sie einen Namen ein (z.B. PushNotificationService) und wählen Sie die Sprache Swift. Stellen Sie sicher, dass das Target zur Haupt-App hinzugefügt wurde und die richtige Signatur hat. Nach der Erstellung wird die Klasse NotificationService.swift mit einer Basisimplementierung generiert.
Das Info.plist der Erweiterung enthält den Schlüssel NSExtension mit den Unterschlüsseln NSExtensionPointIdentifier (com.apple.usernotifications.service) und NSExtensionPrincipalClass (der Name Ihres Controllers). Zusätzlich können NSExtensionAttributes mit Aktivierungsregeln für die Erweiterung angegeben werden. Xcode generiert diese Einstellungen automatisch.
Die Basisimplementierung überschreibt didReceive, modifiziert den Benachrichtigungsinhalt und ruft contentHandler auf. Wenn die Verarbeitung zu lange dauert, wird serviceExtensionTimeWillExpire aufgerufen, wo Sie die Arbeit mit dem aktuellen Zustand abschließen müssen.
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 = "[Verarbeitet] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Eine der Hauptanwendungen von Service Extension ist die Entschlüsselung von Benachrichtigungsinhalten auf dem Gerät. Der Server sendet einen verschlüsselten Payload, und die Erweiterung entschlüsselt ihn mit einem in Keychain oder App Group gespeicherten Schlüssel. Dies stellt sicher, dass der Inhalt während der Übertragung nicht abgefangen werden kann.
Der Server verschlüsselt den Benachrichtigungstext mit einem symmetrischen Schlüssel (AES-256). Der Verschlüsselungsschlüssel wird zwischen Client und Server vorab vereinbart. Die Erweiterung erhält die verschlüsselte Zeichenfolge im Datenfeld des Payloads, entschlüsselt sie und setzt sie in die Benachrichtigungsfelder ein. Der Benutzerschlüssel kann nach der Authentifizierung aus der Keychain abgerufen werden.
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)
}
Der Entschlüsselungsschlüssel darf nicht im Erweiterungscode oder in NSUserDefaults gespeichert werden. Verwenden Sie iOS Keychain mit Zugriff über App Group, damit sowohl die App als auch die Erweiterung den Schlüssel lesen können. Verwenden Sie Security.framework mit dem AES-256-GCM-Algorithmus zur Schlüsselgenerierung auf dem Client.
Die häufigste Verwendung von Notification Service Extension ist das Herunterladen von Bildern, GIFs und Videos zur Anzeige in der Benachrichtigung. Der Server sendet eine Medien-URL, und die Erweiterung lädt sie herunter, speichert sie in einem temporären Verzeichnis und erstellt ein UNNotificationAttachment.
Die Erweiterung erhält die Bild-URL aus dem Payload-Feld der Benachrichtigung. Mit URLSession lädt die Erweiterung die Datei in ein temporäres Verzeichnis herunter. Nach Abschluss des Downloads wird ein UNNotificationAttachment mit der lokalen URL erstellt. Der Anhang wird an den modifizierten Inhalt übergeben. iOS zeigt automatisch das Bild in der Standardschnittstelle oder in einer Notification Content Extension an.
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 unterstützt die folgenden Formate für die Anzeige in Benachrichtigungen: JPEG, PNG, GIF (statisch), MPEG-4-Video bis 50 MB. Für Audiodateien werden MP3, AAC und ALAC unterstützt. Wichtig: Alle Mediendateien müssen innerhalb des 30-Sekunden-Limits heruntergeladen werden. Für große Dateien wird serverseitiges Zuschneiden oder progressives Laden empfohlen.
Die Verwaltung des 30-Sekunden-Limits ist eine Schlüsselaufgabe bei der Entwicklung von Notification Service Extension. Wenn die Erweiterung die Verarbeitung nicht rechtzeitig abschließt, ruft das System serviceExtensionTimeWillExpire auf und zeigt den ursprünglichen Inhalt an. Für jede Verarbeitungsart müssen Fallback-Szenarien vorgesehen werden.
Teilen Sie Aufgaben nach Priorität auf. Führen Sie zuerst kritische Änderungen (Entschlüsselung, grundlegende Lokalisierung) durch. Optionale Verbesserungen (Bild-Download, Textanreicherung) kommen danach. Verwenden Sie URLSession mit Timeouts für Netzwerkanfragen, um nicht das gesamte Limit für eine einzige Operation zu verbrauchen.
Wenn der Bild-Download fehlschlägt oder die Payload-Entschlüsselung einen Fehler zurückgibt, sollte die Erweiterung contentHandler mit dem ursprünglichen Inhalt aufrufen. Beenden Sie die Erweiterung niemals ohne Aufruf von contentHandler — dies führt zum Verlust der Benachrichtigung. Ein sicherer Fallback sollte immer im Erweiterungscode vorgesehen sein.
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// Kritische Aufgabe: Entschlüsselung
var decryptedContent = tryDecryptPayload(content)
// Optionale Aufgabe: Medien
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
Zum Testen von Notification Service Extension verwenden Sie Xcode: Wählen Sie das Erweiterungs-Target aus, führen Sie es auf dem Simulator aus und senden Sie eine Push-Benachrichtigung über das Terminal oder die Firebase Console. Protokollieren Sie jede Verarbeitungsstufe mit os_log — dies hilft bei der Diagnose von Zeit- und Download-Problemen.
Häufig gestellte Fragen
Das System ruft serviceExtensionTimeWillExpire auf und zeigt dann die ursprüngliche Benachrichtigung unverändert an. Alle heruntergeladenen Dateien und Änderungen werden verworfen.
Ja, wenn Sie contentHandler mit leerem Inhalt (UNNotificationContent mit leeren Feldern) aufrufen, wird die Benachrichtigung nicht angezeigt. Dies wird zum Filtern von Spam-Benachrichtigungen oder ungültigen Daten verwendet.
Das Token kann im userInfo des Benachrichtigungs-Payloads übergeben oder über App Group aus der Keychain abgerufen werden. Es wird nicht empfohlen, Tokens in den UserDefaults der Erweiterung zu speichern.
Die Erweiterung muss mit demselben Entwicklerzertifikat signiert sein wie die Haupt-App. Für die Produktion ist ein Produktionszertifikat mit aktivierter Push Notifications-Funktion erforderlich.
Verbinden Sie das Gerät mit Xcode, wählen Sie das Erweiterungs-Target im Ausführungsschema aus und senden Sie eine Push-Benachrichtigung über die Firebase Console. Breakpoints in der Erweiterung funktionieren genauso wie in der Haupt-App.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch