Как добавлять и обрабатывать действия для push и local notifications в iOS

Как добавлять и обрабатывать действия для 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"
        }
    }
}

Заключение

Действия с уведомлениями - это отличный способ дать пользователям возможность ответить на уведомление без необходимости открывать приложение.


Еще один момент, который следует учитывать, - это то, что мы можем не иметь доступа к файлам на диске, пока приложение находится в фоновом режиме, например, когда устройство заблокировано. В этом случае необходимо дополнительное решение, например, временное сохранение ответа до получения доступа к файлу.

Для подготовки статьи использована информация отсюда.


Если вы нашли что-то полезное для себя, то подписывайтесь на мой канал, тут больше интересных историй и подходов.

Авторский канал об iOS-разработке

Report Page