Swift Academy · Урок

Обработка полезных данных уведомлений

Отвечайте на уведомления в активном и фоновом режимах.

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

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

Структура данных

Удалённое уведомление — это словарь JSON, который ваш сервер отправляет службе уведомлений Apple. Зарезервированный ключ aps содержит видимые пользователю данные — текст, звук и значок, — а соседние ключи содержат ваши собственные данные, например идентификатор элемента, который нужно открыть.

// Example payload JSON:
// {
//   "aps": { "alert": { "title": "Hi", "body": "..." },
//            "sound": "default", "badge": 1 },
//   "itemId": "42"
// }

Словарь aps

Внутри aps ключ alert может содержать строку или объект с заголовком, текстом и подзаголовком. Здесь также находятся sound, badge и такие флаги, как content-available и mutable-content. Всё за пределами aps вы определяете сами.

// aps keys:
//   alert: { title, subtitle, body }
//   sound: "default" or critical sound object
//   badge: Int
//   content-available: 1  (silent / background)
//   mutable-content: 1    (allow modification)

Получение уведомлений при открытом приложении

По умолчанию уведомление, поступившее, пока приложение открыто, скрывается. Чтобы всё же показать его, реализуйте willPresent делегата и верните нужные варианты отображения, например баннер и звук.

import UserNotifications
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    willPresent notification: UNNotification
) async -> UNNotificationPresentationOptions {
    return [.banner, .sound, .badge]
}

Обработка нажатия

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

import UserNotifications
func userNotificationCenter(
    _ center: UNUserNotificationCenter,
    didReceive response: UNNotificationResponse
) async {
    let info = response.notification.request
        .content.userInfo
    if let id = info["itemId"] as? String {
        print("open item", id)
    }
}

Чтение userInfo

Полная полезная нагрузка, включая ваши собственные ключи, доступна в content.userInfo — словаре типа [AnyHashable: Any]. Осторожно приводите каждый тип; никогда не используйте принудительное извлечение значения, поскольку некорректная полезная нагрузка не должна приводить к аварийному завершению приложения.

import UserNotifications
func route(_ userInfo: [AnyHashable: Any]) {
    guard let screen = userInfo["screen"] as? String
    else { return }
    switch screen {
    case "profile": print("go to profile")
    case "cart":    print("go to cart")
    default:        break
    }
}

Тихие (фоновые) уведомления

Установка content-available: 1 без текста уведомления создаёт silent-уведомление, которое пробуждает приложение в фоне для загрузки данных без отображения интерфейса. Система ограничивает частоту таких уведомлений, и для них требуется фоновый режим удалённых уведомлений.

// Silent payload — no alert, just a wake-up:
// { "aps": { "content-available": 1 }, "sync": true }
let silent = "content-available wakes app quietly"
_ = silent

Обработчик фоновой загрузки

Тихое уведомление поступает в асинхронный метод didReceiveRemoteNotification делегата приложения. Вы выполняете загрузку и возвращаете UIBackgroundFetchResult, чтобы система знала, поступили ли новые данные, и могла планировать последующие пробуждения с учётом доступного ресурса.

import UIKit
func application(
    _ app: UIApplication,
    didReceiveRemoteNotification userInfo: [AnyHashable: Any]
) async -> UIBackgroundFetchResult {
    // fetch fresh data here
    return .newData
}

Изменяемое содержимое и расширения службы

При использовании mutable-content: 1 расширение службы уведомлений может перехватить уведомление перед отображением: расшифровать текст, загрузить вложение с изображением или изменить заголовок. У расширения есть небольшой запас времени для завершения работы.

// Service extension entry point (UNNotificationServiceExtension):
// override didReceive(_:withContentHandler:)
//   modify bestAttemptContent, then call contentHandler
let mutable = "mutable-content enables interception"
_ = mutable

Локализация текста уведомления

Чтобы локализовать текст на стороне сервера, отправьте title-loc-key и loc-key, ссылающиеся на ключи в строках Localizable вашего приложения, а также loc-args для подстановок. Устройство отобразит их на языке пользователя, и вам не придётся отправлять заранее переведённый текст.

// Localized alert payload:
// "alert": {
//   "loc-key": "NEW_MESSAGE",
//   "loc-args": ["Ada"]
// }
let localized = "loc-key resolves on device"
_ = localized

Обновление значка

Значение badge задаёт число на значке приложения. Отправка badge: 0 убирает это число. После прочтения содержимого его также можно задать в коде через setBadgeCount, чтобы значок соответствовал количеству непрочитанных элементов.

import UserNotifications
func clearBadge() async {
    try? await UNUserNotificationCenter.current()
        .setBadgeCount(0)
}

Надёжный обработчик

Объедините все части: показывайте уведомления на переднем плане, переходите по нажатию и проверяйте каждое приведение типа. Обработчик никогда не завершается с ошибкой из-за неожиданной полезной нагрузки и всегда извлекает все доступные данные.

import UserNotifications
func handleTap(_ response: UNNotificationResponse) {
    let info = response.notification.request
        .content.userInfo
    guard let id = info["itemId"] as? String else {
        print("no item id; open home")
        return
    }
    print("navigate to item", id)
}

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

Вспомните, как реагировать на нажатие уведомления.

Повторение

Вы научились обрабатывать полезные нагрузки:

  • Словарь aps содержит видимые пользователю данные, а соседние ключи — ваши данные, доступные через userInfo.
  • Переопределяйте willPresent, чтобы показывать уведомления на переднем плане, и didReceive response, чтобы обрабатывать нажатия.
  • content-available: 1 запускает тихую фоновую загрузку, возвращающую UIBackgroundFetchResult.
  • mutable-content включает расширение службы, а loc-key локализует текст на устройстве.
Можно начать бесплатно

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

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

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

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

Урок «Обработка полезных данных уведомлений» бесплатный?

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

Чему я научусь в уроке «Обработка полезных данных уведомлений»?

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

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

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

Сколько времени занимает урок «Обработка полезных данных уведомлений»?

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

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

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

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

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