Реализация Notification Content Extension для iOS
Notification Content Extension отображается, когда пользователь длинно нажимает на уведомление (3D Touch / Haptic Touch) или разворачивает его в Notification Center. Вместо стандартного превью система показывает кастомный UIViewController, который определяете вы. Кнопки действий остаются — их добавляем через UNNotificationCategory.
Что можно реализовать
Интерактивный предпросмотр заказа с картой и адресом доставки прямо в уведомлении. Карточка входящего сообщения с аватаром отправителя и полным текстом. Уведомление о матче с live-счётом, который обновляется через UNUserNotificationCenter.current().getDeliveredNotifications(). Форма быстрого ответа без открытия приложения.
Это не требует, чтобы пользователь открывал приложение — всё происходит в системном UI.
Как работает
Content Extension — отдельный таргет с NSExtensionPrincipalClass, унаследованным от UIViewController, который реализует UNNotificationContentExtension. Метод didReceive(_ notification:) получает UNNotification и должен заполнить UI данными из payload.
В Info.plist Extension'а задаём UNNotificationExtensionCategory — строку, совпадающую с identifier у UNNotificationCategory в основном приложении. Только уведомления с этой категорией будут показывать кастомный UI.
class NotificationViewController: UIViewController, UNNotificationContentExtension {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var bodyLabel: UILabel!
func didReceive(_ notification: UNNotification) {
let content = notification.request.content
titleLabel.text = content.title
bodyLabel.text = content.body
// парсим content.userInfo для дополнительных данных
}
func didReceive(_ response: UNNotificationResponse,
completionHandler completion: @escaping (UNNotificationContentExtensionResponseOption) -> Void) {
// обработка нажатия на action buttons
completion(.dismissAndForwardAction)
}
}
Кастомный размер. Высота кастомного UI задаётся в Info.plist через UNNotificationExtensionInitialContentSizeRatio (отношение высоты к ширине) — например, 0.6 для карточки. Если нужна динамическая высота, меняем preferredContentSize в коде.
Медиа. Если Notification Service Extension скачал attachment, он доступен через notification.request.content.attachments. Content Extension может отображать это изображение в кастомном UIImageView вместо системного превью.
Ограничения
Extension не имеет доступа к сети во время отображения — это не баг, это ограничение sandbox. Данные должны приходить в payload (до 4KB для APNs) или через attachment (скачанный заранее Service Extension'ом).
Интерактивные элементы (UIButton, UITextField) поддерживаются, но тапы по ним обрабатываются через didReceive(_:completionHandler:) — не через обычные IBAction. Это неочевидно и ломает классику UIKit на первом же проекте.
Что входит в работу
- Создание таргета Notification Content Extension
- Кастомный UI для развёрнутого уведомления (XIB или программный)
- Регистрация
UNNotificationCategoryс action buttons в основном приложении - Обработка action responses и передача управления приложению
- App Groups для доступа к shared данным
- Тестирование через Xcode Simulator (Notification Content Extension работает в симуляторе, в отличие от Service Extension)
Сроки
Базовый кастомный UI для одного типа уведомлений: 1–2 дня. С несколькими категориями, интерактивными элементами и интеграцией с Service Extension: 2–3 дня. Стоимость рассчитывается индивидуально.







