Notification Content Extension — це розширення iOS, яке дозволяє замінити стандартний інтерфейс push-сповіщення на кастомний UIView. Розробник отримує повний контроль над відображенням контенту: зображення, відео, анімації, кастомні шрифти та інтерактивні елементи. За даними Apple Developer, 2025, Notification Content Extension підтримує будь-який UIKit-інтерфейс в обмеженому просторі сповіщення.
Головне
Notification Content Extension — це розширення додатку в iOS, яке перевизначає стандартний шаблон відображення push-сповіщення на кастомний UIView. На відміну від звичайного сповіщення, де контент обмежений заголовком, підзаголовком і тілом, розширення дозволяє відобразити будь-який UIKit-інтерфейс: карту з координатами, графік, галерею зображень або форму введення.
Коли iOS отримує push-сповіщення із зазначеним categoryIdentifier, система перевіряє, чи зареєстровано розширення для цієї категорії. Якщо так — система запускає розширення в окремому процесі та передає йому вміст сповіщення. Розширення відображає свій інтерфейс замість стандартного. Користувач взаємодіє з кастомним інтерфейсом, не відкриваючи основний додаток.
Важливо не плутати Notification Content Extension з Notification Service Extension. Service Extension обробляє контент до показу сповіщення (завантаження вкладень, розшифрування). Content Extension замінює інтерфейс після отримання готового контенту. Обидва розширення можуть працювати в тандемі: Service Extension готує дані, Content Extension їх відображає.
| Характеристика | Content Extension | Service Extension |
|---|---|---|
| Призначення | Кастомний UI сповіщення | Модифікація контенту до показу |
| Час виконання | Поки користувач бачить сповіщення | До 30 секунд у фоні |
| Інтерфейс | Повний UIKit UIView | Немає інтерфейсу |
| API | UNNotificationContentExtension | UNNotificationServiceExtension |
Notification Content Extension працює в ізольованому процесі з обмеженими ресурсами. Розширення не має доступу до основного сховища додатку через NSUserDefaults, за винятком App Group. Розмір розширення обмежений 50 МБ у розпакованому вигляді. Час на відображення контенту також обмежений — якщо розширення не завершило оновлення за розумний час, система згортає його.
Для створення розширення в Xcode необхідно додати новий target типу Notification Content Extension. Xcode автоматично створить MainInterface.storyboard з контролером, який успадковується від UIViewController та реалізує UNNotificationContentExtension.
У Xcode виберіть File → New → Target → Notification Content Extension. Вкажіть ім'я розширення, мову (Swift або Objective-C) та переконайтеся, що проєкт підключено до тієї ж команди розробників. Після створення target з'явиться папка з трьома файлами: MainInterface.storyboard, Info.plist та файл контролера.
У Info.plist розширення обов'язково вказується масив NSExtensionAttributes з ключем UNNotificationExtensionCategory. Цей масив містить ідентифікатори категорій сповіщень, для яких буде активуватися розширення. Опціональний ключ UNNotificationExtensionInitialContentSizeRatio задає початкове співвідношення сторін кастомного інтерфейсу для правильного позиціонування.
Рекомендується підтримувати чисту архітектуру в target-розширенні: окрема папка для контролерів, окрема — для кастомних View. Оскільки розширення — це окремий бінарний файл, код основного додатку недоступний безпосередньо. Для спільного використання коду створіть окремий framework або використовуйте App Group для даних.
UNNotificationContentExtension — протокол, який повинен реалізувати контролер у Notification Content Extension. Єдиний обов'язковий метод — didReceive(_:with:), що викликається при отриманні сповіщення. Контролер отримує notification та готовий view controller, який необхідно оновити даними.
Контролер розширення повинен успадковуватися від UIViewController та реалізувати UNNotificationContentExtension. Storyboard або xib зв'язується з цим контролером. При отриманні сповіщення метод didReceive передає контент, і контролер оновлює свої views.
import UIKit
import UserNotifications
import UserNotificationsUI
class CustomNotificationViewController: UIViewController {
@IBOutlet var titleLabel: UILabel!
@IBOutlet var customImageView: UIImageView!
func didReceive(
notification: UNNotification
) {
let content = notification.request.content
titleLabel.text = content.title
loadAttachment(content.attachments.first)
}
private func loadAttachment(attachment: UNNotificationAttachment?) {
guard let url = attachment?.URL else { return }
if let image = UIImage(contentsOfFile: url.path) {
customImageView.image = image
}
}
}
extension CustomNotificationViewController: UNNotificationContentExtension {
func didReceive(
notification: UNNotification
) {
didReceive(notification: notification)
}
}
Система визначає розмір кастомного інтерфейсу на основі ключа UNNotificationExtensionInitialContentSizeRatio в Info.plist та поточного контенту. Рекомендується встановлювати цей ключ у значення 0.1 для мінімального початкового розміру, а потім змінювати розмір через preferredContentSize після завантаження контенту.
Notification Content Extension дає повну свободу у створенні інтерфейсу. Можна використовувати будь-які UIKit-компоненти: UITableView, MKMapView, WKWebView, UIStackView. Однак важливо враховувати обмежений простір сповіщення та оптимізувати продуктивність.
Один із популярних сценаріїв — відображення карти з місцезнаходженням. Для цього в Storyboard розширення додається MKMapView, а контролер передає координати з контенту сповіщення. Важно не забути додати MapKit у target розширення. При використанні карти враховуйте ліміт пам'яті розширення — завантаження складних тайлів може перевищити доступні ресурси.
Notification Content Extension підтримує UIView-анімації, включаючи зміну розмірів, переміщення та прозорість елементів. При вході в розширений режим сповіщення можна запустити анімацію появи контенту. Анімації повинні бути короткими (до 0.5 секунди) та не заважати користувачеві взаємодіяти зі сповіщенням. Уникайте нескінченних анімацій — вони витрачають заряд батареї та знижують продуктивність.
Оскільки розширення є повноцінним UIViewController, ви можете додавати жести та обробники натискань. UIKit gestures (UITapGestureRecognizer, UIButton) працюють стандартно. Для дій, що вимагають відкриття додатку, використовуйте делегат розширення або userNotificationCenter. Інтерактивні елементи повинні бути достатньо великими для зручного натискання на обмеженому просторі — мінімальний розмір touch target становить 44x44 точки за рекомендаціями Apple.
Медіаконтент — ключова можливість Notification Content Extension. Сповіщення може містити зображення, GIF, аудіо та відео, які відображаються в кастомному інтерфейсі. Вкладення доставляються через UNNotificationAttachment, який може бути доданий як сервером через payload, так і Notification Service Extension після завантаження. Підтримуються формати JPEG, PNG, MPEG-4 та MP3.
Для відображення зображення достатньо отримати UNNotificationAttachment з контенту сповіщення та завантажити його за локальним URL. Важливо пам'ятати, що розширення має доступ тільки до локальних файлів — віддалені ресурси повинні бути попередньо завантажені Service Extension. Максимальний розмір вкладення — 50 МБ на iOS 15+, обмеження змінюється з кожним наступним оновленням. Для підтримки кількох зображень використовуйте UNNotificationAttachment з різними ідентифікаторами та відображайте їх через UIPageViewController.
Для відображення зображення в кастомному інтерфейсі розширення отримує UNNotificationAttachment з контенту сповіщення та завантажує його за локальним URL. Вкладення повинно бути попередньо завантажено Notification Service Extension — Content Extension не має доступу до мережі. Максимальний розмір медіавкладення — 50 МБ на iOS 15+, у більш ранніх версіях обмеження становило 10 МБ. Розширення повинно коректно обробляти відсутність вкладення та відображати fallback-інтерфейс. Для попереднього завантаження зображень з низькою роздільною здатністю використовуйте thumbnail-версії, створені Service Extension перед прикріпленням.
iOS підтримує відтворення відео в Notification Content Extension через AVPlayerLayer. Розширення може відобразити відеоплеєр з кнопками керування прямо в сповіщенні. Це особливо корисно для додатків відеоспостереження, стрімінгу або попереднього перегляду контенту. Автовідтворення без звуку допускається за умови, що користувач очікує медіаконтент у цьому сповіщенні. При реалізації відеоплеєра додайте елементи керування: play/pause, прогрес-бар та кнопку закриття. Переконайтеся, що відео не стартує автоматично зі звуком — це порушує рекомендації Apple щодо користувацького досвіду. Для слайд-шоу з кількох зображень використовуйте анімований перехід між ними через UIView.transition з опцією переходу перегортання сторінки.
Notification Content Extension працює в обмеженому середовищі з лімітом пам'яті близько 50 МБ. Для оптимізації продуктивності використовуйте ліниве завантаження зображень, уникайте важких обчислень на головному потоці та застосовуйте Auto Layout з простими констрейнтами. Важкі операції, такі як обробка зображень або парсинг даних, виконуйте у фонових чергах (DispatchQueue.global). При перевищенні ліміту пам'яті система завершить розширення, і користувач побачить стандартне сповіщення. Рекомендується профілювати розширення через Instruments (Allocations та Time Profiler) перед публікацією, а також перевіряти споживання пам'яті на реальних пристроях з різними версіями iOS.
Часті запитання
Так, починаючи з iOS 16, Notification Content Extension підтримує SwiftUI через UIHostingController. Однак UIKit залишається більш стабільним вибором для складних інтерфейсів через обмежену підтримку SwiftUI в розширеннях.
Перевірте, що categoryIdentifier в payload сповіщення збігається з UNNotificationExtensionCategory в Info.plist розширення. Також переконайтеся, що розширення додано в main app target і правильно підписано.
Використовуйте App Group — спільне сховище (UserDefaults suite) або файловий контейнер. Основний додаток і розширення повинні бути в одній групі розробників і мати включену можливість App Groups.
Використовуйте метод didReceive(_:with:) з UNNotificationContentExtensionMediaPlayPauseButtonType для медіа-контролю або запитайте оновлення через делегат. Повне оновлення контенту без нового сповіщення неможливе.
Виберіть target розширення в Xcode та запустіть на симуляторі. Використовуйте lldb та breakpoints як у звичайному додатку. Для тестування надішліть push-сповіщення через Firebase Console або локально через Pusher.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також