Notification Category (categoria de notificări) este un mecanism iOS pentru gruparea notificărilor push după tip și atașarea de acțiuni personalizabile. Categoria determină ce butoane sunt afișate la 3D Touch sau apăsarea lungă pe o notificare, precum și modul în care sistemul procesează notificările primite de acest tip. Conform Apple Developer Documentation, UNNotificationCategory este înregistrat în UNUserNotificationCenter și se leagă de notificare prin câmpul category din payload-ul APNS.
Puncte cheie
Notification Category este o funcție iOS (din versiunea 8.0) care permite dezvoltatorului să clasifice notificările push și să adauge acțiuni interactive. Când utilizatorul primește o notificare și apasă cu forță (3D Touch) sau face o apăsare lungă, apar butoanele definite de categorie.
Categoria se înregistrează prin obiectul UNNotificationCategory, care conține un identificator, un tablou de acțiuni și parametri opționali de afișare. Sistemul folosește identificatorul categoriei din payload-ul APNS pentru a găsi categoria înregistrată și a afișa acțiunile corespunzătoare.
Spre deosebire de Android Notification Channel, iOS Category nu gestionează importanța, sunetul sau vibrația. Singura sa sarcină este să ofere capabilități interactive pentru notificare: butoane de răspuns, confirmare, anulare sau introducere text.
Categoriile nu sunt obligatorii pentru afișarea notificărilor push pe iOS. Notificarea se va afișa în orice caz — cu butoane, dacă categoria este înregistrată, sau fără ele. Categoriile sunt necesare doar pentru a adăuga interactivitate notificărilor.
Mecanismul categoriilor constă în patru etape: înregistrarea categoriei pe client, trimiterea payload-ului APNS cu categoria, recunoașterea categoriei de către sistem și procesarea acțiunii utilizatorului.
Acțiunile din categorie pot fi de două tipuri: foreground (deschid aplicația) și background(se execută în fundal). Pentru acțiunile de fundal, aplicația primește timp limitat (aproximativ 30 de secunde) pentru procesare în UNNotificationActionHandler.
UNNotificationCategory suportă mai multe opțiuni prin parametrul options: customDismissAction — primirea evenimentului la glisarea notificării, allowInCarPlay — afișarea acțiunilor în CarPlay, hiddenPreviewsBodyPlaceholder — text personalizat pentru previzualizări ascunse. Configurarea corectă a opțiunilor îmbunătățește experiența utilizatorului pe diferite dispozitive Apple.
iOS oferă două tipuri de acțiuni pentru categoriile de notificări. Fiecare tip are scopul și modul său de interacțiune cu utilizatorul.
| Tip | Clasă | Descriere | Exemplu |
|---|---|---|---|
| Acțiune simplă | UNNotificationAction | Buton cu titlu și opțiuni (destructive, foreground, authenticationRequired) | „Șterge”, „Vezi” |
| Introducere text | UNTextInputAction | Buton care deschide un câmp de introducere text cu sugestie | „Răspunde”, „Comentează” |
UNTextInputAction — o capacitate unică iOS. La apăsarea butonului „Răspunde”, sistemul afișează un câmp text în care utilizatorul introduce răspunsul. Textul introdus este transmis delegatului împreună cu identificatorul acțiunii. Acest lucru permite răspunsuri rapide fără a deschide aplicația.
Opțiuni ale acțiunilor: options.authenticationRequired — necesită deblocarea dispozitivului, options.destructive — evidențiază butonul cu roșu (pentru acțiuni periculoase), options.foreground — deschide aplicația după apăsare.
Categoriile se înregistrează la pornirea aplicației, de obicei în metoda didFinishLaunchingWithOptions. Înregistrarea are loc prin UNUserNotificationCenter, după solicitarea permisiunii pentru notificări. Categoriile pot fi actualizate la fiecare pornire — versiunile vechi sunt înlocuite cu cele noi.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Răspunde",
options: [.foreground],
textInputButtonTitle: "Trimite",
textInputPlaceholder: "Introduceți mesajul..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "Șterge",
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
}
}
După înregistrarea categoriei, fiecare notificare cu category = „message" în payload-ul APNS va afișa butoanele „Răspunde" și „Șterge". Procesarea apăsărilor are loc în userNotificationCenter:didReceive response, unde actionIdentifier determină ce buton a fost apăsat.
Când utilizatorul apasă un buton al categoriei, iOS apelează delegatul UNUserNotificationCenterDelegate cu obiectul UNNotificationResponse. În response.actionIdentifier se află identificatorul butonului apăsat, iar în response.notification.request.content.userInfo — datele personalizate din payload-ul APNS. Pentru UNTextInputAction, este disponibil suplimentar response.userText cu textul introdus de utilizator.
Dezvoltatorii familiarizați cu Android Notification Channels le confundă adesea cu iOS Notification Categories. În ciuda numelui similar, aceste mecanisme rezolvă sarcini diferite și funcționează în mod diferit.
Pe ambele platforme se pot combina ambele mecanisme: în Android, notificarea poate aparține unui canal cu acțiuni de la NotificationCompat, iar în iOS, categoria completează canalele care în iOS se numesc thread-id și servesc pentru gruparea notificărilor în centrul de notificări.
Pentru ca notificarea să se afișeze cu butoanele categoriei, serverul trebuie să includă cheia category în payload-ul APNS. Fără această cheie, sistemul nu va ști ce categorie să aplice notificării.
{
"aps": {
"alert": {
"title": "Mesaj nou",
"body": "Ana: Salut! Ce faci?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
Cheia category trebuie să coincidă exact cu identificatorul înregistrat prin setNotificationCategories pe client. Literele mari și mici contează — „message" și „Message" sunt considerate categorii diferite. Dacă categoria nu este găsită, notificarea se afișează fără butoane, fără erori în jurnal.
Dacă serverul a trimis o notificare cu o categorie care nu este înregistrată pe client, iOS ignoră categoria și afișează notificarea fără butoane. Eroarea nu este înregistrată, iar aplicația nu află despre nepotrivire. Se recomandă sincronizarea listei de categorii între server și client printr-un fișier de configurare și verificarea acestora la fiecare actualizare a aplicației.
La proiectarea categoriilor de notificări iOS, respectați principiul o categorie — un scenariu. Fiecare categorie trebuie să corespundă unui tip specific de interacțiune: răspuns la mesaj, confirmare acțiune, respingere cerere. Nu amestecați scenarii diferite într-o singură categorie — aceasta derutează utilizatorul și complică procesarea în delegat.
Folosiți UNTextInputAction pentru scenarii în care utilizatorul trebuie să introducă text fără a deschide aplicația: răspunsuri în mesagerie, comentarii, note rapide. Acțiunile text cresc implicarea — utilizatorul efectuează o acțiune semnificativă în 2 atingeri în loc de 5+ în aplicația deschisă.
Pentru acțiuni periculoase (ștergere, blocare) utilizați opțiunea destructive. iOS va evidenția aceste butoane cu roșu, avertizând utilizatorul despre ireversibilitatea acțiunii. Pentru acțiuni care necesită deblocarea dispozitivului (vizualizarea datelor personale), setați authenticationRequired — sistemul va solicita Face ID sau parola înainte de execuție.
Testați categoriile pe diferite dispozitive: pe iPhone cu 3D Touch, pe iPhone fără 3D Touch (apăsare lungă), pe iPad și pe Mac. Comportamentul categoriilor poate diferi ușor pe diferite platforme Apple. Atenție specială — CarPlay: butoanele categoriilor se afișează pe ecranul mașinii, dar introducerea textului nu este disponibilă, prin urmare UNTextInputAction este ascuns automat în CarPlay. Pe watchOS, categoriile nu sunt suportate — toate notificările se afișează fără butoane de acțiuni.
Întrebări frecvente
Nu există limitări — iOS nu stabilește un număr maxim de UNNotificationCategory. Cu toate acestea, în practică se recomandă să nu depășiți 10–15 categorii pentru a nu complica procesarea în delegat. Fiecare categorie poate conține până la 4 acțiuni (butoane). Mai mult de 4 acțiuni sunt ignorate de sistem.
Implementați delegatul UNUserNotificationCenterDelegate și metoda didReceive response. Verificați response.actionIdentifier: UNNotificationDismissActionIdentifier — glisare ștergere, UNNotificationDefaultActionIdentifier — atingere corp, sau propriul identificator personalizat al butonului. Pentru butoanele text, textul este disponibil prin response.userText.
Category — determină acțiunile interactive (butoanele) pentru notificare. Thread-id — grupează notificările în Centrul de Notificări pe subiecte. Ambele chei sunt specificate în payload-ul APNS. Category și thread-id nu sunt legate: o notificare poate avea categorie fără thread-id și invers.
Da, UNNotificationCategory este suportat pe macOS 10.14+ (Mojave) în aplicațiile care folosesc UserNotifications framework. Comportamentul categoriilor pe macOS este similar cu iOS: la apăsarea notificării se afișează butoane, procesarea are loc prin UNUserNotificationCenterDelegate.
Se recomandă înregistrarea categoriilor la fiecare pornire a aplicației prin setNotificationCategories. Sistemul înlocuiește setul vechi de categorii cu cel nou la fiecare apel. Dacă nu actualizați, categoriile se păstrează între porniri, dar la modificarea codului, categoriile vechi pot să nu corespundă cu cele noi.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și