Notification Content Extension — що це, як створити кастомний інтерфейс для iOS

Автор: IT Sectr Опубліковано: 2026-03-21 Час читання: 8 хв

Notification Content Extension — це розширення iOS, яке дозволяє замінити стандартний інтерфейс push-сповіщення на кастомний UIView. Розробник отримує повний контроль над відображенням контенту: зображення, відео, анімації, кастомні шрифти та інтерактивні елементи. За даними Apple Developer, 2025, Notification Content Extension підтримує будь-який UIKit-інтерфейс в обмеженому просторі сповіщення.

Головне

  • Notification Content Extension — iOS-розширення для кастомного UI push-сповіщень.
  • Розширення реалізує протокол UNNotificationContentExtension з обов'язковим методом didReceive.
  • Кастомний інтерфейс створюється в Storyboard і може містити будь-які UIKit-компоненти.
  • Максимальний розмір розширення — 50 МБ і не повинен перевищувати 12 МБ у стисненому вигляді.
  • Розширення активується для сповіщень із зазначеним categoryIdentifier.

Що таке Notification Content Extension

Notification Content Extension — це розширення додатку в iOS, яке перевизначає стандартний шаблон відображення push-сповіщення на кастомний UIView. На відміну від звичайного сповіщення, де контент обмежений заголовком, підзаголовком і тілом, розширення дозволяє відобразити будь-який UIKit-інтерфейс: карту з координатами, графік, галерею зображень або форму введення.

Як це працює

Коли iOS отримує push-сповіщення із зазначеним categoryIdentifier, система перевіряє, чи зареєстровано розширення для цієї категорії. Якщо так — система запускає розширення в окремому процесі та передає йому вміст сповіщення. Розширення відображає свій інтерфейс замість стандартного. Користувач взаємодіє з кастомним інтерфейсом, не відкриваючи основний додаток.

Відмінність від Notification Service Extension

Важливо не плутати Notification Content Extension з Notification Service Extension. Service Extension обробляє контент до показу сповіщення (завантаження вкладень, розшифрування). Content Extension замінює інтерфейс після отримання готового контенту. Обидва розширення можуть працювати в тандемі: Service Extension готує дані, Content Extension їх відображає.

ХарактеристикаContent ExtensionService Extension
ПризначенняКастомний UI сповіщенняМодифікація контенту до показу
Час виконанняПоки користувач бачить сповіщенняДо 30 секунд у фоні
ІнтерфейсПовний UIKit UIViewНемає інтерфейсу
APIUNNotificationContentExtensionUNNotificationServiceExtension

Обмеження розширення

Notification Content Extension працює в ізольованому процесі з обмеженими ресурсами. Розширення не має доступу до основного сховища додатку через NSUserDefaults, за винятком App Group. Розмір розширення обмежений 50 МБ у розпакованому вигляді. Час на відображення контенту також обмежений — якщо розширення не завершило оновлення за розумний час, система згортає його.

Створення Notification Content Extension в Xcode

Для створення розширення в Xcode необхідно додати новий target типу Notification Content Extension. Xcode автоматично створить MainInterface.storyboard з контролером, який успадковується від UIViewController та реалізує UNNotificationContentExtension.

Додавання target-розширення

У Xcode виберіть File → New → Target → Notification Content Extension. Вкажіть ім'я розширення, мову (Swift або Objective-C) та переконайтеся, що проєкт підключено до тієї ж команди розробників. Після створення target з'явиться папка з трьома файлами: MainInterface.storyboard, Info.plist та файл контролера.

Налаштування Info.plist

У Info.plist розширення обов'язково вказується масив NSExtensionAttributes з ключем UNNotificationExtensionCategory. Цей масив містить ідентифікатори категорій сповіщень, для яких буде активуватися розширення. Опціональний ключ UNNotificationExtensionInitialContentSizeRatio задає початкове співвідношення сторін кастомного інтерфейсу для правильного позиціонування.

Архітектура папок розширення

Рекомендується підтримувати чисту архітектуру в target-розширенні: окрема папка для контролерів, окрема — для кастомних View. Оскільки розширення — це окремий бінарний файл, код основного додатку недоступний безпосередньо. Для спільного використання коду створіть окремий framework або використовуйте App Group для даних.

Реалізація протоколу UNNotificationContentExtension

UNNotificationContentExtension — протокол, який повинен реалізувати контролер у Notification Content Extension. Єдиний обов'язковий метод — didReceive(_:with:), що викликається при отриманні сповіщення. Контролер отримує notification та готовий view controller, який необхідно оновити даними.

Базова реалізація контролера

Контролер розширення повинен успадковуватися від UIViewController та реалізувати UNNotificationContentExtension. Storyboard або xib зв'язується з цим контролером. При отриманні сповіщення метод didReceive передає контент, і контролер оновлює свої views.

swift
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.

Часті запитання

Чи можна використовувати SwiftUI в Notification Content Extension?

Так, починаючи з 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 для медіа-контролю або запитайте оновлення через делегат. Повне оновлення контенту без нового сповіщення неможливе.

Як налагодити Notification Content Extension?

Виберіть target розширення в Xcode та запустіть на симуляторі. Використовуйте lldb та breakpoints як у звичайному додатку. Для тестування надішліть push-сповіщення через Firebase Console або локально через Pusher.

Підсумки

  • Notification Content Extension — iOS-розширення для кастомного відображення push-сповіщень.
  • Розширення реалізує UNNotificationContentExtension і надає повний UIKit-інтерфейс.
  • Активується для сповіщень із збігаючимся categoryIdentifier.
  • Підтримує будь-які UI-компоненти: карти, зображення, відео, анімації.
  • Працює в ізольованому процесі з доступом через App Group.
  • Обмеження за розміром — 50 МБ розпакованого розширення.
  • Для медіаконтенту використовуйте UNNotificationAttachment, підготовлений Service Extension.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також