A Notification Extension egy iOS-mechanizmus, amely lehetővé teszi a push-értesítések tartalmának és megjelenésének módosítását a felhasználó számára történő megjelenítés előtt. A bővítmények az operációs rendszer oldalán, külön folyamatban működnek: az UNNotificationServiceExtension a bejövő tartalmat dolgozza fel, az UNNotificationContentExtension pedig az interfészt kezeli. A Apple Developer Documentation, 2026 szerint a Service Extension legfeljebb 30 másodpercet kap a feladatok végrehajtására az értesítés megjelenítése előtt. Ez a korlátozás kritikus a mellékletek betöltésekor vagy az adatok visszafejtésekor.
Főbb pontok
Notification Extension egy iOS szoftverkomponens, amely kiterjeszti a push-értesítések szokásos viselkedését, lehetővé téve a tartalom módosítását és a felület testreszabását. A szokásos értesítésekkel ellentétben, amelyeket a rendszer szabványos formában jelenít meg, a bővítmények lehetővé teszik a fejlesztő számára, hogy befolyásolja a tartalmat a megjelenítés előtt, és egyedi felhasználói felületet hozzon létre.
Az Apple két típusú Notification Extension-t kínál különböző célokra: UNNotificationServiceExtension a bejövő payload feldolgozásáért felelős, az UNNotificationContentExtension pedig a megjelenítést kezeli. A Service Extension az értesítés megjelenítése előtt indul, és az Apple Developer Documentation szerint korlátozott ideje van a végrehajtásra — legfeljebb 30 másodperc. A Content Extension akkor aktiválódik, miután a felhasználó interakcióba lép az értesítéssel, és egyedi nézetet jelenít meg.
A szabványos iOS push-értesítést a rendszer automatikusan jeleníti meg a JSON-payload alert, title és subtitle mezői alapján. Notification Extension átveszi az irányítást: a Service Extension megkapja a nyers payloadot, módosítja azt, és továbbítja a rendszernek megjelenítésre. A Content Extension a szabványos banner-t tetszőleges felületre cseréli bármilyen vezérlőelemmel.
Amikor a készülék push-értesítést kap a mutable-content: 1 kulccsal, a rendszer elindítja a Service Extension-t egy külön folyamatban. A bővítmény folyamata el van szigetelve a fő alkalmazástól, és saját homokozóval rendelkezik 50 MB memóriakorláttal. A feldolgozás befejezése után a bővítmény meghívja a completion handlert, továbbítva a módosított UNNotificationContent-ot a rendszernek megjelenítésre.
UNNotificationServiceExtension a fő eszköz a push-értesítések programozott módosítására, mielőtt azok megjelennének a felhasználónak. A bővítmény automatikusan aktiválódik, amikor olyan értesítés érkezik, amelynek payloadjában a mutable-content: 1 jelző be van állítva. 30 másodpercen belül a bővítmény betölthet egy média-mellékletet, módosíthatja a szöveget, visszafejtheti a titkosított adatokat, vagy gazdagíthatja a tartalmat.
A bővítmény két kulcsfontosságú metódust implementál az UNNotificationServiceExtension protokollból. A didReceive metódus fogadja a bejövő kérést a nyers UNNotificationRequest-tel, és lehetővé teszi annak módosítását a completion handleren keresztül új UNNotificationContent-tel. A serviceExtensionTimeWillExpire metódust a rendszer hívja meg egy másodperccel az időkorlát lejárta előtt — itt be kell fejezni a feldolgozást és továbbítani az aktuális (esetleg részleges) eredményt.
Vegyünk egy forgatókönyvet, amikor a szerver push-t küld egy kép URL-jével egy egyedi mezőben. A Service Extension betölti ezt a képet a hálózaton keresztül, létrehoz egy UNNotificationAttachment-et, és hozzáadja a tartalomhoz. UNNotificationAttachment elfogad egy helyi kép-, videó- vagy hangfájlt, és automatikusan átmásolja a bővítmény homokozójába. A melléklet létrehozása után a bővítmény továbbítja a frissített tartalmat a rendszernek.
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)
}
}
Azonos mellékletekkel történő gyakori értesítésküldés esetén ajánlott a letöltött fájlok gyorsítótárazása a készüléken. FileManager hozzáférést biztosít a bővítmény gyorsítótár-könyvtárához, amely megmarad az indítások között. Ez csökkenti a későbbi értesítések feldolgozási idejét és a hálózati terhelést. Az Apple szerint a mellékletek gyorsítótárazása 2–5 másodpercre csökkentheti a feldolgozási időt a teljes betöltés helyett.
UNNotificationContentExtension lehetővé teszi az értesítés szabványos bannerének lecserélését egy Interface Builder-ben vagy SwiftUI-ben létrehozott egyedi felületre. A bővítmény akkor aktiválódik, amikor a felhasználó műveletet hajt végre az értesítéssel: érintés, lefelé húzás vagy 3D Touch. A Content Extension megkapja a Service Extension által már feldolgozott tartalmat, és egy egyedi nézetben jeleníti meg.
Minden Content Extension egy vagy több értesítési kategóriához van kötve az Info.plisten keresztül. A kategóriát a szerver határozza meg az APNS payload category mezőjével. A rendszer automatikusan kiválasztja a megfelelő bővítményt a fogadott értesítés kategóriája alapján. A felület storyboard segítségével épül fel, szabványos UIKit komponensek vagy SwiftUI View használatával.
A Content Extension támogatja az UNNotificationAction-ben definiált egyedi gombokat és érintéskezelőket. UNNotificationAction a kategória regisztrációs szakaszában jön létre, és lehet szövegbevitel az UNTextInputNotificationAction segítségével. Amikor a felhasználó megnyom egy gombot, a bővítmény megkapja a didReceive callback-et a művelet azonosítójával, és végrehajthatja a megfelelő logikát — URL megnyitása, kérés küldése a szervernek vagy a felület frissítése.
A Content Extension izolált folyamatban működik saját végrehajtási ciklussal és körülbelül 50 MB memóriakorláttal. A bővítmény teljesítménye kritikus, mert a rendszer watchdog leállítja a folyamatot a korlátok túllépése esetén. Javasolt elkerülni a nehéz számításokat, nagy képek betöltését és hosszú hálózati kéréseket a Content Extension-en belül.
UNNotificationAttachment egy objektum, amely médiafájlt ad a push-értesítéshez: képet, videót, hangot vagy GIF-et. A melléklet egy helyi fájl URL-ből jön létre, amelynek a bővítmény homokozójában kell lennie. A melléklet maximális mérete nem haladhatja meg a 10 MB-ot, ellenkező esetben a rendszer elutasítja a melléklet létrehozását.
Az Apple korlátozott formátumkészletet támogat a média-mellékletekhez. Képek — JPEG, PNG, GIF (animáltakat is beleértve), TIFF. Videó — MPEG, MP4, MOV legfeljebb 30 másodperc időtartammal. Hang — MP3, AAC, WAV, CAF. Minden formátumhoz megadható a típus az UNNotificationAttachmentOptionsTypeHintKey segítségével, ami segít a rendszernek a fájl helyes feldolgozásában.
Mivel a push payload csak az URL-t tartalmazza, nem magát a fájlt, a melléklet betöltését a Service Extension-en belül kell elvégezni. A maximális betöltési idő 30 másodpercre korlátozott, ezért ajánlott a URLSession használata minimális beállításokkal, és a betöltés letiltása gyenge jel esetén. Ha a melléklet nem töltődött be időben, az értesítés média nélkül jelenik meg — ez a rendszer alapértelmezett viselkedése.
Vizsgáljunk meg egy teljes Notification Extension példát, amely betölt egy képet, letölti és hozzáadja az értesítéshez. NotificationService az UNNotificationServiceExtension-ből származik és felülírja a didReceive metódust. A példa bemutatja az opcionális mezők feldolgozását, a melléklet létrehozását és a completion handler meghívását a módosított tartalommal.
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)
}
}
}
A bővítmény helyes működéséhez regisztrálni kell az értesítési kategóriákat az Info.plist-ben. Az NSExtensionPointIdentifier kulcs beállítása com.apple.usernotifications.service a Service Extension vagy com.apple.usernotifications.content a Content Extension esetében. A kategóriák az AppDelegate-ben kerülnek meghatározásra az alkalmazás indításakor az UNUserNotificationCenter segítségével, és a bővítmény csak a payload-ban megfelelő kategóriával rendelkező értesítéseknél aktiválódik.
Gyakran Ismételt Kérdések
Service Extension módosítja a tartalmat az értesítés megjelenítése előtt — médiát ad hozzá, szöveget változtat, adatokat fejt vissza. A Content Extension az értesítés felületét cseréli egyedire a felhasználói interakció után. A Service Extension a megjelenítés előtt működik, a Content Extension — utána.
A rendszer 30 másodpercet biztosít a kód végrehajtására a didReceive-ben. Ha a feldolgozás nem fejeződik be ez idő alatt, a serviceExtensionTimeWillExpire hívódik meg, ahol át kell adni az aktuális eredményt. Javasolt 10–15 másodpercen belül maradni, figyelembe véve a mellékletek betöltését.
Igen, a SwiftUI támogatott a Content Extension-ben iOS 16-tól kezdve. A View UIHostingController-be van csomagolva és hozzáadva a storyboard-hoz. A memóriakorlátok miatt azonban ajánlott a SwiftUI-t csak egyszerű felületekhez használni minimális számú elemmel.
Betöltési hiba vagy időkorlát túllépése esetén egyszerűen hívja meg a completion handlert az eredeti tartalommal melléklet nélkül. A rendszer megjeleníti az értesítést szabványos formában, média nélkül. Naplózza a hibákat OSLog segítségével diagnosztikai célból, de ne blokkolja az értesítés megjelenítését.
A bővítmény egy izolált folyamatban működik, körülbelül 50 MB korláttal. A korlát túllépése esetén a rendszer watchdog-on keresztül leállítja a folyamatot. Kerülje a nagy fájlok betöltését, képek memóriában tartását és memóriaszivárgásokat a URLSession használata során.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is