Notification Extension ist ein iOS-Mechanismus, der es ermöglicht, den Inhalt und das Erscheinungsbild von Push-Benachrichtigungen zu ändern, bevor sie dem Benutzer angezeigt werden. Erweiterungen arbeiten auf der Betriebssystemseite in einem separaten Prozess: UNNotificationServiceExtension verarbeitet eingehende Inhalte, während UNNotificationContentExtension die Schnittstelle verwaltet. Laut Apple Developer Documentation, 2026 hat die Service Extension bis zu 30 Sekunden Zeit, um Aufgaben vor der Anzeige der Benachrichtigung auszuführen. Diese Einschränkung ist beim Herunterladen von Anhängen oder Entschlüsseln von Daten kritisch.
Wichtige Punkte
Notification Extension ist eine iOS-Softwarekomponente, die das Standardverhalten von Push-Benachrichtigungen erweitert, indem sie die Möglichkeit bietet, Inhalte zu ändern und die Oberfläche anzupassen. Im Gegensatz zu gewöhnlichen Benachrichtigungen, die vom System in einem Standardformat angezeigt werden, ermöglichen Erweiterungen dem Entwickler, den Inhalt vor der Anzeige zu beeinflussen und eine einzigartige Benutzeroberfläche zu erstellen.
Apple bietet zwei Arten von Notification Extension für unterschiedliche Zwecke an: UNNotificationServiceExtension übernimmt die Verarbeitung eingehender Payloads, während UNNotificationContentExtension die Anzeige verwaltet. Die Service Extension wird vor der Anzeige der Benachrichtigung ausgeführt und hat laut Apple Developer Documentation eine begrenzte Ausführungszeit von bis zu 30 Sekunden. Die Content Extension wird aktiviert, nachdem der Benutzer mit der Benachrichtigung interagiert hat, und zeigt eine benutzerdefinierte Ansicht an.
Eine standardmäßige iOS-Push-Benachrichtigung wird vom System automatisch basierend auf den Feldern alert, title und subtitle des JSON-Payloads angezeigt. Notification Extension fängt die Kontrolle ab: Service Extension erhält den rohen Payload, modifiziert ihn und übergibt ihn zur Anzeige an das System. Content Extension ersetzt das Standard-Banner durch eine benutzerdefinierte Oberfläche mit beliebigen Steuerelementen.
Wenn das Gerät eine Push-Benachrichtigung mit dem Schlüssel mutable-content: 1 erhält, startet das System die Service Extension in einem separaten Prozess. Der Erweiterungsprozess ist von der Hauptanwendung isoliert und hat eine eigene Sandbox mit einem Speicherlimit von 50 MB. Nach Abschluss der Verarbeitung ruft die Erweiterung den Completion Handler auf und übergibt den modifizierten UNNotificationContent zur Anzeige an das System.
UNNotificationServiceExtension ist das primäre Werkzeug, um Push-Benachrichtigungen programmatisch zu ändern, bevor sie dem Benutzer angezeigt werden. Die Erweiterung wird automatisch aktiviert, wenn eine Benachrichtigung empfangen wird, deren Payload das Flag mutable-content: 1 gesetzt hat. Innerhalb von 30 Sekunden kann die Erweiterung einen Medienanhang herunterladen, Text ändern, verschlüsselte Daten entschlüsseln oder den Inhalt anreichern.
Die Erweiterung implementiert zwei Schlüsselmethoden aus dem UNNotificationServiceExtension-Protokoll. Die didReceive-Methode empfängt die eingehende Anfrage mit dem rohen UNNotificationRequest und ermöglicht die Änderung über den Completion Handler mit einem neuen UNNotificationContent. Die Methode serviceExtensionTimeWillExpire wird vom System eine Sekunde vor dem Timeout aufgerufen — in ihr muss die Verarbeitung abgeschlossen und das aktuelle (möglicherweise teilweise) Ergebnis übergeben werden.
Betrachten Sie ein Szenario, in dem der Server einen Push mit einer Bild-URL in einem benutzerdefinierten Feld sendet. Die Service Extension lädt dieses Bild über das Netzwerk herunter, erstellt ein UNNotificationAttachment und fügt es zum Inhalt hinzu. UNNotificationAttachment akzeptiert eine lokale Bild-, Video- oder Audiodatei und kopiert sie automatisch in die Sandbox der Erweiterung. Nach der Erstellung des Anhangs übergibt die Erweiterung den aktualisierten Inhalt an das System.
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)
}
}
Wenn Benachrichtigungen mit denselben Anhängen häufig gesendet werden, wird empfohlen, heruntergeladene Dateien auf dem Gerät zwischenzuspeichern. FileManager bietet Zugriff auf das Cache-Verzeichnis der Erweiterung, das zwischen Starts erhalten bleibt. Dies reduziert die Verarbeitungszeit nachfolgender Benachrichtigungen und verringert die Netzwerklast. Laut Apple kann die Zwischenspeicherung die Verarbeitungszeit auf 2–5 Sekunden statt eines vollständigen Downloads reduzieren.
UNNotificationContentExtension ermöglicht es, das Standard-Benachrichtigungsbanner durch eine benutzerdefinierte Oberfläche zu ersetzen, die in Interface Builder oder SwiftUI erstellt wurde. Die Erweiterung wird aktiviert, wenn der Benutzer eine Aktion mit der Benachrichtigung ausführt: Tippen, nach unten wischen oder 3D Touch. Content Extension erhält den bereits von der Service Extension verarbeiteten Inhalt und zeigt ihn in einer benutzerdefinierten Ansicht an.
Jede Content Extension wird über Info.plist mit einer oder mehreren Benachrichtigungskategorien verknüpft. Die Kategorie wird auf dem Server durch das Feld category im APNS-Payload definiert. Das System wählt automatisch die passende Erweiterung basierend auf der Kategorie der empfangenen Benachrichtigung aus. Die Oberfläche wird über Storyboard mit standardmäßigen UIKit-Komponenten oder SwiftUI View erstellt.
Content Extension unterstützt benutzerdefinierte Schaltflächen und Touch-Handler, die in UNNotificationAction definiert sind. UNNotificationAction wird in der Kategorieregistrierungsphase erstellt und kann Texteingabe über UNTextInputNotificationAction unterstützen. Wenn der Benutzer eine Schaltfläche drückt, erhält die Erweiterung den didReceive-Callback mit der Aktionskennung und kann die entsprechende Logik ausführen — eine URL öffnen, eine Anfrage an den Server senden oder die Oberfläche aktualisieren.
Content Extension läuft in einem isolierten Prozess mit einer eigenen Ausführungsschleife und einem Speicherlimit von etwa 50 MB. Die Leistung der Erweiterung ist kritisch, da der System-Watchdog den Prozess beendet, wenn die Grenzen überschritten werden. Es wird empfohlen, aufwändige Berechnungen, das Laden großer Bilder und lange Netzwerkanfragen innerhalb der Content Extension zu vermeiden.
UNNotificationAttachment ist ein Objekt, das eine Mediendatei zu einer Push-Benachrichtigung hinzufügt: Bild, Video, Audio oder GIF. Der Anhang wird aus einer lokalen Datei-URL erstellt, die sich in der Sandbox der Erweiterung befinden muss. Die maximale Anhangsgröße darf 10 MB nicht überschreiten, andernfalls wird das System den Anhang bei der Erstellung ablehnen.
Apple unterstützt eine begrenzte Anzahl von Formaten für Medienanhänge. Bilder — JPEG, PNG, GIF (einschließlich animierter), TIFF. Video — MPEG, MP4, MOV mit einer maximalen Dauer von 30 Sekunden. Audio — MP3, AAC, WAV, CAF. Für jedes Format kann der Typ über UNNotificationAttachmentOptionsTypeHintKey angegeben werden, was dem System hilft, die Datei korrekt zu verarbeiten.
Da der Push-Payload nur eine URL enthält, nicht die Datei selbst, muss das Herunterladen des Anhangs innerhalb der Service Extension erfolgen. Die maximale Downloadzeit ist auf 30 Sekunden begrenzt, daher wird empfohlen, URLSession mit minimalen Einstellungen zu verwenden und den Download bei schwachem Signal zu deaktivieren. Wenn der Anhang nicht rechtzeitig geladen wird, wird die Benachrichtigung ohne Medien angezeigt — dies ist das Standardverhalten des Systems.
Lassen Sie uns ein vollständiges Notification Extension-Beispiel durchgehen, das ein Bild herunterlädt, speichert und zur Benachrichtigung hinzufügt. NotificationService erbt von UNNotificationServiceExtension und überschreibt die didReceive-Methode. Das Beispiel zeigt die Behandlung optionaler Felder, die Erstellung von Anhängen und das Aufrufen des Completion Handlers mit modifiziertem Inhalt.
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)
}
}
}
Damit die Erweiterung korrekt funktioniert, müssen die Benachrichtigungskategorien in Info.plist registriert werden. Der Schlüssel NSExtensionPointIdentifier wird für Service Extension auf com.apple.usernotifications.service oder für Content Extension auf com.apple.usernotifications.content gesetzt. Kategorien werden in AppDelegate beim Start der Anwendung über UNUserNotificationCenter definiert, und die Erweiterung wird nur für Benachrichtigungen mit einer entsprechenden Kategorie im Payload aktiviert.
Häufig gestellte Fragen
Service Extension ändert den Inhalt vor der Anzeige der Benachrichtigung — fügt Medien hinzu, ändert Text, entschlüsselt Daten. Content Extension ersetzt die Benachrichtigungsoberfläche nach Benutzerinteraktion durch eine benutzerdefinierte Oberfläche. Service Extension arbeitet vor der Anzeige, Content Extension danach.
Das System weist 30 Sekunden für die Codeausführung in didReceive zu. Wenn die Verarbeitung nicht innerhalb dieser Zeit abgeschlossen ist, wird serviceExtensionTimeWillExpire aufgerufen, wo das aktuelle Ergebnis übergeben werden muss. Es wird empfohlen, unter Berücksichtigung von Anhangs-Downloads innerhalb von 10–15 Sekunden zu bleiben.
Ja, SwiftUI wird in Content Extension ab iOS 16 unterstützt. Die View wird in einen UIHostingController eingebettet und zum Storyboard hinzugefügt. Aufgrund der Speichergrenzen wird jedoch empfohlen, SwiftUI nur für einfache Oberflächen mit einer minimalen Anzahl von Elementen zu verwenden.
Bei einem Downloadfehler oder Zeitüberschreitung rufen Sie einfach den Completion Handler mit dem ursprünglichen Inhalt ohne Anhang auf. Das System zeigt die Benachrichtigung im Standardformat ohne Medien an. Protokollieren Sie Fehler über OSLog zur Diagnose, blockieren Sie jedoch nicht die Anzeige der Benachrichtigung.
Die Erweiterung läuft in einem isolierten Prozess mit einem Limit von etwa 50 MB. Bei Überschreitung beendet das System den Prozess über den Watchdog. Vermeiden Sie das Laden großer Dateien, das Speichern von Bildern im Speicher und Lecks bei der Arbeit mit URLSession.
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