Notification Category (категория на известие) е механизъм на iOS за групиране на push известия по тип и прикачване на персонализируеми действия. Категорията определя кои бутони се показват при 3D Touch или продължително натискане на известие, както и как системата обработва входящи известия от този тип. Според Apple Developer Documentation, UNNotificationCategory се регистрира в UNUserNotificationCenter и се свързва с известието чрез полето category в APNS товара.
Основни точки
Notification Category е функция на iOS (от версия 8.0), която позволява на разработчика да класифицира push известия и да добавя интерактивни действия. Когато потребителят получи известие и натисне със сила (3D Touch) или продължително, се появяват бутоните, определени от категорията.
Категорията се регистрира чрез обекта UNNotificationCategory, който съдържа идентификатор, масив от действия и опционални параметри за показване. Системата използва идентификатора на категорията от APNS товара, за да намери регистрираната категория и да покаже съответните действия.
За разлика от Android Notification Channel, iOS Category не управлява важност, звук или вибрация. Единствената ѝ задача е да предостави интерактивни възможности за известието: бутони за отговор, потвърждение, отказ или въвеждане на текст.
Категориите не са задължителни за показване на push известия на 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също