Notification Category (categoria di notifica) è un meccanismo iOS per raggruppare le notifiche push per tipo e allegare azioni personalizzate. La categoria determina quali pulsanti vengono visualizzati utilizzando 3D Touch o pressione prolungata su una notifica, nonché come il sistema elabora le notifiche in arrivo di questo tipo. Secondo la Documentazione per Sviluppatori Apple, UNNotificationCategory viene registrato in UNUserNotificationCenter e collegato a una notifica tramite il campo category nel payload APNS.
Punti Chiave
Notification Category è una funzionalità iOS (dalla versione 8.0) che consente agli sviluppatori di classificare le notifiche push e aggiungervi azioni interattive. Quando un utente riceve una notifica e preme con forza (3D Touch) o effettua una pressione prolungata, appaiono pulsanti definiti dalla categoria. Questo rende le notifiche interattive e consente agli utenti di agire senza aprire l'app.
Una categoria viene registrata tramite un oggetto UNNotificationCategory, che contiene un identificatore, un array di azioni e parametri di visualizzazione opzionali. Il sistema utilizza l'identificatore di categoria dal payload APNS per trovare la categoria registrata e mostrare i pulsanti corrispondenti.
A differenza di Android Notification Channel, iOS Category non gestisce importanza, suono o vibrazione. Il suo unico scopo è fornire capacità interattive per le notifiche: pulsanti di risposta, conferma, annullamento o inserimento di testo.
Le categorie non sono obbligatorie per visualizzare le notifiche push su iOS. La notifica apparirà comunque — con pulsanti se una categoria è registrata, o senza. Le categorie sono necessarie solo per aggiungere interattività alle notifiche.
Il meccanismo delle categorie si compone di quattro fasi: registrare la categoria sul client, inviare un payload APNS con la categoria, il sistema riconoscere la categoria e gestire l'azione dell'utente.
Le azioni in una categoria possono essere di due tipi: foreground (aprono l'app) e background (vengono eseguite in background). Per le azioni in background, l'app ha tempo limitato (circa 30 secondi) per elaborare in UNNotificationActionHandler.
UNNotificationCategory supporta diverse opzioni tramite il parametro options: customDismissAction — ricevere un evento quando si scorre via la notifica, allowInCarPlay — mostrare azioni in CarPlay, hiddenPreviewsBodyPlaceholder — testo segnaposto personalizzato per anteprime nascoste.
iOS fornisce due tipi di azioni per le categorie di notifica. Ogni tipo ha il proprio scopo e modo di interagire con l'utente.
| Tipo | Classe | Descrizione | Esempio |
|---|---|---|---|
| Azione semplice | UNNotificationAction | Un pulsante con titolo e opzioni (destructive, foreground, authenticationRequired) | “Elimina”, “Vedi” |
| Inserimento testo | UNTextInputAction | Un pulsante che apre un campo di inserimento testo con un segnaposto | “Rispondi”, “Commenta” |
UNTextInputAction è una funzionalità unica di iOS. Quando l'utente tocca il pulsante “Rispondi”, il sistema mostra un campo di testo in cui l'utente digita la sua risposta. Il testo inserito viene passato al delegato insieme all'identificatore dell'azione. Questo consente di implementare risposte rapide senza aprire l'app.
Opzioni azione: options.authenticationRequired — richiede lo sblocco del dispositivo, options.destructive — evidenzia il pulsante in rosso (per azioni pericolose), options.foreground — apre l'app dopo il tocco.
Le categorie vengono registrate all'avvio dell'app, solitamente nel metodo didFinishLaunchingWithOptions. La registrazione avviene tramite UNUserNotificationCenter, dopo aver richiesto il permesso per le notifiche. Le categorie possono essere aggiornate a ogni avvio — le versioni vecchie vengono sostituite con quelle nuove.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Rispondi",
options: [.foreground],
textInputButtonTitle: "Invia",
textInputPlaceholder: "Inserisci messaggio..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "Elimina",
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
}
}
Dopo aver registrato la categoria, qualsiasi notifica con category = “message” nel payload APNS mostrerà i pulsanti “Rispondi” e “Elimina”. La gestione dei tocchi avviene in userNotificationCenter:didReceive response, dove actionIdentifier determina quale pulsante è stato premuto.
Quando l'utente tocca un pulsante di categoria, iOS chiama il UNUserNotificationCenterDelegate con un oggetto UNNotificationResponse. response.actionIdentifier contiene l'identificatore del pulsante toccato, e response.notification.request.content.userInfo contiene i dati personalizzati dal payload.
Gli sviluppatori familiari con i canali di notifica Android spesso li confondono con le categorie di notifica iOS. Nonostante il nome simile, questi meccanismi risolvono compiti diversi e funzionano in modo diverso.
Entrambe le piattaforme possono combinare entrambi i meccanismi: su Android, una notifica può appartenere a un canale con azioni da NotificationCompat, mentre su iOS, una categoria completa i canali, che su iOS sono chiamati thread-id e servono per raggruppare le notifiche nel centro notifiche.
Affinché una notifica venga visualizzata con i pulsanti della categoria, il server deve includere la chiave category nel payload APNS. Senza questa chiave, il sistema non saprà quale categoria applicare alla notifica.
{
"aps": {
"alert": {
"title": "Nuovo messaggio",
"body": "Anna: Ciao! Come stai?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
La chiave category deve corrispondere esattamente all'identificatore registrato tramite setNotificationCategories sul client. Le maiuscole/minuscole sono importanti — “message” e “Message” sono considerate categorie diverse. Se la categoria non viene trovata, la notifica appare senza pulsanti, senza errori nei log.
Se il server invia una notifica con una categoria non registrata sul client, iOS ignora la categoria e mostra la notifica senza pulsanti. L'errore non viene registrato e l'app non viene a conoscenza della mancata corrispondenza. Si consiglia di sincronizzare l'elenco delle categorie tra server e client.
Quando si progettano categorie di notifica in iOS, seguire il principio una categoria — uno scenario. Ogni categoria dovrebbe corrispondere a un tipo specifico di interazione: rispondere a un messaggio, confermare un'azione, rifiutare una richiesta. Non mescolare scenari diversi in una singola categoria.
Utilizzare UNTextInputAction per scenari in cui l'utente deve inserire testo senza aprire l'app: risposte di messaggistica, commenti, note rapide. Le azioni di testo aumentano il coinvolgimento — l'utente esegue un'azione significativa in 2 tocchi invece di 5+ all'interno dell'app.
Per azioni pericolose (elimina, blocca), utilizzare l'opzione destructive. iOS evidenzierà questi pulsanti in rosso, avvisando l'utente dell'irreversibilità dell'azione. Per azioni che richiedono lo sblocco del dispositivo (visualizzazione dati personali), specificare authenticationRequired.
Testare le categorie su diversi dispositivi: su iPhone con 3D Touch, su iPhone senza 3D Touch (pressione prolungata), su iPad e su Mac. Il comportamento delle categorie può variare leggermente tra le piattaforme Apple. Attenzione particolare a CarPlay: i pulsanti delle categorie appaiono sullo schermo dell'auto e dovrebbero essere progettati con testo minimo per la sicurezza del conducente.
Domande frequenti
Non ci sono limiti — iOS non impone un limite al numero di UNNotificationCategory. Tuttavia, in pratica, si consiglia di non utilizzare più di 10–15 categorie per non complicare la gestione nel delegato. Ogni categoria può contenere fino a 4 azioni (pulsanti). Più di 4 azioni vengono ignorate dal sistema.
Implementare il protocollo UNUserNotificationCenterDelegate e il metodo didReceive. Verificare response.actionIdentifier: UNNotificationDismissActionIdentifier — scorrere per chiudere, UNNotificationDefaultActionIdentifier — tocco sul corpo, o il proprio identificatore personalizzato del pulsante. Per i pulsanti di inserimento testo, il testo è disponibile tramite response.userText.
Category — definisce le azioni interattive (pulsanti) per la notifica. Thread-id — raggruppa le notifiche nel Centro Notifiche per argomento. Entrambe le chiavi sono specificate nel payload APNS. Category e thread-id non sono correlati: una notifica può avere una categoria ma non un thread-id, e viceversa.
Sì, UNNotificationCategory è supportato su macOS 10.14+ (Mojave) nelle app che utilizzano il framework UserNotifications. Il comportamento delle categorie su macOS è simile a iOS: cliccando su una notifica, vengono mostrati i pulsanti e la gestione avviene tramite UNUserNotificationCenterDelegate.
Si consiglia di registrare le categorie a ogni avvio dell'app tramite setNotificationCategories. Il sistema sostituisce il vecchio insieme di categorie con quello nuovo a ogni chiamata. Se non si aggiorna, le categorie persistono tra gli avvii, ma quando il codice cambia, le vecchie categorie possono causare comportamenti imprevisti.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche