Как добавлять и обрабатывать действия для push и local notifications в iOS
Victor
Локальные и push-уведомления iOS позволяют держать пользователей в курсе событий или получать напоминания о событиях, важных для времени или местоположения, даже если приложение работает в фоновом режиме или неактивно в текущий момент.
При использовании уведомлений с возможностью действия система iOS отображает одну или несколько кнопок в дополнение к содержимому уведомления. Они позволяют пользователю ответить на доставленное уведомление, не запуская приложение.

Давайте посмотрим, как создать уведомление с действием и обработать реакцию пользователя.
Создание действий в уведомлении
Чтобы добавить действия в уведомление, необходимо выполнить два шага.
- Создание категории и ее действий и регистрация их в UNUserNotificationCenter во время запуска.
- Добавление идентификатора категории в полезную нагрузку уведомления.
Шаг 1: Создание и регистрация категории и ее действий
Действие уведомления представлено типом UNNotificationAction, а категория - типом UNNotificationCategory.
let doneAction = UNNotificationAction(identifier: "drinkingReminder.doneAction", title: "Done", options: [])
let notThirstyAction = UNNotificationAction(identifier: "drinkingReminder.notThirstyAction", title: "Not thirsty", options: [])
let drinkingReminderCategory = UNNotificationCategory(
identifier: "drinkingReminderCategory",
actions: [doneAction, notThirstyAction],
intentIdentifiers: [],
options: .customDismissAction)
UNUserNotificationCenter.current().setNotificationCategories([drinkingReminderCategory])
В приведенном выше коде мы создаем категорию с двумя действиями. Затем мы используем метод setNotificationCategories из UNUserNotificationCenter для регистрации категории.
Шаг 2: Добавление идентификатора категории в notification payload
Чтобы использовать категорию в локальном уведомлении, мы устанавливаем categoryIdentifier в UNMutableNotificationContent при его создании.
let content = UNMutableNotificationContent() content.title = "Stay hydrated" content.body = "It's time for a glass of water" content.sound = .default content.categoryIdentifier = "drinkingReminderCategory"
Чтобы использовать категорию в удаленном уведомлении, сервер может включить идентификатор в payload.
{
"aps" : {
"alert" : {
"title" : "Stay hydrated",
"body" : "It's time for a glass of water"
},
"sound": "default",
"category" : "drinkingReminderCategory"
}
}
Обработка действий для уведомления
Когда пользователь нажимает одно из действий уведомления, приложение iOS запускается в фоновом режиме и вызывается делегатный метод userNotificationCenter(_:didReceive:withCompletionHandler:). Здесь мы можем использовать response.actionIdentifier для переключения между действиями и дальнейшей обработки.
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
switch response.actionIdentifier {
case "drinkingReminder.doneAction":
// Handle action
case "drinkingReminder.notThirstyAction":
// Handle action
default:
break
}
completionHandler()
}
Обратите внимание, что нет возможности переключаться между категориями, поэтому каждому действию нужен уникальный идентификатор.
Чтобы повысить безопасность нашего кода, мы можем извлечь идентификаторы в перечисления, чтобы избежать работы со строками в разных местах.
enum NotificationAction {
case drinkingReminderDone
case drinkingReminderNotThirsty
var id: String {
switch self {
case .drinkingReminderDone:
return "tanaschita.notificationAction.drinkingReminder.done"
case .drinkingReminderNotThirsty:
return "tanaschita.notificationAction.drinkingReminder.notThirsty"
}
}
}
Заключение
Действия с уведомлениями - это отличный способ дать пользователям возможность ответить на уведомление без необходимости открывать приложение.
Еще один момент, который следует учитывать, - это то, что мы можем не иметь доступа к файлам на диске, пока приложение находится в фоновом режиме, например, когда устройство заблокировано. В этом случае необходимо дополнительное решение, например, временное сохранение ответа до получения доступа к файлу.
Для подготовки статьи использована информация отсюда.
Если вы нашли что-то полезное для себя, то подписывайтесь на мой канал, тут больше интересных историй и подходов.
