Notification Service Extension: bearbetning av innehåll före visning i iOS

Författare: IT Sectr Publicerad: 2026-03-21 Lästid: 8 min

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 — iOS-tillägg för att bearbeta push-notifieringar innan de visas.
  • Tillägget ärver från UNNotificationServiceExtension och implementerar metoden didReceive.
  • Upp till 30 sekunders bakgrundskörning tillgängligt för att ladda ner och bearbeta data.
  • Huvudscenarier: dekryptering av payload, nedladdning av bilder och videor, validering av innehåll.
  • Tillägget kan försena visningen av notifieringen eller helt avbryta den via contentHandler.

Vad är Notification Service Extension

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.

Hur det fungerar

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.

När ska man använda Service Extension

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.

ScenarioUtan tilläggMed tillägg
BildStöds inteLaddas ner och visas
KrypteringServern behåller nyckelnDekryptering på enheten
TextFast inställd på servernDynamisk ersättning
ValideringKontrolleras inteAvbrytning av skadliga notifieringar

Begränsningar och körtid

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.

Skapa tillägget och konfigurera Info.plist

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.

Lägga till target i projektet

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-struktur för tillägget

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.

Exempel på ett grundläggande tillägg

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.

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

Dekryptera krypterad payload

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.

Arkitektur för säker leverans

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.

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

Säker lagring av nycklar

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.

Ladda ner och bifoga media

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.

Process för nedladdning och bifogning av media

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.

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

Mediaformat som stöds

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.

Tidshantering och reservscenarier

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.

Prioriteringsstrategi

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.

Reservscenarier vid fel

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.

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

Testa tillägget

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

Vad händer om tillägget inte hinner på 30 sekunder?

Systemet anropar serviceExtensionTimeWillExpire och visar sedan den ursprungliga notifieringen utan ändringar. Alla nedladdade filer och ändringar kasseras.

Kan visningen av notifieringen avbrytas från tillägget?

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.

Hur skickar jag en auktoriseringstoken för nedladdning av media?

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.

Krävs speciell certifikatkonfiguration för tillägget?

Tillägget måste signeras med samma utvecklarcertifikat som huvudappen. För produktion krävs produktionscertifikat med aktiverad Push Notifications-capability.

Hur felsöker jag tillägget på en riktig enhet?

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

  • Notification Service Extension — iOS-tillägg för bakgrundsbearbetning av push-notifieringar innan visning.
  • Maximal körtid — 30 sekunder, därefter visar systemet det ursprungliga innehållet.
  • Huvudsakliga användningar: payload-dekryptering, mediadedladdning, validering och lokalisering av innehåll.
  • Tillägget ärver från UNNotificationServiceExtension med metoderna didReceive och serviceExtensionTimeWillExpire.
  • Använd URLSession för mediadedladdning, iOS Keychain för nyckellagring.
  • Förbered alltid en reserv — anropa contentHandler med ursprungligt innehåll vid fel.
  • Kombinera Service Extension med Content Extension för fullständig kontroll över notifieringar.

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å