Notification Service Extension: tartalom feldolgozása megjelenítés előtt iOS-en

Szerző: IT Sectr Megjelenés: 2026-03-21 Olvasási idő: 8 perc

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 — iOS bővítmény a push értesítés megjelenítés előtti feldolgozására.
  • A bővítmény az UNNotificationServiceExtension-ből származik és megvalósítja a didReceive metódust.
  • Akár 30 másodperc háttérvégrehajtás érhető el az adatok letöltéséhez és feldolgozásához.
  • Fő forgatókönyvek: payload visszafejtése, képek és videók letöltése, tartalom érvényesítése.
  • A bővítmény késleltetheti az értesítés megjelenítését, vagy teljesen megszakíthatja azt a contentHandler segítségével.

Mi az a Notification Service Extension

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.

Hogyan működik

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.

Mikor használjuk a Service Extension-t

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önyvBővítmény nélkülBővítménnyel
KépNem támogatottLetöltődik és megjelenik
TitkosításSzerver tárolja a kulcsotVisszafejtés az eszközön
SzövegRögzítve a szerverenDinamikus csere
ÉrvényesítésNincs ellenőrizveKáros értesítések megszakítása

Korlátozások és végrehajtási idő

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.

Bővítmény létrehozása és Info.plist beállítása

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.

Target hozzáadása a projekthez

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 struktúrája

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.

Példa alap bővítményre

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.

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

Titkosított payload visszafejtése

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 biztonságos kézbesítés architektúrája

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.

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

Kulcsok biztonságos tárolása

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.

Média mellékletek letöltése és csatolása

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 média letöltésének és csatolásának folyamata

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.

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

Támogatott médiaformátumok

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.

Időkezelés és tartalék forgatókönyvek

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.

Prioritási stratégia

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.

Tartalék forgatókönyvek hibáknál

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.

swift
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 bővítmény tesztelése

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

Mi történik, ha a bővítmény nem fér bele a 30 másodpercbe?

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.

Meg lehet szakítani az értesítés megjelenítését a bővítményből?

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.

Hogyan továbbítható az autorizációs token média letöltéséhez?

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.

Szükséges speciális tanúsítvány konfiguráció a bővítményhez?

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.

Hogyan lehet hibakeresni a bővítményt valós eszközön?

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ó

  • Notification Service Extension — iOS bővítmény push értesítések háttérben történő feldolgozására megjelenítés előtt.
  • Maximális végrehajtási idő — 30 másodperc, ezután a rendszer az eredeti tartalmat jeleníti meg.
  • Fő alkalmazások: payload visszafejtése, média letöltése, tartalom érvényesítése és lokalizációja.
  • A bővítmény az UNNotificationServiceExtension-ből származik didReceive és serviceExtensionTimeWillExpire metódusokkal.
  • Média letöltéséhez használjon URLSession-t, kulcsok tárolásához iOS Keychain-t.
  • Mindig írjon elő tartalékot — hívja a contentHandlert az eredeti tartalommal hibáknál.
  • Kombinálja a Service Extension-t a Content Extension-nel a teljes értesítéskontrollért.

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.

Projekt megbeszélése

Olvassa el is