Notification Category (kategorie oznámení) je mechanismus iOS pro seskupování push oznámení podle typu a připojení přizpůsobitelných akcí. Kategorie určuje, která tlačítka se zobrazí při 3D Touch nebo dlouhém stisknutí oznámení, a také jak systém zpracovává příchozí oznámení tohoto typu. Podle Apple Developer Documentation je UNNotificationCategory registrován v UNUserNotificationCenter a propojen s oznámením prostřednictvím pole category v APNS payloadu.
Hlavní body
Notification Category je funkce iOS (od verze 8.0), která umožňuje vývojáři klasifikovat push oznámení a přidávat k nim interaktivní akce. Když uživatel obdrží oznámení a silně na něj stiskne (3D Touch) nebo dlouze stiskne, zobrazí se tlačítka definovaná kategorií.
Kategorie se registruje prostřednictvím objektu UNNotificationCategory, který obsahuje identifikátor, pole akcí a volitelné parametry zobrazení. Systém používá identifikátor kategorie z APNS payloadu k nalezení registrováné kategorie a zobrazení odpovídajících akcí.
Na rozdíl od Android Notification Channel, iOS Category nespravuje důležitost, zvuk ani vibraci. Jejím jediným úkolem je poskytnout interaktivní možnosti pro oznámení: tlačítka pro odpověď, potvrzení, zrušení nebo zadání textu.
Kategorie nejsou povinné pro zobrazení push oznámení na iOS. Oznámení se zobrazí v každém případě — s tlačítky, pokud je kategorie registrována, nebo bez nich. Kategorie jsou potřeba pouze pro přidání interaktivity k oznámením.
Mechanismus kategorií se skládá ze čtyř fází: registrace kategorie na klientovi, odeslání APNS payloadu s kategorií, rozpoznání kategorie systémem a zpracování akce uživatele.
Akce v kategorii mohou být dvou typů: foreground (otevírají aplikaci) a background (provádějí se na pozadí). Pro akce na pozadí aplikace získá omezený čas (přibližně 30 sekund) na zpracování v UNNotificationActionHandler.
UNNotificationCategory podporuje několik možností prostřednictvím parametru options: customDismissAction — přijetí události při přejetí oznámení, allowInCarPlay — zobrazení akcí v CarPlay, hiddenPreviewsBodyPlaceholder — vlastní text pro skryté náhledy. Správná konfigurace možností zlepšuje uživatelský zážitek na různých zařízeních Apple.
iOS nabízí dva typy akcí pro kategorie oznámení. Každý typ má svůj vlastní účel a způsob interakce s uživatelem.
| Typ | Třída | Popis | Příklad |
|---|---|---|---|
| Jednoduchá akce | UNNotificationAction | Tlačítko s názvem a možnostmi (destructive, foreground, authenticationRequired) | „Smazat”, „Zobrazit” |
| Zadávání textu | UNTextInputAction | Tlačítko otevírající pole pro zadávání textu s nápovědou | „Odpovědět”, „Komentovat” |
UNTextInputAction — jedinečná schopnost iOS. Při stisknutí tlačítka „Odpovědět" systém zobrazí textové pole, do kterého uživatel zadá odpověď. Zadaný text je předán delegátovi spolu s identifikátorem akce. To umožňuje rychlé odpovědi bez otevírání aplikace.
Možnosti akcí: options.authenticationRequired — vyžaduje odemknutí zařízení, options.destructive — zvýrazní tlačítko červeně (pro nebezpečné akce), options.foreground — otevře aplikaci po stisknutí.
Kategorie se registrují při spuštění aplikace, obvykle v metodě didFinishLaunchingWithOptions. Registrace probíhá prostřednictvím UNUserNotificationCenter po vyžádání oprávnění pro oznámení. Kategorie lze aktualizovat při každém spuštění — staré verze jsou nahrazeny novými.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Odpovědět",
options: [.foreground],
textInputButtonTitle: "Odeslat",
textInputPlaceholder: "Zadejte zprávu..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "Smazat",
options: [.destructive]
)
let messageCategory = UNNotificationCategory(
identifier: "message",
actions: [replyAction, deleteAction],
intentIdentifiers: [],
options: [.customDismissAction]
)
UNUserNotificationCenter.current()
.setNotificationCategories([messageCategory])
}
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
UNUserNotificationCenter.current().delegate = self
registerNotificationCategories()
return true
}
}
Po registraci kategorie každé oznámení s category = „message" v APNS payloadu zobrazí tlačítka „Odpovědět" a „Smazat". Zpracování stisknutí probíhá v userNotificationCenter:didReceive response, kde actionIdentifier určuje, které tlačítko bylo stisknuto.
Když uživatel stiskne tlačítko kategorie, iOS zavolá delegáta UNUserNotificationCenterDelegate s objektem UNNotificationResponse. V response.actionIdentifier je obsažen identifikátor stisknutého tlačítka a v response.notification.request.content.userInfo jsou vlastní data z APNS payloadu. Pro UNTextInputAction je navíc k dispozici response.userText s textem zadaným uživatelem.
Vývojáři obeznámení s Android Notification Channels je často zaměňují s iOS Notification Categories. Navzdory podobnému názvu tyto mechanismy řeší různé úkoly a fungují odlišně.
Na obou platformách lze kombinovat oba mechanismy: v Android může oznámení patřit do kanálu s akcemi z NotificationCompat a v iOS kategorie doplňuje kanály, které se v iOS nazývají thread-id a slouží k seskupování oznámení v centru oznámení.
Aby se oznámení zobrazilo s tlačítky kategorie, musí server zahrnout klíč category do APNS payloadu. Bez tohoto klíče systém nebude vědět, kterou kategorii na oznámení aplikovat.
{
"aps": {
"alert": {
"title": "Nová zpráva",
"body": "Anna: Ahoj! Jak se máš?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
Klíč category musí přesně odpovídat identifikátoru zaregistrovanému prostřednictvím setNotificationCategories na klientovi. Na velikosti písmen záleží — „message" a „Message" jsou považovány za různé kategorie. Pokud kategorie není nalezena, oznámení se zobrazí bez tlačítek, bez chyb v protokolech.
Pokud server odeslal oznámení s category, která není na klientovi registrována, iOS kategorii ignoruje a zobrazí oznámení bez tlačítek. Chyba není protokolována a aplikace se o neshodě nedozví. Doporučuje se synchronizovat seznam kategorií mezi serverem a klientem pomocí konfiguračního souboru a kontrolovat je při každé aktualizaci aplikace.
Při navrhování kategorií oznámení iOS dodržujte zásadu jedna kategorie — jeden scénář. Každá kategorie by měla odpovídat konkrétnímu typu interakce: odpověď na zprávu, potvrzení akce, zamítnutí požadavku. Nemíchejte různé scénáře v jedné kategorii — to uživatele mate a komplikuje zpracování v delegátovi.
Používejte UNTextInputAction pro scénáře, kde uživatel musí zadat text bez otevírání aplikace: odpovědi v messengerech, komentáře, rychlé poznámky. Textové akce zvyšují zapojení — uživatel provádí smysluplnou akci ve 2 klepnutích místo 5+ v otevřené aplikaci.
Pro nebezpečné akce (smazání, blokování) použijte možnost destructive. iOS zvýrazní tato tlačítka červeně, varuje uživatele před nezvratností akce. Pro akce vyžadující odemknutí zařízení (zobrazení osobních údajů) nastavte authenticationRequired — systém před provedením vyžádá Face ID nebo heslo.
Testujte kategorie na různých zařízeních: na iPhone s 3D Touch, na iPhone bez 3D Touch (dlouhé stisknutí), na iPadu a na Macu. Chování kategorií se může na různých platformách Apple mírně lišit. Zvláštní pozornost — CarPlay: tlačítka kategorií se zobrazují na obrazovce auta, ale zadávání textu není k dispozici, proto je UNTextInputAction v CarPlay automaticky skryto. Na watchOS kategorie nejsou podporovány — všechna oznámení se zobrazují bez tlačítek akcí.
Často kladené otázky
Neexistuje žádné omezení — iOS nestanovuje limit na počet UNNotificationCategory. V praxi se však doporučuje nepřekračovat 10–15 kategorií, aby se nekomplikovalo zpracování v delegátovi. Každá kategorie může obsahovat až 4 akce (tlačítka). Více než 4 akce jsou systémem ignorovány.
Implementujte delegáta UNUserNotificationCenterDelegate a metodu didReceive response. Zkontrolujte response.actionIdentifier: UNNotificationDismissActionIdentifier — přejetí smazání, UNNotificationDefaultActionIdentifier — klepnutí na tělo, nebo váš vlastní identifikátor tlačítka. Pro textová tlačítka je text k dispozici prostřednictvím response.userText.
Category — určuje interaktivní akce (tlačítka) pro oznámení. Thread-id — seskupuje oznámení v Centru oznámení podle témat. Oba klíče jsou uvedeny v APNS payloadu. Category a thread-id spolu nesouvisejí: oznámení může mít kategorii bez thread-id a naopak.
Ano, UNNotificationCategory je podporován na macOS 10.14+ (Mojave) v aplikacích používajících framework UserNotifications. Chování kategorií na macOS je podobné jako na iOS: při stisknutí oznámení se zobrazí tlačítka, zpracování probíhá prostřednictvím UNUserNotificationCenterDelegate.
Doporučuje se registrovat kategorie při každém spuštění aplikace prostřednictvím setNotificationCategories. Systém nahrazuje starou sadu kategorií novou při každém volání. Pokud neaktualizujete, kategorie zůstávají mezi spuštěními, ale při změně kódu staré kategorie nemusí odpovídat novým.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také