Notification Service Extension — hur meddelandebearbetning fungerar

Författare: IT Sectr Publicerad: 2026-06-16 Lästid: 9 min

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 ändrar push-meddelandet innan det visas för användaren på iOS-enheten
  • För att aktivera tillägget krävs parametern mutable-content:1 i meddelandets payload från servern
  • Huvudprotokollet — UNNotificationServiceExtension med metoderna didReceive(_:withContentHandler:) och serviceExtensionTimeWillExpire()
  • Tillägget kan ladda ner mediabilagor från nätverket och bifoga dem till meddelandet via UNNotificationAttachment
  • Exekveringstiden är begränsad — systemet tilldelar cirka 30 sekunder för fullständig bearbetning av ett meddelande

Vad är Notification Service Extension

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.

Bearbeta push-meddelanden i farten

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.

Typiska användningsscenarier

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.

Ändra text och rubrik

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.

swift
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)
    }
}

Protokollet UNNotificationServiceExtension

UNNotificationServiceExtension — basklassen som Service Extension ärver från. Klassen definierar två livscykelmetoder: didReceive(_:withContentHandler:) — den huvudsakliga bearbetningsmetoden, och serviceExtensionTimeWillExpire() — hanteraren för tidsutgång.

Metoden didReceive:withContentHandler:

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.

Metoden serviceExtensionTimeWillExpire:

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.

Kryptering och mediabilagor

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.

Skapa en bilaga från en nedladdad fil

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.

Dekryptering av krypterad payload

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.

swift
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()
}

Timeout och fallback-mekanismer

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.

Graceful degradation-strategi

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.

Prestandaövervakning

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.

swift
override func serviceExtensionTimeWillExpire() {
    let fallback = bestEffortContent as?
        UNMutableNotificationContent
        ?? request.content.mutableCopy()
        as! UNMutableNotificationContent
    contentHandler(fallback)
}

Vanliga frågor

Hur aktiverar servern Notification Service Extension?

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.

Kan tillägget användas utan mutable-content?

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.

Vad händer när 30-sekundersgränsen överskrids?

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.

Hur skickar man krypteringsnycklar till tillägget?

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.

Hur många mediafiler kan bifogas i Service Extension?

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

  • Notification Service Extension ändrar push-meddelanden på enheten före visning, redigerar text, rubrik och mediabilagor
  • För aktivering krävs nyckeln mutable-content:1 i aps-ordboken — utan den startar inte tillägget
  • Huvudprotokollet UNNotificationServiceExtension definierar metoderna didReceive och serviceExtensionTimeWillExpire för bearbetning
  • Tillägget kan ladda ner media från nätverket, dekryptera payload och lägga till upp till 4 bilagor till meddelandet
  • Exekveringstiden är begränsad till cirka 30 sekunder — vid överskridande visar iOS det ursprungliga meddelandet
  • En graceful degradation-strategi med flernivå-fallback rekommenderas för att förhindra tomma meddelanden

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.

Diskutera projektet

Läs också