Middle
Co je to rozšíření služby oznámení?
sobes.tech AI
Odpověď od AI
Rozšíření služby oznámení (Notification Service Extension) je malý spustitelný doplněk integrovaný do vaší iOS aplikace. Umožňuje upravit vzhled obsahu vzdáleného push oznámení před jeho zobrazením uživateli.
Hlavní funkce:
- Úprava obsahu: Změna titulku, podtitulku, textu nebo přidání příloh (obrázků, videí) k oznámení.
- Dešifrování šifrovaného obsahu: Dešifrování zašifrovaných dat odeslaných spolu s oznámením před jejich zobrazením uživateli.
- Rozšířená oznámení: Ve spojení s rozšířením obsahu oznámení (Notification Content Extension) umožňuje vytvářet vlastní rozhraní pro zobrazení oznámení.
Životní cyklus:
- Při přijetí vzdáleného oznámení s klíčem
mutable-content: 1systém spustí běh rozšíření služby oznámení. - Implementuje se metoda
didReceive(_:withContentHandler:), ve které dochází ke zpracování a úpravě oznámení. - Upravený obsah je předán do obslužní funkce
contentHandler. - Systém zobrazí upravené oznámení.
Omezení:
- Krátkodobé provádění (obvykle asi 30 sekund).
- Omezený přístup ke systémovým zdrojům.
- Není možné provádět dlouhodobé úlohy na pozadí.
Příklad základní implementace:
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
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Upravte obsah oznámení zde...
bestAttemptContent.title = "\(bestAttemptContent.title ?? "Bez titulu") [upraveno]"
contentHandler(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
// Volá se těsně před tím, než systém ukončí rozšíření.
// Využijte to jako příležitost dodat "nejlepší pokus" o upravený obsah,
// jinak bude doručena původní push payload.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}