Notification Category (категорија обавештења) је механизам iOS-а за груписање пусх обавештења по типу и додавање прилагодљивих радњи. Категорија одређује која дугмад се приказују при 3D Touch или дугом притиску на обавештење, као и како систем обрађује долазна обавештења овог типа. Према Apple Developer Documentation, UNNotificationCategory се региструје у UNUserNotificationCenter и повезује са обавештењем преко поља category у APNS пакету.
Главно
Notification Category је функција iOS-а (од верзије 8.0) која омогућава програмеру да класификује пусх обавештења и дода интерактивне радње. Када корисник прими обавештење и притисне га снагом (3D Touch) или дуго притисне, појављују се дугмад дефинисана категоријом.
Категорија се региструје преко објекта UNNotificationCategory, који садржи идентификатор, низ радњи и опционе параметре приказа. Систем користи идентификатор категорије из APNS пакета за проналажење регистроване категорије и приказ одговарајућих радњи.
За разлику од Android Notification Channel-а, iOS Category не управља важношћу, звуком или вибрацијом. Њен једини задатак је да пружи интерактивне могућности за обавештење: дугмад за одговор, потврду, отказивање или унос текста.
Категорије нису обавезне за приказ пусх обавештења на iOS-у. Обавештење ће се приказати у сваком случају — са дугмадима ако је категорија регистрована, или без њих. Категорије су потребне само за додавање интерактивности обавештењима.
Механизам категорија састоји се од четири фазе: регистрација категорије на клијенту, слање APNS пакета са категоријом, препознавање категорије од стране система и обрада радње корисника.
Радње у категорији могу бити два типа: foreground (отварају апликацију) и background(извршавају се у позадини). За позадинске радње апликација добија ограничено време (око 30 секунди) за обраду у UNNotificationActionHandler-у.
UNNotificationCategory подржава неколико опција преко параметра options: customDismissAction — пријем догађаја при превлачењу обавештења, allowInCarPlay — приказ радњи у CarPlay-у, hiddenPreviewsBodyPlaceholder — прилагођени текст за скривене прегледе. Правилно подешавање опција побољшава корисничко искуство на различитим Apple уређајима.
iOS пружа два типа радњи за категорије обавештења. Сваки тип има своју намену и начин интеракције са корисником.
| Тип | Класа | Опис | Пример |
|---|---|---|---|
| Једноставна радња | UNNotificationAction | Дугме са насловом и опцијама (destructive, foreground, authenticationRequired) | „Обриши”, „Погледај” |
| Унос текста | UNTextInputAction | Дугме које отвара поље за унос текста са подразумеваним текстом | „Одговори”, „Коментариши” |
UNTextInputAction — јединствена могућност iOS-а. При притиску дугмета „Одговори” систем приказује текстуално поље у које корисник уноси одговор. Унети текст се прослеђује делегату заједно са идентификатором радње. Ово омогућава брзе одговоре без отварања апликације.
Опције радњи: options.authenticationRequired — захтева откључавање уређаја, options.destructive — истиче дугме црвеном бојом (за опасне радње), options.foreground — отвара апликацију након притиска.
Категорије се региструју при покретању апликације, обично у методи didFinishLaunchingWithOptions. Регистрација се врши преко UNUserNotificationCenter-а, након захтева за дозволу за обавештења. Категорије се могу ажурирати при сваком покретању — старе верзије се замењују новим.
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func registerNotificationCategories() {
let replyAction = UNTextInputNotificationAction(
identifier: "reply",
title: "Одговори",
options: [.foreground],
textInputButtonTitle: "Пошаљи",
textInputPlaceholder: "Унесите поруку..."
)
let deleteAction = UNNotificationAction(
identifier: "delete",
title: "Обриши",
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
}
}
Након регистрације категорије, свако обавештење са category = „message" у APNS пакету приказиваће дугмад „Одговори” и „Обриши”. Обрада притисака се врши у userNotificationCenter:didReceive response-у, где actionIdentifier одређује које дугме је притиснуто.
Када корисник притисне дугме категорије, iOS позива делегата UNUserNotificationCenterDelegate са објектом UNNotificationResponse. У response.actionIdentifier се налази идентификатор притиснутог дугмета, а у response.notification.request.content.userInfo — прилагођени подаци из APNS пакета. За UNTextInputAction додатно је доступан response.userText са текстом који је унео корисник.
Програмери упознати са Android Notification Channels-има често их мешају са iOS Notification Categories-има. Упркос сличном називу, ови механизми решавају различите задатке и раде на различите начине.
На обе платформе могуће је комбиновати оба механизма: у Android-у обавештење може припадати каналу са радњама из NotificationCompat-а, а у iOS-у категорија допуњава канале који се у iOS-у називају thread-id и служе за груписање обавештења у центру обавештења.
Да би се обавештење приказало са дугмадима категорије, сервер мора укључити кључ category у APNS пакет. Без овог кључа систем неће знати коју категорију да примени на обавештење.
{
"aps": {
"alert": {
"title": "Нова порука",
"body": "Ана: Здраво! Како си?"
},
"category": "message",
"thread-id": "chat_123",
"badge": 5,
"sound": "default"
}
}
Кључ category мора тачно одговарати идентификатору регистрованом преко setNotificationCategories на клијенту. Велика и мала слова су битна — „message" и „Message" се сматрају различитим категоријама. Ако категорија није пронађена, обавештење се приказује без дугмади, без грешака у дневнику.
Ако сервер пошаље обавештење са category која није регистрована на клијенту, iOS игнорише категорију и приказује обавештење без дугмади. Грешка се не евидентира и апликација не сазнаје за неусклађеност. Препоручује се синхронизација листе категорија између сервера и клијента преко конфигурационе датотеке и провера при сваком ажурирању апликације.
При дизајнирању категорија обавештења iOS-а придржавајте се принципа једна категорија — један сценарио. Свака категорија треба да одговара одређеном типу интеракције: одговор на поруку, потврда радње, одбијање захтева. Немојте мешати различите сценарије у једној категорији — то збуњује корисника и компликује обраду у делегату.
Користите UNTextInputAction за сценарије у којима корисник треба да унесе текст без отварања апликације: одговори у месенџерима, коментари, брзе белешке. Текстуалне радње повећавају ангажованост — корисник обавља смислену радњу у 2 додира уместо у 5+ у отвореној апликацији.
За опасне радње (брисање, блокирање) користите опцију destructive. iOS ће истаћи ова дугмад црвеном бојом, упозоравајући корисника на неповратност радње. За радње које захтевају откључавање уређаја (преглед личних података) поставите authenticationRequired — систем ће затражити Face ID или лозинку пре извршења.
Тестирајте категорије на различитим уређајима: на iPhone-у са 3D Touch, на iPhone-у без 3D Touch (дуги притисак), на iPad-у и на Mac-у. Понашање категорија може се незнатно разликовати на различитим Apple платформама. Посебна пажња — CarPlay: дугмад категорија се приказују на екрану аутомобила, али унос текста није доступан, па се UNTextInputAction аутоматски сакрива у CarPlay-у. На watchOS категорије нису подржане — сва обавештења се приказују без дугмади за радње.
Често постављана питања
Нема ограничења — iOS не поставља лимит на број UNNotificationCategory. Међутим, у пракси се препоручује не више од 10–15 категорија како се не би компликовала обрада у делегату. Свака категорија може садржати до 4 радње (дугмета). Више од 4 радње систем игнорише.
Имплементирајте делегата UNUserNotificationCenterDelegate и метод didReceive response. Проверите response.actionIdentifier: UNNotificationDismissActionIdentifier — превлачење брисања, UNNotificationDefaultActionIdentifier — додир на тело, или ваш прилагођени идентификатор дугмета. За текстуална дугмад текст је доступан преко response.userText.
Category — одређује интерактивне радње (дугмад) за обавештење. Thread-id — групише обавештења у Центру обавештења по темама. Оба кључа се наводе у APNS пакету. Category и thread-id нису повезани: обавештење може имати категорију без thread-id и обрнуто.
Да, UNNotificationCategory је подржан на macOS 10.14+ (Mojave) у апликацијама које користе UserNotifications framework. Понашање категорија на macOS-у је слично iOS-у: при притиску на обавештење приказују се дугмад, обрада се врши преко UNUserNotificationCenterDelegate-а.
Препоручује се регистровање категорија при сваком покретању апликације преко setNotificationCategories. Систем замењује стари скуп категорија новим при сваком позиву. Ако не ажурирате, категорије се чувају између покретања, али при промени кода старе категорије можда неће одговарати новима.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође