Notification Category (kategoria powiadomień) to mechanizm iOS do grupowania push-ów według typu i przypisywania im konfigurowalnych akcji. Kategoria określa, które przyciski są wyświetlane przy 3D Touch lub długim naciśnięciu powiadomienia, oraz jak system przetwarza przychodzące powiadomienia tego typu. Według Apple Developer Documentation, UNNotificationCategory jest rejestrowany w UNUserNotificationCenter i łączony z powiadomieniem poprzez pole category w APNS-ładunku.
Najważniejsze
Notification Category to funkcja iOS (od wersji 8.0), która pozwala programiście klasyfikować powiadomienia push i dodawać do nich interaktywne akcje. Gdy użytkownik otrzymuje powiadomienie i naciska je z siłą (3D Touch) lub długo przytrzymuje, pojawiają się przyciski określone przez kategorię.
Kategoria jest rejestrowana przez obiekt UNNotificationCategory, który zawiera identyfikator, tablicę akcji i opcjonalne parametry wyświetlania. System używa identyfikatora kategorii z APNS-ładunku do wyszukania zarejestrowanej kategorii i wyświetlenia odpowiednich akcji.
W przeciwieństwie do Android Notification Channel, iOS Category nie zarządza ważnością, dźwiękiem ani wibracją. Jej jedynym zadaniem jest dostarczenie interaktywnych możliwości dla powiadomienia: przycisków odpowiedzi, potwierdzenia, anulowania lub wprowadzania tekstu.
Kategorie nie są obowiązkowe do wyświetlania powiadomień push na iOS. Powiadomienie pojawi się w każdym przypadku — z przyciskami, jeśli kategoria jest zarejestrowana, lub bez nich. Kategorie są potrzebne tylko do dodawania interaktywności do powiadomień.
Mechanizm kategorii składa się z czterech etapów: rejestracja kategorii na kliencie, wysłanie APNS-ładunku z kategorią, rozpoznanie kategorii przez system i przetworzenie akcji użytkownika.
Akcje w kategorii mogą być dwóch typów: foreground (otwierają aplikację) i background(wykonywane w tle). Dla akcji w tle aplikacja otrzymuje ograniczony czas (około 30 sekund) na przetworzenie w UNNotificationActionHandler.
UNNotificationCategory obsługuje kilka opcji przez parametr options: customDismissAction — otrzymywanie zdarzenia przy przesunięciu powiadomienia, allowInCarPlay — wyświetlanie akcji w CarPlay, hiddenPreviewsBodyPlaceholder — niestandardowy tekst dla ukrytych podglądów. Prawidłowa konfiguracja opcji poprawia doświadczenie użytkownika na różnych urządzeniach Apple.
iOS udostępnia dwa typy akcji dla kategorii powiadomień. Każdy typ ma swoje przeznaczenie i sposób interakcji z użytkownikiem.
| Typ | Klasa | Opis | Przykład |
|---|---|---|---|
| Prosta akcja | UNNotificationAction | Przycisk z tytułem i opcjami (destructive, foreground, authenticationRequired) | „Usuń”, „Zobacz” |
| Wprowadzanie tekstu | UNTextInputAction | Przycisk otwierający pole wprowadzania tekstu z podpowiedzią | „Odpowiedz”, „Skomentuj” |
UNTextInputAction — unikalna możliwość iOS. Po naciśnięciu przycisku „Odpowiedz” system wyświetla pole tekstowe, w które użytkownik wprowadza odpowiedź. Wprowadzony tekst jest przekazywany do delegata wraz z identyfikatorem akcji. Pozwala to na szybkie odpowiedzi bez otwierania aplikacji.
Opcje akcji: options.authenticationRequired — wymaga odblokowania urządzenia, options.destructive — wyróżnia przycisk na czerwono (dla niebezpiecznych akcji), options.foreground — otwiera aplikację po naciśnięciu.
Kategorie są rejestrowane przy uruchomieniu aplikacji, zazwyczaj w metodzie didFinishLaunchingWithOptions. Rejestracja odbywa się przez UNUserNotificationCenter po uzyskaniu zgody na powiadomienia. Kategorie można aktualizować przy każdym uruchomieniu — stare wersje są zastępowane nowymi.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Odpowiedz",
options: [.foreground],
textInputButtonTitle: "Wyślij",
textInputPlaceholder: "Wpisz wiadomość..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "Usuń",
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 rejestracji kategorii każde powiadomienie z category = „message” w APNS-ładunku będzie wyświetlać przyciski „Odpowiedz” i „Usuń”. Obsługa naciśnięć odbywa się w userNotificationCenter:didReceive response, gdzie actionIdentifier określa, który przycisk został naciśnięty.
Gdy użytkownik naciśnie przycisk kategorii, iOS wywołuje delegata UNUserNotificationCenterDelegate z obiektem UNNotificationResponse. W response.actionIdentifier znajduje się identyfikator naciśniętego przycisku, a w response.notification.request.content.userInfo — niestandardowe dane z APNS-ładunku. Dla UNTextInputAction dodatkowo dostępny jest response.userText z tekstem wprowadzonym przez użytkownika.
Programiści znający Android Notification Channels często mylą je z iOS Notification Categories. Mimo podobnej nazwy, mechanizmy te rozwiązują różne zadania i działają inaczej.
Na obu platformach można łączyć oba mechanizmy: w Android powiadomienie może należeć do kanału z akcjami z NotificationCompat, a w iOS kategoria uzupełnia kanały, które w iOS nazywane są thread-id i służą do grupowania powiadomień w centrum powiadomień.
Aby powiadomienie wyświetlało przyciski kategorii, serwer musi dołączyć klucz category w APNS-ładunku. Bez tego klucza system nie będzie wiedział, którą kategorię zastosować.
{
"aps": {
"alert": {
"title": "Nowa wiadomość",
"body": "Anna: Cześć! Jak się masz?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
Klucz category musi dokładnie odpowiadać identyfikatorowi zarejestrowanemu przez setNotificationCategories na kliencie. Wielkość liter ma znaczenie — „message” i „Message” są uważane za różne kategorie. Jeśli kategoria nie zostanie znaleziona, powiadomienie pojawi się bez przycisków, bez błędów w logach.
Jeśli serwer wysłał powiadomienie z category, która nie jest zarejestrowana na kliencie, iOS ignoruje kategorię i wyświetla powiadomienie bez przycisków. Błąd nie jest logowany, a aplikacja nie dowiaduje się o niezgodności. Zaleca się synchronizowanie listy kategorii między serwerem a klientem poprzez plik konfiguracyjny i sprawdzanie ich przy każdej aktualizacji aplikacji.
Przy projektowaniu kategorii powiadomień iOS stosuj zasadę jedna kategoria — jeden scenariusz. Każda kategoria powinna odpowiadać konkretnemu typowi interakcji: odpowiedź na wiadomość, potwierdzenie działania, odrzucenie żądania. Nie mieszaj różnych scenariuszy w jednej kategorii — dezorientuje to użytkownika i komplikuje obsługę w delegacie.
Używaj UNTextInputAction do scenariuszy, w których użytkownik musi wprowadzić tekst bez otwierania aplikacji: odpowiedzi w komunikatorach, komentarze, szybkie notatki. Akcje tekstowe zwiększają zaangażowanie — użytkownik wykonuje znaczącą akcję w 2 dotknięcia zamiast 5+ w otwartej aplikacji.
Dla niebezpiecznych akcji (usuwanie, blokowanie) używaj opcji destructive. iOS wyróżni te przyciski na czerwono, ostrzegając użytkownika o nieodwracalności działania. Dla akcji wymagających odblokowania urządzenia (przeglądanie danych osobowych) ustaw authenticationRequired — system poprosi o Face ID lub hasło przed wykonaniem.
Testuj kategorie na różnych urządzeniach: na iPhonie z 3D Touch, na iPhonie bez 3D Touch (długie naciśnięcie), na iPadzie i na Macu. Zachowanie kategorii może się nieznacznie różnić na różnych platformach Apple. Szczególną uwagę zwróć na CarPlay: przyciski kategorii są wyświetlane na ekranie samochodu, ale wprowadzanie tekstu nie jest dostępne, więc UNTextInputAction jest automatycznie ukrywane w CarPlay. W watchOS kategorie nie są obsługiwane — wszystkie powiadomienia są wyświetlane bez przycisków akcji.
Często zadawane pytania
Ograniczeń nie ma — iOS nie ustawia limitu liczby UNNotificationCategory. W praktyce zaleca się jednak nie więcej niż 10–15 kategorii, aby nie komplikować obsługi w delegacie. Każda kategoria może zawierać do 4 akcji (przycisków). Więcej niż 4 akcje są ignorowane przez system.
Zaimplementuj delegata UNUserNotificationCenterDelegate i metodę didReceive response. Sprawdź response.actionIdentifier: UNNotificationDismissActionIdentifier — przesunięcie usunięcia, UNNotificationDefaultActionIdentifier — dotknięcie treści, lub własny identyfikator przycisku. Dla przycisków tekstowych tekst jest dostępny przez response.userText.
Category — określa interaktywne akcje (przyciski) dla powiadomienia. Thread-id — grupuje powiadomienia w Centrum Powiadomień według tematów. Oba klucze są podawane w APNS-ładunku. Category i thread-id nie są powiązane: powiadomienie może mieć kategorię bez thread-id i odwrotnie.
Tak, UNNotificationCategory jest obsługiwany na macOS 10.14+ (Mojave) w aplikacjach używających UserNotifications framework. Zachowanie kategorii na macOS jest podobne do iOS: po naciśnięciu powiadomienia wyświetlane są przyciski, obsługa odbywa się przez UNUserNotificationCenterDelegate.
Zaleca się rejestrowanie kategorii przy każdym uruchomieniu aplikacji przez setNotificationCategories. System zastępuje stary zestaw kategorii nowym przy każdym wywołaniu. Jeśli nie aktualizujesz, kategorie pozostają między uruchomieniami, ale przy zmianie kodu stare kategorie mogą nie pasować do nowych.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również