Notification Service Extension egy iOS-bővítmény, amely közvetlenül a fogadás után, de a felhasználónak való megjelenítés előtt elfogja a push értesítést. A bővítmény visszafejtheti a titkosított payload-ot, letölthet és csatolhat médiafájlt, megváltoztathatja az értesítés szövegét vagy címét valós időben. Az Apple Developer Documentation (2025) szerint a bővítmény aktiválásához a szervernek el kell küldenie a mutable-content:1 kulcsot az értesítés attribútumaiban — ez az egyetlen feltétele a UNNotificationServiceExtension elindításának.
Főbb pontok
Notification Service Extension egy alkalmazásbővítmény iOS-ben, amely az eszköz oldalán elfogja a bejövő push értesítést, és lehetővé teszi a tartalmának módosítását, mielőtt a felhasználó meglátná. Ez az egyetlen értesítésbővítmény-típus, amely a tartalommal dolgozik, nem a megjelenítéssel.
A Notification Content Extension-től való fő különbség: a Service Extension az értesítés megjelenítése előtt működik, és módosíthatja a címet, a törzsszöveget, a hangfájlt és a mellékleteket. A Content Extension a megjelenítés után működik, és csak a kész értesítés vizuális megjelenítését kezeli. Ez a két bővítmény együtt is működhet: a Service Extension letölti a képet, a Content Extension pedig megjeleníti azt egy egyéni felületen.
A bővítmény automatikusan aktiválódik, amikor olyan push értesítés érkezik, amelynek aps szótárában szerepel a mutable-content:1 attribútum. Az iOS elindítja a bővítményt a háttérben, átadja neki az eredeti UNNotificationRequest-et, és várja a módosított verziót a megjelenítéshez.
UNNotificationServiceExtension megkapja a teljes UNNotificationRequest-et az eredeti tartalommal. A bővítmény módosíthatja a UNNotificationContent bármely mezőjét: title, subtitle, body, userInfo, attachments és sound. A módosítások az értesítés megjelenítése előtt érvényesülnek.
Tartalom visszafejtése — ha a push értesítés titkosított payload-ot tartalmaz, a bővítmény visszafejti azt a megjelenítés előtt. Média letöltése — kép vagy videó csatolása az értesítéshez. Lokalizáció — az értesítés szövegének hozzáigazítása az eszköz regionális beállításaihoz. Adatok gazdagítása — további információk hozzáadása a helyi tárhelyről vagy gyorsítótárból.
Az Apple szerint az alkalmazások körében a leggyakoribb forgatókönyv a képek letöltése a gazdag média értesítésekhez. A szerver elküldi a kép URL-jét a payload-ban, a bővítmény letölti azt egy ideiglenes könyvtárba, és létrehozza a UNNotificationAttachment-et, amelyet a rendszer a szabványos vagy egyéni felületen jelenít meg.
A bővítmény teljesen átírhatja az értesítés szövegét, lecserélheti a címet, vagy alcímet adhat hozzá. Például egy üzenetküldő alkalmazás kaphat egy titkosított értesítést, visszafejtheti azt a bővítményben, és olvasható szöveget jeleníthet meg. Vagy egy híralkalmazás hozzáadhatja a hír kategóriáját az alcímhez a megjelenítés előtt.
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)
}
}
UNNotificationServiceExtension — a bázisosztály, amelyből a Service Extension származik. Az osztály két életciklus-metódust határoz meg: didReceive(_:withContentHandler:) — a fő feldolgozási metódus, és serviceExtensionTimeWillExpire() — az idő lejártának kezelője.
didReceive(_:withContentHandler:) az értesítés fogadásakor hívódik meg. A bővítmény megkapja a UNNotificationRequest-et és a contentHandler closure-t, amelyet a módosított UNMutableNotificationContent-tel kell meghívni. A bővítmény köteles meghívni a contentHandler-t — ha ezt nem teszi meg, az iOS az időtúllépés után az eredeti értesítést jeleníti meg.
Fontos: a bővítmény egyszerre csak egy értesítést képes feldolgozni. Ha egyszerre több értesítés érkezik, az iOS külön példányokat hoz létre a bővítményből mindegyikhez. Globális állapot nem használható a szekvenciális feldolgozáshoz.
serviceExtensionTimeWillExpire() a rendszer által hívódik meg, amikor a hátralévő végrehajtási idő a végéhez közeledik. Ebben a metódusban azonnal meg kell hívni a contentHandler-t azzal a tartalommal, amely éppen készen áll — még akkor is, ha a médiafájl még nem töltődött le. Ha a contentHandler nem hívódik meg ebben a metódusban, az iOS az eredeti értesítést fogja megjeleníteni.
Javasolt ebben a metódusban minimálisan elfogadható tartalmat tárolni — például egy értesítést szöveggel és címmel, de a kép nélkül, amelynek letöltése nem fejeződött be időben.
UNNotificationAttachment — egy objektum, amelyet a bővítmény hoz létre médiafájl értesítéshez csatolásához. A bővítmény letölti a fájlt a hálózatról, elmenti egy ideiglenes könyvtárba, és létrehozza a UNNotificationAttachment-et a tartalom típusának megadásával.
A UNNotificationAttachment a init(identifier:url:options:) inicializáló segítségével jön létre. Az URL-nek egy helyi fájlra kell mutatnia a bővítmény számára elérhető ideiglenes könyvtárban. A létrehozás után a melléklet hozzáadódik a UNMutableNotificationContent attachments tömbjéhez.
Az Apple a URLSession használatát ajánlja háttérkonfigurációval a letöltéshez — a szabványos URLSession használatakor a letöltés blokkolja a szálat és időt fogyaszt a 30 másodperces korlátból. A háttérben futó URLSession folytatja a letöltést még a bővítmény befejezése után is, és az eredmény a következő indításkor felhasználható.
Ha a szerver titkosított értesítést küld, a bővítménynek vissza kell fejtenie a payload-ot a contentHandler meghívása előtt. A visszafejtés általában magában foglalja a kulcs lekérését a Keychain-ből vagy App Group-ból, a visszafejtést CommonCrypto segítségével, és az értesítés body vagy userInfo mezőjének cseréjét. Visszafejtési hiba esetén a contentHandler-t az eredeti tartalommal kell meghívni — hogy a felhasználó legalább lássa, hogy az értesítés megérkezett, még ha olvashatatlan is.
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()
}
Notification Service Extension szigorú időkeretek között működik. Az iOS rögzített végrehajtási időt biztosít — körülbelül 30 másodpercet az aktiválás pillanatától. Ha a bővítmény nem hívja meg a contentHandler-t ezen idő alatt, a rendszer kényszerítve befejezi a folyamatot, és az eredeti értesítést jeleníti meg változtatások nélkül.
Javasolt többszintű fallback alkalmazása: először próbálja meg letölteni a médiát, siker esetén — hívja meg a contentHandler-t teljes tartalommal; sikertelenség esetén — hívja meg a contentHandler-t szöveggel, de média nélkül; kritikus hiba esetén — adja át az eredeti tartalmat. Ez a megközelítés garantálja, hogy a felhasználó mindig értesítést lát, ne üres képernyőt.
Az Apple szerint az időtúllépések leggyakoribb oka a nagy médiafájlok letöltése lassú kapcsolat esetén. A kockázat csökkentése érdekében javasolt a képek méretének optimalizálása a szerveren — előnézetek küldése 300 KB-ig a teljes felbontás helyett. A teljes felbontású képeket érdemes az alkalmazás megnyitásakor letölteni.
Az időtúllépések és bővítményhibák nyomon követéséhez használható az os_log diagnosztikai üzenetek írásához a Unified Logging System-be. Bár a közvetlen fájlba naplózás a bővítményben nehézkes, az os_log lehetővé teszi a teljesítmény elemzését a Console.app-on keresztül a fejlesztői eszközön. Az Apple javasolja mérőszámok hozzáadását minden didReceive híváshoz — letöltési idő, fájlméret, művelet eredménye.
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
Gyakran ismételt kérdések
A szerver hozzáadja a mutable-content:1 kulcsot a push értesítés aps szótárához. E paraméter nélkül a rendszer figyelmen kívül hagyja a bővítményt, és a szabványos értesítést jeleníti meg.
Nem. A mutable-content:1 kötelező feltétele a Service Extension aktiválásának. Ha a kulcs hiányzik vagy 0-ra van állítva, az értesítés a bővítmény meghívása nélkül jelenik meg.
Az iOS kényszerítve befejezi a bővítményt, és az eredeti értesítést jeleníti meg változtatások nélkül. Ennek elkerüléséhez implementálja a serviceExtensionTimeWillExpire() metódust minimálisan elfogadható tartalommal.
App Group (megosztott UserDefaults vagy fájl) vagy Keychain segítségével, megosztott hozzáféréssel az alkalmazás és a bővítmény között. A kulcsok közvetlen átadása az értesítés payload-jában nem biztonságos.
Legfeljebb 4 melléklet értesítésenként, mindegyik legfeljebb 50 MB. A mellékletek teljes mérete befolyásolja a letöltési időt — minél több fájl, annál nagyobb az időtúllépés kockázata.
Összefoglaló
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