Реалізація Notification Content Extension для iOS
Notification Content Extension відображається, коли користувач довго натискує на сповіщення (3D Touch / Haptic Touch) або розгортає його у Notification Center. Замість стандартного превью система показує кастомний UIViewController, який визначаєте ви. Кнопки дій залишаються — їх додаємо через UNNotificationCategory.
Що можна реалізувати
Інтерактивний предпросмотр замовлення з картою та адресою доставки прямо у сповіщенні. Карточка вхідного повідомлення з аватаром відправника та повним текстом. Сповіщення про матч з live-рахунком, який оновлюється через UNUserNotificationCenter.current().getDeliveredNotifications(). Форма швидкого відповіді без відкриття додатку.
Це не вимагає, щоб користувач відкривав додаток — все відбувається у системному UI.
Як працює
Content Extension — окремий target з 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 на першому ж проекті.
Що входить у роботу
- Створення target 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 дні. Вартість рассчитується індивідуально.







