Swift Academy · Урок

Действия и категории уведомлений

Добавляйте интерактивные действия к уведомлениям.

Урок 4 из 413 шагов

«Действия и категории уведомлений» — бесплатный урок Swift Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 4 уроков всего.

Интерактивные уведомления

Уведомления могут не только отображать текст — в них можно предложить кнопки. Пользователь может ответить на сообщение, accept приглашение или отложить напоминание, не открывая приложение. Это создаётся из действий, объединённых в категории.

import UserNotifications
// Category = a set of actions
// Each delivered notification names its category
// so the system shows the right buttons

Определение действия

У UNNotificationAction есть идентификатор, по которому вы сопоставите действие позже, локализованный заголовок на кнопке и такие параметры, как .destructive или .foreground (этот параметр запускает приложение).

import UserNotifications
let accept = UNNotificationAction(
    identifier: "ACCEPT",
    title: String(localized: "Accept"),
    options: [.foreground])
let decline = UNNotificationAction(
    identifier: "DECLINE",
    title: String(localized: "Decline"),
    options: [.destructive])

Объединение действий в категорию

UNNotificationCategory объединяет действия под одним идентификатором категории. Порядок действий в массиве определяет порядок кнопок. Зарегистрируйте категории один раз при запуске через центр уведомлений.

import UserNotifications
let inviteCategory = UNNotificationCategory(
    identifier: "INVITE",
    actions: [accept, decline],
    intentIdentifiers: [],
    options: [])
UNUserNotificationCenter.current()
    .setNotificationCategories([inviteCategory])

Назначение уведомлению категории

Чтобы кнопки появились, содержимое уведомления должно задать categoryIdentifier зарегистрированной категории. Для удалённых уведомлений сервер отправляет "category": "INVITE" внутри словаря aps.

import UserNotifications
let content = UNMutableNotificationContent()
content.title = String(localized: "New invite")
content.body = String(localized: "Ada invited you")
content.categoryIdentifier = "INVITE"

Обработка выбранного действия

Когда пользователь нажимает кнопку, срабатывает didReceive response делегата, а в response.actionIdentifier устанавливается идентификатор действия. Используйте переключатель, чтобы выполнить нужную работу.

import UserNotifications
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    didReceive response: UNNotificationResponse
) async {
    switch response.actionIdentifier {
    case "ACCEPT":  print("accepted")
    case "DECLINE": print("declined")
    default:        break
    }
}

Идентификаторы действия по умолчанию и закрытия

Всегда существуют два системных идентификатора: UNNotificationDefaultActionIdentifier означает, что пользователь нажал текст уведомления, чтобы открыть приложение, а UNNotificationDismissActionIdentifier — что он закрыл уведомление. Обрабатывайте их вместе с собственными действиями.

import UserNotifications
func route(_ id: String) {
    switch id {
    case UNNotificationDefaultActionIdentifier:
        print("opened the app")
    case UNNotificationDismissActionIdentifier:
        print("dismissed")
    default:
        print("custom action", id)
    }
}

Действия с вводом текста

UNTextInputNotificationAction показывает встроенное текстовое поле — это удобно для быстрых ответов. Оно добавляет заголовок кнопки и замещающий текст для поля ввода.

import UserNotifications
let reply = UNTextInputNotificationAction(
    identifier: "REPLY",
    title: String(localized: "Reply"),
    options: [],
    textInputButtonTitle: String(localized: "Send"),
    textInputPlaceholder: String(localized: "Message"))

Чтение введённого текста

Для действия с текстом ответ имеет тип UNTextInputNotificationResponse. Приведите его к этому типу, чтобы прочитать userText — строку, введённую пользователем.

import UserNotifications
func handle(_ response: UNNotificationResponse) {
    if let textResponse = response
        as? UNTextInputNotificationResponse {
        let message = textResponse.userText
        print("reply:", message)
    }
}

Параметры категории

Параметры категории уточняют поведение: .customDismissAction передаёт событие закрытия вашему делегату, .hiddenPreviewsShowTitle показывает заголовок, даже если предварительный просмотр скрыт на экране блокировки, а .allowInCarPlay разрешает отображение в CarPlay.

import UserNotifications
let category = UNNotificationCategory(
    identifier: "MESSAGE",
    actions: [reply],
    intentIdentifiers: [],
    options: [.customDismissAction,
              .hiddenPreviewsShowTitle])
_ = category

Действия в фоне и на переднем плане

Без параметра .foreground действие запускает ваш обработчик в фоне, не выводя приложение на передний план, — это удобно для откладывания или отметки «нравится». С параметром .foreground приложение запускается, и вы можете показать интерфейс. Выбирайте вариант в зависимости от того, нужно ли пользователю что-либо видеть.

import UserNotifications
let snooze = UNNotificationAction(
    identifier: "SNOOZE",
    title: String(localized: "Snooze"),
    options: []) // background, no app launch
let open = UNNotificationAction(
    identifier: "OPEN",
    title: String(localized: "Open"),
    options: [.foreground]) // launches app
_ = (snooze, open)

Полный сценарий reply

Объедините действие с текстом, категорию и обработчик, который отличает введённый ответ от обычного открытия. Этот шаблон используется для ответов на сообщения прямо в уведомлении.

import UserNotifications
func handle(_ response: UNNotificationResponse) async {
    switch response.actionIdentifier {
    case "REPLY":
        let text = (response as?
            UNTextInputNotificationResponse)?.userText ?? ""
        print("send reply:", text)
    case UNNotificationDefaultActionIdentifier:
        print("open conversation")
    default:
        break
    }
}

Быстрая проверка

Вспомните, как система определяет, какие кнопки показывать.

Повторение

Вы изучили интерактивные уведомления:

  • Создавайте UNNotificationAction (включая UNTextInputNotificationAction) и объединяйте их в UNNotificationCategory.
  • Регистрируйте категории при запуске; задавайте categoryIdentifier для содержимого (или category в уведомлении), чтобы показать кнопки.
  • Обрабатывайте response.actionIdentifier, включая идентификаторы действия по умолчанию и закрытия, а для ответов читайте userText.
  • Не указывайте .foreground для фоновых действий, например snooze.
Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Действия и категории уведомлений» бесплатный?

Да — полный текст урока «Действия и категории уведомлений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 4 уроков всего.

Чему я научусь в уроке «Действия и категории уведомлений»?

Добавляйте интерактивные действия к уведомлениям. Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Действия и категории уведомлений»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Регистрация для push-уведомлений
  2. Обработка полезных данных уведомлений
  3. Фоновые задачи и обновление
  4. Действия и категории уведомлений
← Назад к Swift Academy