Notification Service Extension är ett iOS-tillägg som fångar upp push-meddelandet omedelbart efter mottagning, men innan det visas för användaren. Tillägget kan dekryptera krypterad payload, ladda ner och bifoga en mediafil, ändra texten eller rubriken på meddelandet i realtid. Enligt Apple Developer Documentation (2025) måste servern skicka nyckeln mutable-content:1 i meddelandets attribut för att aktivera tillägget — detta är det enda villkoret för att starta UNNotificationServiceExtension.
Huvudpunkter
Notification Service Extension är ett apptillägg i iOS som fångar upp inkommande push-meddelanden på enhetssidan och gör det möjligt att ändra innehållet innan användaren ser det. Detta är den enda typen av meddelandetillägg som arbetar med innehåll, inte med visning.
Huvudskillnaden från Notification Content Extension: Service Extension fungerar före visningen av meddelandet och kan ändra rubrik, brödtext, ljudfil och bilagor. Content Extension fungerar efter visningen och hanterar endast den visuella presentationen av det färdiga meddelandet. Dessa två tillägg kan samarbeta: Service Extension laddar ner en bild och Content Extension visar den i ett anpassat gränssnitt.
Tillägget aktiveras automatiskt vid mottagning av ett push-meddelande med attributet mutable-content:1 i aps-ordboken. iOS startar tillägget i bakgrunden, skickar den ursprungliga UNNotificationRequest till det och väntar på den modifierade versionen för visning.
UNNotificationServiceExtension tar emot den fullständiga UNNotificationRequest med ursprungligt innehåll. Tillägget kan modifiera alla fält i UNNotificationContent: title, subtitle, body, userInfo, attachments och sound. Ändringarna tillämpas innan meddelandet visas.
Dekryptering av innehåll — om push-meddelandet innehåller krypterad payload dekrypterar tillägget den före visning. Nedladdning av media — bifoga en bild eller video till meddelandet. Lokalisering — anpassa meddelandetexten till enhetens regionala inställningar. Dataanrikning — lägga till ytterligare information från lokal lagring eller cache.
Enligt Apple är det vanligaste scenariot bland appar nedladdning av bilder för rika mediameddelanden. Servern skickar bildens URL i payload, tillägget laddar ner den till en temporär katalog och skapar UNNotificationAttachment som systemet visar i standard- eller anpassat gränssnitt.
Tillägget kan helt skriva om meddelandets text, ersätta rubriken eller lägga till en subtitle. Till exempel kan en meddelandeapp ta emot ett krypterat meddelande, dekryptera det i tillägget och visa läsbar text. Eller en nyhetsapp kan lägga till nyhetskategorin i underrubriken före visning.
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
let content = request.content.mutableCopy()
as! UNMutableNotificationContent
if let imageURL = content.userInfo["media-url"]
as? String {
downloadAndAttach(imageURL: imageURL,
content: content,
handler: contentHandler)
}
}
UNNotificationServiceExtension — basklassen som Service Extension ärver från. Klassen definierar två livscykelmetoder: didReceive(_:withContentHandler:) — den huvudsakliga bearbetningsmetoden, och serviceExtensionTimeWillExpire() — hanteraren för tidsutgång.
didReceive(_:withContentHandler:) anropas vid mottagning av ett meddelande. Tillägget tar emot UNNotificationRequest och en contentHandler-closure som måste anropas med det modifierade UNMutableNotificationContent. Tillägget är skyldigt att anropa contentHandler — om detta inte görs kommer iOS att visa det ursprungliga meddelandet efter timeout.
Viktigt: tillägget kan endast bearbeta ett meddelande åt gången. Om flera meddelanden anländer samtidigt skapar iOS separata instanser av tillägget för varje. Globalt tillstånd kan inte användas för sekventiell bearbetning.
serviceExtensionTimeWillExpire() anropas av systemet när den återstående exekveringstiden närmar sig sitt slut. I denna metod måste contentHandler omedelbart anropas med det innehåll som är redo för tillfället — även om mediafilen ännu inte har laddats ner. Om contentHandler inte anropas i denna metod kommer iOS att visa det ursprungliga meddelandet.
Det rekommenderas att i denna metod spara minimalt acceptabelt innehåll — till exempel ett meddelande med text och rubrik, men utan den bild vars nedladdning inte slutfördes i tid.
UNNotificationAttachment — ett objekt som skapas av tillägget för att bifoga en mediafil till meddelandet. Tillägget laddar ner filen från nätverket, sparar den i en temporär katalog och skapar UNNotificationAttachment med angivelse av innehållstyp.
UNNotificationAttachment skapas med hjälp av initieraren init(identifier:url:options:). URL måste peka på en lokal fil i den temporära katalogen som är tillgänglig för tillägget. Efter skapandet läggs bilagan till i attachments-arrayen för UNMutableNotificationContent.
Apple rekommenderar användning av URLSession med bakgrundskonfiguration för nedladdning — vid användning av standard URLSession blockerar nedladdningen tråden och förbrukar tid från 30-sekundersgränsen. URLSession i bakgrunden fortsätter nedladdningen även efter att tillägget har avslutats, och resultatet kan användas vid nästa start.
Om servern skickar ett krypterat meddelande måste tillägget dekryptera payload innan det anropar contentHandler. Dekryptering innebär vanligtvis att begära en nyckel från Keychain eller App Group, dekryptera via CommonCrypto och ersätta meddelandets body eller userInfo. Vid dekrypteringsfel bör contentHandler anropas med det ursprungliga innehållet — så att användaren åtminstone ser att meddelandet har anlänt, även om det är oläsligt.
func downloadAndAttach(
imageURL: String,
content: UNMutableNotificationContent,
handler: @escaping (UNNotificationContent) -> Void
) {
let task = URLSession.shared.dataTask(with:
URL(string: imageURL)!) { data, _, _ in
let url = FileManager.default
.temporaryDirectory
.appendingPathComponent("image.jpg")
try? data?.write(to: url)
let attachment = try? UNNotificationAttachment(
identifier: "image", url: url)
content.attachments = [attachment].compactMap { $0 }
handler(content)
}
task.resume()
}
Notification Service Extension arbetar inom strikta tidsramar. iOS tilldelar en fast exekveringstid — cirka 30 sekunder från aktiveringsögonblicket. Om tillägget inte anropar contentHandler inom denna tid avslutar systemet processen tvångsmässigt och visar det ursprungliga meddelandet utan ändringar.
Det rekommenderas att implementera en flernivå-fallback: försök först ladda ner media, vid framgång — anropa contentHandler med fullt innehåll; vid misslyckande — anropa contentHandler med text men utan media; vid kritiskt fel — skicka ursprungligt innehåll. Detta tillvägagångssätt garanterar att användaren alltid ser ett meddelande, inte en tom skärm.
Enligt Apple är den vanligaste orsaken till timeout nedladdning av stora mediafiler vid långsam anslutning. För att minska risken rekommenderas att optimera bildstorleken på servern — skicka förhandsvisningar upp till 300 KB istället för full upplösning. Bilder i full upplösning bör laddas ner när appen öppnas.
För att spåra timeout och tilläggsfel kan os_log användas för att skriva diagnostiska meddelanden till Unified Logging System. Även om direkt loggning till fil i tillägget är svårt, möjliggör os_log prestandaanalys via Console.app på utvecklarenheten. Apple rekommenderar att lägga till mätvärden vid varje didReceive-anrop — nedladdningstid, filstorlek, operationsresultat.
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
Vanliga frågor
Servern lägger till nyckeln mutable-content:1 i aps-ordboken för push-meddelandet. Utan denna parameter ignorerar systemet tillägget och visar standardmeddelandet.
Nej. mutable-content:1 är ett obligatoriskt villkor för aktivering av Service Extension. Om nyckeln saknas eller är inställd på 0 visas meddelandet utan att tillägget anropas.
iOS avslutar tillägget tvångsmässigt och visar det ursprungliga meddelandet utan ändringar. För att undvika detta, implementera serviceExtensionTimeWillExpire() med minimalt acceptabelt innehåll.
Via App Group (delad UserDefaults eller fil) eller Keychain med delad åtkomst mellan appen och tillägget. Direkt överföring av nycklar i meddelandets payload är osäkert.
Upp till 4 bilagor per meddelande, varje upp till 50 MB. Den totala storleken på bilagorna påverkar nedladdningstiden — ju fler filer, desto högre risk för timeout.
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å