Notification Service Extension — hogyan működik az értesítések feldolgozása

Szerző: IT Sectr Megjelenés: 2026-06-16 Olvasási idő: 9 perc

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 módosítja a push értesítést, mielőtt az megjelenne a felhasználónak az iOS-eszközön
  • A bővítmény aktiválásához a mutable-content:1 paraméter szükséges az értesítés payload-jában a szervertől
  • A fő protokoll — UNNotificationServiceExtension a didReceive(_:withContentHandler:) és serviceExtensionTimeWillExpire() metódusokkal
  • A bővítmény letölthet média mellékleteket a hálózatról, és UNNotificationAttachment segítségével csatolhatja azokat az értesítéshez
  • A végrehajtási idő korlátozott — a rendszer körülbelül 30 másodpercet biztosít egy értesítés teljes feldolgozására

Mi az a Notification Service Extension

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.

Push értesítések feldolgozása menet közben

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.

Tipikus használati forgatókönyvek

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.

Szöveg és cím módosítása

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.

swift
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 protokoll

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.

A didReceive:withContentHandler: metódus

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.

A serviceExtensionTimeWillExpire: metódus

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.

Titkosítás és média mellékletek

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.

Melléklet létrehozása letöltött fájlból

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ó.

Titkosított payload visszafejtése

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.

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

Időtúllépések és fallback mechanizmusok

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.

Graceful degradation stratégia

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.

Teljesítménymonitorozás

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.

swift
override func serviceExtensionTimeWillExpire() {
    let fallback = bestEffortContent as?
        UNMutableNotificationContent
        ?? request.content.mutableCopy()
        as! UNMutableNotificationContent
    contentHandler(fallback)
}

Gyakran ismételt kérdések

Hogyan aktiválja a szerver a Notification Service Extension-t?

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.

Használható a bővítmény mutable-content nélkül?

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.

Mi történik a 30 másodperces korlát túllépésekor?

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.

Hogyan lehet titkosítási kulcsokat átadni a bővítménynek?

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.

Hány médiafájl csatolható a Service Extension-ben?

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ó

  • Notification Service Extension módosítja a push értesítéseket az eszközön a megjelenítés előtt, szerkesztve a szöveget, címet és média mellékleteket
  • Az aktiváláshoz a mutable-content:1 kulcs szükséges az aps szótárban — enélkül a bővítmény nem indul el
  • A fő protokoll UNNotificationServiceExtension határozza meg a didReceive és serviceExtensionTimeWillExpire metódusokat a feldolgozáshoz
  • A bővítmény letölthet médiát a hálózatról, visszafejtheti a payload-ot, és akár 4 mellékletet is hozzáadhat az értesítéshez
  • A végrehajtási idő körülbelül 30 másodpercre korlátozott — túllépés esetén az iOS az eredeti értesítést jeleníti meg
  • A graceful degradation stratégia többszintű fallback-kel ajánlott az üres értesítések megelőzésére

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