Notification Service Extension — är ett iOS-tillägg som fångar upp push-notifieringen innan den visas för användaren och tillåter modifiering av innehållet. Tillägget kan dekryptera krypterad data, ladda ner media-bilagor, ändra text eller lägga till anpassade fält. Enligt Apple Developer, 2025 har Notification Service Extension upp till 30 sekunder på sig att utföra uppgiften i bakgrunden.
Huvudsakligt
Notification Service Extension — är ett apptillägg i iOS som startas innan push-notifieringen visas. Det gör att servern kan skicka en minimal payload och tillägget kan fylla på med innehåll: ladda ner bilder, dekryptera data, ersätta text. Användaren ser en färdig, bearbetad notifiering.
När iOS tar emot en push-notifiering kontrollerar systemet om det finns ett tillägg för denna app. Om tillägget är registrerat startar iOS det i en bakgrundsprocess och skickar notifieringens innehåll via metoden didReceive(_:withContentHandler:). Tillägget bearbetar innehållet och anropar contentHandler med det ändrade innehållet. Om tillägget inte hinner inom 30 sekunder visar systemet den ursprungliga notifieringen.
Service Extension är nödvändig i scenarier där notifieringens innehåll kräver bearbetning på enheten. Säker kommunikation: servern skickar en krypterad payload, tillägget dekrypterar den lokalt. Rika media-notifieringar: servern skickar en bild-URL, tillägget laddar ner och bifogar den. Dynamisk lokalisering: tillägget ersätter texten på enhetens språk.
| Scenario | Utan tillägg | Med tillägg |
|---|---|---|
| Bild | Stöds inte | Laddas ner och visas |
| Kryptering | Servern behåller nyckeln | Dekryptering på enheten |
| Text | Fast inställd på servern | Dynamisk ersättning |
| Validering | Kontrolleras inte | Avbrytning av skadliga notifieringar |
Notification Service Extension fungerar i en begränsad miljö. Maximal körtid — 30 sekunder. Tillägget har inte tillgång till appens huvudlagring (förutom App Group). Tilläggets storlek är begränsad till 50 MB. Vid tidsöverskridning anropar systemet contentHandler med det ursprungliga innehållet och alla ändringar går förlorade.
I Xcode läggs Notification Service Extension till genom att skapa ett nytt target av typen Notification Service Extension. Xcode genererar en klassmall NotificationService som ärver från UNNotificationServiceExtension, med två metoder: didReceive och serviceExtensionTimeWillExpire.
I Xcode välj File → New → Target → Notification Service Extension. Ange namn (t.ex. PushNotificationService) och språket Swift. Säkerställ att target har lagts till i huvudappen och har korrekt signatur. Efter skapandet kommer klassen NotificationService.swift att genereras med en grundläggande implementering.
Info.plist för tillägget innehåller nyckeln NSExtension med undernycklarna NSExtensionPointIdentifier (com.apple.usernotifications.service) och NSExtensionPrincipalClass (namnet på din kontroller). Valfritt kan NSExtensionAttributes anges med aktiveringsregler för tillägget. Dessa inställningar genereras automatiskt av Xcode.
Grundimplementeringen överskriver didReceive, ändrar notifieringens innehåll och anropar contentHandler. Om bearbetningen tar för lång tid anropas serviceExtensionTimeWillExpire, där du måste slutföra arbetet med det aktuella tillståndet.
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 = "[Bearbetad] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
En av de viktigaste användningarna av Service Extension är dekryptering av notifieringens innehåll på enheten. Servern skickar en krypterad payload och tillägget dekrypterar den med en nyckel som lagras i Keychain eller App Group. Detta garanterar att innehållet inte kan fångas upp under överföringen.
Servern krypterar notifieringens brödtext med en symmetrisk nyckel (AES-256). Krypteringsnyckeln kommer överens i förväg mellan klient och server. Tillägget tar emot en krypterad sträng i datafältet i payloaden, dekrypterar den och placerar den i notifieringsfälten. Användarens nyckel kan hämtas från Keychain efter autentisering.
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)
}
Dekrypteringsnyckeln bör inte lagras i tilläggets kod eller i NSUserDefaults. Använd iOS Keychain med åtkomst via App Group så att både appen och tillägget kan läsa nyckeln. För att generera en nyckel på klientsidan, använd Security.framework med AES-256-GCM-algoritmen.
Den vanligaste användningen av Notification Service Extension — att ladda ner bilder, GIF:ar och videor för visning i notifieringen. Servern skickar URL:en till mediafilen och tillägget laddar ner den, sparar den i en tillfällig katalog och skapar UNNotificationAttachment.
Tillägget tar emot bildens URL från notifieringens payload-fält. Med URLSession laddar tillägget ner filen till en tillfällig katalog. Efter nedladdningen skapas UNNotificationAttachment med den lokala URL:en. Bilagan skickas vidare till det ändrade innehållet. iOS visar automatiskt bilden i standardgränssnittet eller i 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 stödjer följande format för visning i notifieringar: JPEG, PNG, GIF (statiska), MPEG-4 video upp till 50 MB. För ljudfiler stöds MP3, AAC och ALAC. Viktigt: alla mediafiler måste laddas ner inom 30-sekundersgränsen. För stora filer rekommenderas serverbeskärning eller progressiv nedladdning.
Hantering av 30-sekundersgränsen — en viktig uppgift vid utveckling av Notification Service Extension. Om tillägget inte slutför bearbetningen anropar systemet serviceExtensionTimeWillExpire och visar det ursprungliga innehållet. Reservscenarier måste förberedas för varje typ av bearbetning.
Dela upp uppgifter efter prioritet. Kritiska ändringar (dekryptering, grundläggande lokalisering) utförs först. Valfria förbättringar (bildnedladdning, textberikning) — i andra hand. Använd URLSession med timeouter för nätverksförfrågningar för att inte förbruka hela gränsen på en enda operation.
Om nedladdningen av en bild misslyckas eller dekrypteringen av payload returnerar ett fel, bör tillägget anropa contentHandler med det ursprungliga innehållet. Avsluta aldrig tillägget utan att anropa contentHandler — detta leder till förlorad notifiering. Säker reserv bör alltid finnas i tilläggets kod.
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// Kritisk uppgift: dekryptering
var decryptedContent = tryDecryptPayload(content)
// Valfri uppgift: media
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
För att testa Notification Service Extension använder du Xcode: välj tilläggets target, kör på simulatorn och skicka en push-notifiering via terminalen eller Firebase Console. Logga varje bearbetningssteg via os_log — detta hjälper till att diagnostisera tids- och laddningsfel.
Vanliga frågor
Systemet anropar serviceExtensionTimeWillExpire och visar sedan den ursprungliga notifieringen utan ändringar. Alla nedladdade filer och ändringar kasseras.
Ja, om du anropar contentHandler med tomt innehåll (UNNotificationContent med tomma fält) kommer notifieringen inte att visas. Detta används för att filtrera spam-notifieringar eller felaktiga data.
Token kan skickas i notifieringens payload userInfo eller hämtas från Keychain via App Group. Det rekommenderas inte att lagra tokens i tilläggets UserDefaults.
Tillägget måste signeras med samma utvecklarcertifikat som huvudappen. För produktion krävs produktionscertifikat med aktiverad Push Notifications-capability.
Anslut enheten till Xcode, välj tilläggets target i startschemat och skicka en push-notifiering via Firebase Console. Breakpoints i tillägget fungerar precis som i huvudappen.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också