Notification Category (категория уведомлений) — это механизм iOS для группировки push-уведомлений по типу и привязки к ним настраиваемых действий. Категория определяет, какие кнопки отображаются при 3D Touch или long-press на уведомлении, а также как система обрабатывает входящие уведомления этого типа. По данным Apple Developer Documentation, UNNotificationCategory регистрируется в UNUserNotificationCenter и связывается с уведомлением через поле category в APNS-пейлоаде.
Главное
Notification Category — это функция iOS (с версии 8.0), которая позволяет разработчику классифицировать push-уведомления и добавлять к ним интерактивные действия. Когда пользователь получает уведомление и нажимает на него с силой (3D Touch) или делает long-press, появляются кнопки, определённые категорией.
Категория регистрируется через объект 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 уведомление может принадлежать каналу с actions от 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 (long-press), на 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также