Notification Category (категорія сповіщень) — це механізм iOS для групування push-сповіщень за типом і прив'язки до них налаштовуваних дій. Категорія визначає, які кнопки відображаються при 3D Touch або довгому натисканні на сповіщенні, а також як система обробляє вхідні сповіщення цього типу. Згідно з документацією Apple Developer, 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 — кастомний текст-заповнювач для прихованих попередніх переглядів.
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 — кастомні дані з корисного навантаження.
Розробники, знайомі з 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» вважаються різними категоріями. Якщо категорію не знайдено, сповіщення покажеться без кнопок, без помилок у логах.
Якщо сервер надіслав сповіщення з категорією, яка не зареєстрована на клієнті, iOS ігнорує категорію та показує сповіщення без кнопок. Помилка не логується, і програма не дізнається про невідповідність. Рекомендується синхронізувати список категорій між сервером та клієнтом.
При проектуванні категорій сповіщень iOS дотримуйтеся принципу одна категорія — один сценарій. Кожна категорія повинна відповідати конкретному типу взаємодії: відповідь на повідомлення, підтвердження дії, відхилення запиту. Не змішуйте різні сценарії в одній категорії.
Використовуйте UNTextInputAction для сценаріїв, де користувач повинен ввести текст без відкриття програми: відповіді в месенджерах, коментарі, швидкі нотатки. Текстові дії підвищують залученість — користувач виконує осмислену дію в 2 торкання замість 5+ у програмі.
Для небезпечних дій (видалення, блокування) використовуйте опцію destructive. iOS виділить такі кнопки червоним кольором, попереджаючи користувача про незворотність дії. Для дій, що вимагають розблокування пристрою (перегляд особистих даних), вкажіть authenticationRequired.
Тестуйте категорії на різних пристроях: на iPhone з 3D Touch, на iPhone без 3D Touch (довге натискання), на iPad та на Mac. Поведінка категорій може дещо відрізнятися на різних платформах Apple. Особливу увагу — CarPlay: кнопки категорій відображаються на екрані автомобіля та повинні бути розроблені з мінімальним текстом для безпеки водія.
Часті запитання
Обмежень немає — iOS не встановлює ліміт на кількість UNNotificationCategory. Однак на практиці рекомендується не більше 10–15 категорій, щоб не ускладнювати обробку в делегаті. Кожна категорія може містити до 4 дій (кнопок). Більше 4 дій ігноруються системою.
Реалізуйте делегат UNUserNotificationCenterDelegate та метод didReceive. Перевірте 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також