Notification Content Extension — это расширение iOS, позволяющее заменить стандартный интерфейс push-уведомления на кастомный UIView. Разработчик получает полный контроль над отображением контента: изображения, видео, анимации, кастомные шрифты и интерактивные элементы. По данным Apple Developer, 2025, Notification Content Extension поддерживает любой UIKit-интерфейс в ограниченном пространстве уведомления.
Главное
Notification Content Extension — это app 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) или файловый контейнер. Основное приложение и расширение должны быть в одной группе разработчиков и иметь включённый capability App Groups.
Используйте метод didReceive(_:with:) с UNNotificationContentExtensionMediaPlayPauseButtonType для медиа-контроля или запросите обновление через делегат. Полное обновление контента без нового уведомления невозможно.
Выберите target расширения в Xcode и запустите на симуляторе. Используйте lldb и breakpoints как в обычном приложении. Для тестирования отправьте push-уведомление через Firebase Console или локально через Pusher.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также