Notification Service Extension — egy iOS bővítmény, amely elkápkodja a push értesítést, mielőtt az megjelenne a felhasználónak, és lehetővé teszi a tartalom módosítását. A bővítmény visszafejtheti a titkosított adatokat, letöltheti a média mellékleteket, megváltoztathatja a szöveget, vagy egyéni mezőket adhat hozzá. A Apple Developer, 2025 szerint a Notification Service Extension legfeljebb 30 másodpercet kap a feladat háttérben történő végrehajtására.
Főbb pontok
Notification Service Extension — egy alkalmazásbővítmény iOS-ben, amely a push értesítés megjelenítése előtt indul. Lehetővé teszi, hogy a szerver minimális payloadot küldjön, a bővítmény pedig kiegészítse azt tartalommal: képeket töltsön le, adatokat fejtsen vissza, szöveget cseréljen. A felhasználó a kész, feldolgozott értesítést látja.
Amikor az iOS push értesítést kap, a rendszer ellenőrzi a bővítmény meglétét az alkalmazáshoz. Ha a bővítmény regisztrálva van, az iOS elindítja egy háttérfolyamatban, és átadja az értesítés tartalmát a didReceive(_:withContentHandler:) metóduson keresztül. A bővítmény feldolgozza a tartalmat és meghívja a contentHandlert a módosított tartalommal. Ha a bővítmény nem végez 30 másodpercen belül, a rendszer az eredeti értesítést jeleníti meg.
Service Extension olyan forgatókönyvekben szükséges, ahol az értesítés tartalma eszközön történő feldolgozást igényel. Biztonságos kommunikáció: a szerver titkosított payloadot küld, a bővítmény lokálisan visszafejti. Gazdag média értesítések: a szerver kép URL-t küld, a bővítmény letölti és csatolja. Dinamikus lokalizáció: a bővítmény a szöveget az eszköz nyelvére cseréli.
| Forgatókönyv | Bővítmény nélkül | Bővítménnyel |
|---|---|---|
| Kép | Nem támogatott | Letöltődik és megjelenik |
| Titkosítás | Szerver tárolja a kulcsot | Visszafejtés az eszközön |
| Szöveg | Rögzítve a szerveren | Dinamikus csere |
| Érvényesítés | Nincs ellenőrizve | Káros értesítések megszakítása |
A Notification Service Extension korlátozott környezetben működik. Maximális végrehajtási idő — 30 másodperc. A bővítmény nem fér hozzá az alkalmazás fő tárolójához (kivéve App Group). A bővítmény mérete 50 MB-ra korlátozott. Időtúllépés esetén a rendszer meghívja a contentHandlert az eredeti tartalommal, és minden módosítás elvész.
Az Xcode-ban a Notification Service Extension egy Notification Service Extension típusú új target létrehozásával adható hozzá. Az Xcode generálja a NotificationService osztály sablont, amely az UNNotificationServiceExtension-ből származik, két metódussal: didReceive és serviceExtensionTimeWillExpire.
Az Xcode-ban válassza a File → New → Target → Notification Service Extension lehetőséget. Adja meg a nevet (pl. PushNotificationService) és a Swift nyelvet. Győződjön meg róla, hogy a target hozzá lett adva a fő alkalmazáshoz és megfelelő aláírással rendelkezik. A létrehozás után a NotificationService.swift osztály kerül generálásra az alap implementációval.
A bővítmény Info.plist-je tartalmazza az NSExtension kulcsot az NSExtensionPointIdentifier (com.apple.usernotifications.service) és NSExtensionPrincipalClass (a vezérlő neve) alkulcsokkal. Opcionálisan megadható NSExtensionAttributes a bővítmény aktiválási szabályaival. Ezeket a beállításokat az Xcode automatikusan generálja.
Az alap implementáció felülírja a didReceive-t, módosítja az értesítés tartalmát és meghívja a contentHandlert. Ha a feldolgozás túl sokáig tart, meghívódik a serviceExtensionTimeWillExpire, ahol be kell fejeznie a munkát az aktuális állapottal.
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 = "[Feldolgozva] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
A Service Extension egyik kulcsfontosságú alkalmazása az értesítés tartalmának visszafejtése az eszközön. A szerver titkosított payloadot küld, a bővítmény pedig visszafejti azt a Keychain-ben vagy App Group-ban tárolt kulcs segítségével. Ez garantálja, hogy a tartalom nem érhető el az átvitel során.
A szerver szimmetrikus kulccsal (AES-256) titkosítja az értesítés törzsét. A titkosítási kulcsot előre egyeztetik a kliens és a szerver között. A bővítmény a payload data mezőjében kapja a titkosított karakterláncot, visszafejti és elhelyezi az értesítés mezőiben. A felhasználói kulcs a Keychain-ből szerezhető meg hitelesítés után.
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)
}
A visszafejtési kulcsot nem szabad a bővítmény kódjában vagy NSUserDefaults-ban tárolni. Használja az iOS Keychain-t App Group-on keresztüli hozzáféréssel, hogy mind az alkalmazás, mind a bővítmény olvashassa a kulcsot. A kulcs kliens oldali generálásához használja a Security.framework-ot AES-256-GCM algoritmussal.
A Notification Service Extension leggyakoribb használata — képek, GIF-ek és videók letöltése az értesítésben való megjelenítéshez. A szerver elküldi a médiafájl URL-jét, a bővítmény letölti, elmenti egy ideiglenes könyvtárba, és létrehozza az UNNotificationAttachment-et.
A bővítmény megkapja a kép URL-jét az értesítés payload mezőjéből. Az URLSession segítségével a bővítmény letölti a fájlt egy ideiglenes könyvtárba. A letöltés befejezése után az UNNotificationAttachment létrejön a helyi URL-lel. A melléklet átadódik a módosított tartalomnak. Az iOS automatikusan megjeleníti a képet a szabványos interfészen vagy a Notification Content Extension-ben.
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()
}
Az iOS a következő formátumokat támogatja az értesítésekben való megjelenítéshez: JPEG, PNG, GIF (statikus), MPEG-4 videó 50 MB-ig. Audiofájlokhoz MP3, AAC és ALAC támogatott. Fontos: minden médiafájlt a 30 másodperces határidőn belül kell letölteni. Nagy fájlok esetén szerveroldali vágás vagy progresszív letöltés ajánlott.
A 30 másodperces korlát kezelése — kulcsfontosságú feladat a Notification Service Extension fejlesztésében. Ha a bővítmény nem fejezi be a feldolgozást, a rendszer meghívja a serviceExtensionTimeWillExpire-t és megjeleníti az eredeti tartalmat. Tartalék forgatókönyveket kell előírni minden feldolgozási típushoz.
Ossza meg a feladatokat prioritás szerint. A kritikus módosításokat (visszafejtés, alap lokalizáció) végezze el először. Az opcionális fejlesztéseket (kép letöltés, szövegdúsítás) — második lépésként. Használjon URLSession-t timeoutokkal a hálózati kérésekhez, hogy ne használja fel a teljes korlátot egyetlen műveletre.
Ha a kép letöltése sikertelen vagy a payload visszafejtése hibát ad, a bővítménynek az eredeti tartalommal kell meghívnia a contentHandlert. Soha ne fejezze be a bővítményt a contentHandler meghívása nélkül — ez az értesítés elvesztéséhez vezet. Biztonságos tartalék mindig legyen előírva a bővítmény kódjában.
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// Kritikus feladat: visszafejtés
var decryptedContent = tryDecryptPayload(content)
// Opcionális feladat: média
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
A Notification Service Extension teszteléséhez használja az Xcode-ot: válassza ki a bővítmény targetjét, futtassa a szimulátoron, és küldjön push értesítést terminálon vagy Firebase Console-on keresztül. Naplózza a feldolgozás minden szakaszát os_log segítségével — ez segít diagnosztizálni az időzítési és betöltési hibákat.
Gyakori kérdések
A rendszer meghívja a serviceExtensionTimeWillExpire-t, majd megjeleníti az eredeti értesítést változtatás nélkül. Az összes letöltött fájl és módosítás elvész.
Igen, ha üres tartalommal hívja meg a contentHandlert (üres mezőkkel rendelkező UNNotificationContent), az értesítés nem jelenik meg. Ezt a spam értesítések vagy helytelen adatok szűrésére használják.
A token továbbítható az értesítés payloadjának userInfo-jában, vagy lekérhető a Keychain-ből App Group-on keresztül. A tokenek tárolása a bővítmény UserDefaults-jában nem ajánlott.
A bővítményt ugyanazzal a fejlesztői tanúsítvánnyal kell aláírni, mint a fő alkalmazást. Éles környezethez produkciós tanúsítvány szükséges, bekapcsolt Push Notifications képességgel.
Csatlakoztassa az eszközt az Xcode-hoz, válassza ki a bővítmény targetjét az indítási sémában, és küldjön push értesítést Firebase Console-on keresztül. A Breakpoints a bővítményben ugyanúgy működik, mint a fő alkalmazásban.
Ö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