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 — это app 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) или файловый контейнер. Основное приложение и расширение должны быть в одной группе разработчиков и иметь включённый capability 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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