Notification Action — интерактивные кнопки и поля ввода, которые отображаются прямо в push-уведомлении и позволяют пользователю выполнить действие без открытия приложения. Это ключевой элемент пользовательского опыта, сокращающий путь до целевого экрана. По данным Android Developers, 2025, Notification Action повышает вовлечённость пользователей до 40% за счёт снижения трения при взаимодействии.
Главное
Notification Action — это интерактивный элемент интерфейса, добавляемый в push-уведомление для выполнения определённого действия. Пользователь может ответить на сообщение, подтвердить задачу или открыть конкретный экран, не заходя в приложение. Действия отображаются в виде кнопок под текстом уведомления или в расширенном виде при свайпе.
Основная цель Notification Action — сократить количество шагов для достижения цели пользователем. Вместо открытия приложения и навигации к нужному экрану пользователь нажимает одну кнопку. Исследования показывают, что приложения с интерактивными уведомлениями показывают на 25–40% более высокий уровень вовлечённости по сравнению с простыми уведомлениями.
На Android Notification Action отображаются в виде иконок-кнопок в компактном виде и текстовых кнопок в expandable-режиме. На iOS действия появляются при долгом нажатии на уведомление или при свайпе влево. Каждая платформа имеет свои рекомендации по количеству действий — Android рекомендует не более 3, iOS — не более 4.
| Платформа | Макс. действий | Способ отображения | Типы действий |
|---|---|---|---|
| Android | 3 | Иконки + текст | Кнопки, ввод текста |
| iOS | 4 | Долгое нажатие / свайп | Кнопки, текстовый ввод |
На Android Notification Action создаются через NotificationCompat.Builder с использованием метода addAction(). Каждое действие содержит иконку, текст и PendingIntent, который срабатывает при нажатии. Начиная с Android 7.0 (API 24), поддерживается прямой ввод текста через RemoteInput.
Для создания кнопки в уведомлении необходимо определить PendingIntent, который будет запущен при нажатии. PendingIntent может открывать Activity, запускать Service или BroadcastReceiver. Иконка действия должна быть монохромной и соответствовать Material Design.
val acceptIntent = Intent(context, AcceptActionReceiver::class.java)
acceptIntent.putExtra("notification_id", notificationId)
val acceptPendingIntent = PendingIntent.getBroadcast(
context, requestCode,
acceptIntent, PendingIntent.FLAG_UPDATE_CURRENT
)
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle("Запрос на подтверждение")
.setContentText("Подтвердите выполнение задачи")
.addAction(R.drawable.ic_accept, "Подтвердить", acceptPendingIntent)
.build()
Для сценариев, где требуется ввод текста (например, ответ на сообщение), Android предоставляет RemoteInput. Пользователь вводит текст прямо в уведомлении, и приложение получает его без открытия Activity. RemoteInput поддерживается на Android 7.0+ и требует явной обработки в BroadcastReceiver или Service.
val remoteInput = RemoteInput.Builder("reply_input")
.setLabel("Введите ответ")
.build()
val replyAction = NotificationCompat.Action.Builder(
R.drawable.ic_reply, "Ответить", replyPendingIntent
)
.addRemoteInput(remoteInput)
.build()
val notification = NotificationCompat.Builder(context, CHANNEL_ID)
.addAction(replyAction)
.build()
При нажатии на действие система запускает указанный PendingIntent. Для получения введённого текста из RemoteInput вызовите RemoteInput.getResultsFromIntent(intent). Рекомендуется обрабатывать действия в IntentService или WorkManager, чтобы не блокировать UI-поток.
На iOS Notification Action реализуются через UserNotifications framework. Разработчик создаёт категории действий (UNNotificationCategory) и регистрирует их при запуске приложения. Каждое действие определяется объектом UNNotificationAction с уникальным идентификатором.
Для добавления действий в push-уведомления iOS необходимо создать категорию, которая группирует связанные действия. Категория указывается в полезной нагрузке уведомления через поле category. При получении уведомления система отображает доступные действия из указанной категории.
import UserNotifications
class NotificationSetup {
func registerNotificationCategories() {
let approveAction = UNNotificationAction(
identifier: "APPROVE_ACTION",
title: "Подтвердить",
options: [.foreground]
)
let declineAction = UNNotificationAction(
identifier: "DECLINE_ACTION",
title: "Отклонить",
options: [.destructive]
)
let category = UNNotificationCategory(
identifier: "REQUEST_CATEGORY",
actions: [approveAction, declineAction],
intentIdentifiers: [],
options: []
)
UNUserNotificationCenter.current()
.setNotificationCategories([category])
}
}
Когда пользователь нажимает на действие, система вызывает метод userNotificationCenter:didReceiveNotificationResponse в делегате UNUserNotificationCenter. В response.actionIdentifier содержится идентификатор выполненного действия. Для текстового ввода используется UNTextInputNotificationAction, который предоставляет введённый пользователем текст.
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(
center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
switch response.actionIdentifier {
case "APPROVE_ACTION":
Log.d("Action: approved")
case "DECLINE_ACTION":
Log.d("Action: declined")
case UNNotificationDefaultActionIdentifier:
Log.d("Action: opened app")
default:
break
}
completionHandler()
}
}
Notification Action классифицируются по типу взаимодействия и сценарию использования. Правильный выбор типа действия напрямую влияет на пользовательский опыт и конверсию в целевое действие.
Самый распространённый тип — кнопка, открывающая приложение на определённом экране. На Android для этого используется PendingIntent.getActivity(), на iOS — опция .foreground у UNNotificationAction. Применяется для действий требующих полного интерфейса, например просмотр деталей заказа.
Действия, которые выполняются без открытия приложения. На Android используется PendingIntent.getBroadcast() или PendingIntent.getService(). На iOS — опция .authenticationRequired или без .foreground. Примеры: отметка задачи выполненной, лайк поста, добавление в избранное.
Позволяет пользователю ввести текст прямо в уведомлении. На Android реализуется через RemoteInput, на iOS — через UNTextInputNotificationAction. Используется для ответов на сообщения, комментариев, ввода одноразовых кодов подтверждения.
Действия, которые необратимо изменяют данные — удаление, отклонение, блокировка. На Android выделяются визуально (красный цвет в некоторых системах), на iOS требуют опции .destructive. Рекомендуется запрашивать подтверждение для деструктивных действий, например через дополнительный диалог или второе нажатие.
Отдельный класс действий — ввод текста непосредственно из уведомления. На Android это реализуется через RemoteInput в комбинации с PendingIntent. На iOS используется UNTextInputNotificationAction, наследующий UNNotificationAction. Такие действия применяются для быстрых ответов в мессенджерах, ввода промокодов, заполнения форм обратной связи или оценки качества обслуживания. Введённый текст передаётся в приложение вместе с идентификатором действия. Для корректной обработки текстового ввода на обеих платформах необходимо реализовать парсинг введённых данных и валидацию перед выполнением целевого действия.
Корректная обработка Notification Action критична для аналитики и пользовательского опыта. Каждое нажатие должно быть залогировано, а действие — выполнено надёжно, даже если приложение было закрыто.
Отслеживайте каждое нажатие на Notification Action через систему аналитики. Firebase Analytics, Mixpanel или Яндекс.Метрика позволяют фиксировать идентификатор действия, время нажатия и контекст уведомления. Эти данные помогают оптимизировать стратегию уведомлений и повышать вовлечённость. A/B-тестирование с разными наборами действий помогает определить наиболее эффективные сценарии взаимодействия с пользователем.
Если приложение закрыто, система всё равно передаёт Intent или UNNotificationResponse при нажатии на действие. На Android используйте BroadcastReceiver для гарантированной обработки. На iOS система запускает приложение в фоне и передаёт ответ делегату. Для критически важных действий (подтверждение платежа, авторизация) добавьте механизм повторной попытки и уведомление пользователя об успешном выполнении.
Начиная с Android 7.0, разработчик может влиять на отображение Notification Action через иконки и цвета. Иконки должны быть монохромными (alpha-канал), размером 24x24 dp. На iOS кастомизация кнопок ограничена — используются системные цвета и шрифты. Material Design рекомендует группировать действия по приоритету: самое важное действие — первым, деструктивные — последними.
Часто задаваемые вопросы
На Android рекомендуется не более 3 действий, на iOS — до 4. Превышение лимита приводит к тому, что часть действий не отображается или скрывается в подменю.
Иконка передаётся в NotificationCompat.Action.Builder как ресурс drawable. Иконка должна быть монохромной (alpha-канал), размером 24x24 dp и соответствовать рекомендациям Material Design.
Да, если уведомление отображается на заблокированном экране и установлен флаг visibility как VISIBILITY_PUBLIC. На iOS требуется опция .authenticationRequired для действий, требующих авторизации.
На Android система воссоздаёт процесс и доставляет Intent. На iOS система запускает приложение в фоне. Гарантировать получение можно с помощью BroadcastReceiver на Android и UNNotificationServiceExtension на iOS.
На Android действия видны сразу под уведомлением в виде иконок. На iOS действия скрыты за долгим нажатием или свайпом. UX-дизайн уведомлений должен учитывать эти платформенные различия.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также