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
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.
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.
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.
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 ä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.
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.
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.
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)
}
}
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 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.
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.
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.
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.
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.
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.
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.
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.
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)
}
}
}
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
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.
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.
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.
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.
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
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å