Обработка полезных данных уведомлений
Отвечайте на уведомления в активном и фоновом режимах.
«Обработка полезных данных уведомлений» — бесплатный урок 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 — локальная установка не требуется.
Все уроки этого курса
- Регистрация для push-уведомлений
- Обработка полезных данных уведомлений
- Фоновые задачи и обновление
- Действия и категории уведомлений