Notification Extension: nyckelbegrepp, tilläggstyper och konfiguration

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

Notification Extension är en iOS-mekanism som gör det möjligt att ändra innehållet och utseendet på push-meddelanden innan de visas för användaren. Tilläggen fungerar på operativsystemets sida i en separat process: UNNotificationServiceExtension bearbetar inkommande innehåll och UNNotificationContentExtension hanterar gränssnittet. Enligt Apple Developer Documentation, 2026 får Service Extension upp till 30 sekunder på sig att utföra uppgifter innan meddelandet visas. Denna begränsning är kritisk vid laddning av bilagor eller avkodning av data.

Huvudpunkter

  • Service Extension — fångar upp meddelandet före visning, möjliggör ändring av text, tillägg av media och avkodning av data med en gräns på 30 sekunder.
  • Content Extension — skapar ett anpassat meddelandegränssnitt med valfri UI, knappar och tryckhantering via storyboard eller SwiftUI.
  • Media-bilagor — bilder, video och ljud läggs till via UNNotificationAttachment i Service Extension innan de skickas vidare till Content Extension.
  • Registrering — båda tilläggen registreras i Info.plist som separata target med angivande av meddelandekategorier och NSExtensionPointIdentifier.
  • Begränsningar — tilläggen har inte åtkomst till huvudapplikationen, arbetar i en isolerad sandlåda med en minnesgräns på 50 MB.

Vad är Notification Extension

Notification Extension är en programvarukomponent i iOS som utökar standardbeteendet för push-meddelanden genom att lägga till möjligheten att ändra innehåll och anpassa gränssnittet. Till skillnad från vanliga meddelanden som visas av systemet i standardform, tillåter tillägg utvecklaren att påverka innehållet före visning och skapa ett unikt användargränssnitt.

Två typer av meddelandetillägg

Apple tillhandahåller två typer av Notification Extension för olika ändamål: UNNotificationServiceExtension ansvarar för bearbetning av inkommande payload, och UNNotificationContentExtension hanterar visningen. Service Extension startas före visning av meddelandet och har begränsad tid för exekvering — upp till 30 sekunder enligt Apple Developer Documentation. Content Extension aktiveras efter att användaren interagerat med meddelandet och visar en anpassad vy.

Skillnad från standardmeddelanden

Ett standard iOS-pushmeddelande visas automatiskt av systemet baserat på fälten alert, title och subtitle från JSON-payloaden. Notification Extension tar över kontrollen: Service Extension tar emot rå payload, modifierar den och skickar den till systemet för visning. Content Extension ersätter standardbannern med ett valfritt gränssnitt med valfria kontroll element.

Tilläggets livscykel

När enheten tar emot ett push-meddelande med nyckeln mutable-content: 1, startar systemet Service Extension i en separat process. Tilläggets process är isolerad från huvudapplikationen och har en egen sandlåda med en minnesgräns på 50 MB. Efter avslutad bearbetning anropar tillägget completion handlern och skickar det modifierade UNNotificationContent till systemet för visning.

UNNotificationServiceExtension: innehållsändring

UNNotificationServiceExtension är det främsta verktyget för att programmatiskt ändra push-meddelanden innan de visas för användaren. Tillägget aktiveras automatiskt vid mottagning av ett meddelande vars payload har flaggan mutable-content: 1 satt. Inom 30 sekunder kan tillägget ladda en media-bilaga, ändra text, avkoda krypterad data eller berika innehållet.

Metoder i UNNotificationServiceExtension-protokollet

Tillägget implementerar två nyckelmetoder från UNNotificationServiceExtension-protokollet. Metoden didReceive tar emot den inkommande begäran med rå UNNotificationRequest och möjliggör modifiering via completion handler med nytt UNNotificationContent. Metoden serviceExtensionTimeWillExpire anropas av systemet en sekund innan timeout löper ut — här måste bearbetningen slutföras och det aktuella (eventuellt partiella) resultatet skickas vidare.

Exempel: lägga till en bild till meddelandet

Betrakta ett scenario där servern skickar ett push med en bild-URL i ett anpassat fält. Service Extension laddar denna bild över nätverket, skapar en UNNotificationAttachment och lägger till den i innehållet. UNNotificationAttachment accepterar en lokal bild-, video- eller ljudfil och kopierar den automatiskt till tilläggets sandlåda. Efter att bilagan skapats skickar tillägget det uppdaterade innehållet till systemet.

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

Cachning och återanvändning

Vid frekvent sändning av meddelanden med samma bilagor rekommenderas det att cacha nedladdade filer på enheten. FileManager ger åtkomst till tilläggets cachekatalog, som bevaras mellan starter. Detta minskar bearbetningstiden för efterföljande meddelanden och minskar nätverksbelastningen. Enligt Apple kan cachning av bilagor minska bearbetningstiden till 2–5 sekunder istället för full laddning.

UNNotificationContentExtension: anpassat gränssnitt

UNNotificationContentExtension gör det möjligt att ersätta standardmeddelandets banner med ett anpassat gränssnitt skapat i Interface Builder eller SwiftUI. Tillägget aktiveras när användaren utför en åtgärd med meddelandet: tryckning, svep nedåt eller 3D Touch. Content Extension tar emot innehåll som redan bearbetats av Service Extension och visar det i en anpassad vy.

Storyboard och meddelandekategorier

Varje Content Extension är kopplad till en eller flera meddelandekategorier via Info.plist. Kategorin bestäms på servern av fältet category i APNS-payloaden. Systemet väljer automatiskt rätt tillägg baserat på kategorin för det mottagna meddelandet. Gränssnittet byggs via storyboard med standard UIKit-komponenter eller SwiftUI View.

Hantering av användaråtgärder

Content Extension stöder anpassade knappar och tryckhanterare definierade i UNNotificationAction. UNNotificationAction skapas i kategoriregistreringsfasen och kan vara textinmatning via UNTextInputNotificationAction. När användaren trycker på en knapp får tillägget didReceive-callback med åtgärdens identifierare och kan utföra motsvarande logik — öppna en URL, skicka en begäran till servern eller uppdatera gränssnittet.

Prestandabegränsningar

Content Extension arbetar i en isolerad process med egen exekveringscykel och en minnesgräns på cirka 50 MB. Tilläggets prestanda är kritisk eftersom systemets watchdog avslutar processen vid överskridande av gränser. Det rekommenderas att undvika tunga beräkningar, laddning av stora bilder och långa nätverksförfrågningar inuti Content Extension.

Media-bilagor och UNNotificationAttachment

UNNotificationAttachment är ett objekt som lägger till en mediafil till push-meddelandet: bild, video, ljud eller GIF. Bilagan skapas från en lokal fil-URL som måste finnas i tilläggets sandlåda. Bilagans maximala storlek får inte överstiga 10 MB, annars kommer systemet att avvisa bilagan vid skapandet.

Format som stöds

Apple stöder en begränsad uppsättning format för media-bilagor. Bilder — JPEG, PNG, GIF (inklusive animerade), TIFF. Video — MPEG, MP4, MOV med maximal varaktighet på 30 sekunder. Ljud — MP3, AAC, WAV, CAF. För varje format kan typen specificeras via UNNotificationAttachmentOptionsTypeHintKey, vilket hjälper systemet att bearbeta filen korrekt.

Ladda bilaga från nätverket

Eftersom push-payloaden endast innehåller URL:en och inte själva filen, måste laddning av bilagan utföras inuti Service Extension. Maximal laddningstid är begränsad till 30 sekunder, därför rekommenderas det att använda URLSession med minimala inställningar och inaktivera laddning vid svag signal. Om bilagan inte laddas i tid visas meddelandet utan media — detta är systemets standardbeteende.

Implementeringsexempel i Swift

Låt oss titta på ett komplett exempel på Notification Extension som laddar en bild, laddar ner den och lägger till den i meddelandet. NotificationService ärver från UNNotificationServiceExtension och åsidosätter metoden didReceive. Exemplet visar hantering av valfria fält, skapande av bilaga och anrop av completion handler med modifierat innehåll.

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

Konfigurera Info.plist för tillägget

För korrekt funktion av tillägget måste meddelandekategorierna registreras i Info.plist. Nyckeln NSExtensionPointIdentifier ställs in på com.apple.usernotifications.service för Service Extension eller com.apple.usernotifications.content för Content Extension. Kategorierna definieras i AppDelegate när applikationen startas via UNUserNotificationCenter, och tillägget aktiveras endast för meddelanden med motsvarande kategori i payloaden.

Vanliga frågor

Vad är skillnaden mellan Service Extension och Content Extension?

Service Extension ändrar innehållet före visning av meddelandet — lägger till media, ändrar text, avkodar data. Content Extension ersätter meddelandegränssnittet med ett anpassat efter användarens interaktion. Service Extension arbetar före visning, Content Extension — efter.

Hur mycket tid ges för bearbetning i Service Extension?

Systemet tilldelar 30 sekunder för att exekvera kod i didReceive. Om bearbetningen inte slutförs inom denna tid anropas serviceExtensionTimeWillExpire, där det aktuella resultatet måste skickas vidare. Det rekommenderas att hålla sig inom 10–15 sekunder med hänsyn till laddning av bilagor.

Kan SwiftUI användas i Content Extension?

Ja, SwiftUI stöds i Content Extension från och med iOS 16. Vyn slås in i UIHostingController och läggs till i storyboard. På grund av minnesbegränsningar rekommenderas dock att endast använda SwiftUI för enkla gränssnitt med minimalt antal element.

Hur hanterar man fel vid laddning av bilagor?

Vid laddningsfel eller tidsöverskridning, anropa helt enkelt completion handlern med originalinnehållet utan bilaga. Systemet kommer att visa meddelandet i standardform utan media. Logga fel via OSLog för diagnos, men blockera inte visningen av meddelandet.

Vilka är minnesbegränsningarna för Notification Extension?

Tillägget arbetar i en isolerad process med en gräns på cirka 50 MB. Vid överskridande avslutar systemet processen via watchdog. Undvik att ladda stora filer, lagra bilder i minnet och minnesläckor vid arbete med URLSession.

Sammanfattning

  • Notification Extension — iOS-mekanism för att ändra push-meddelanden, inklusive Service Extension (innehåll) och Content Extension (gränssnitt).
  • Service Extension bearbetar payload innan meddelandet visas med en gräns på 30 sekunder, kan lägga till media-bilagor och avkoda data.
  • Content Extension ersätter standardbannern med ett anpassat gränssnitt via UIKit eller SwiftUI med stöd för interaktiva knappar.
  • UNNotificationAttachment lägger till bilder, video och ljud till meddelandet, stöder format som JPEG, PNG, MP4, MP3 och andra.
  • Registrering av tillägg görs via Info.plist med angivande av NSExtensionPointIdentifier och meddelandekategorier för aktivering.
  • Begränsningar — minnesgräns på 50 MB, isolerad sandlåda utan åtkomst till huvudapplikationen, begränsad exekveringstid.
  • Notification Extension är ett nyckelverktyg för att skapa rika användarmeddelanden, vilket ökar engagemanget och funktionaliteten för push-kommunikation i iOS.

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å