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 MB и не трябва да надвишава 12 MB в компресиран вид.
  • Разширението се активира за известия с посочения 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 MB в разопакован вид. Времето за показване на съдържанието също е ограничено — ако разширението не завърши актуализацията в разумен срок, системата го затваря.

Създаване на 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-разширението: отделна папка за контролери, отделна за персонализирани изгледи. Тъй като разширението е отделен двоичен файл, кодът на основното приложение не е пряко достъпен. За споделяне на код създайте отделен framework или използвайте App Group за данни.

Имплементиране на протокола UNNotificationContentExtension

UNNotificationContentExtension — протокол, който контролерът в Notification Content Extension трябва да имплементира. Единственият задължителен метод е didReceive(_:with:), извикван при получаване на известие. Контролерът получава известието и готов view controller, който трябва да се актуализира с данни.

Основна имплементация на контролера

Контролерът на разширението трябва да наследява UIViewController и да имплементира UNNotificationContentExtension. Storyboard или xib е свързан с този контролер. При получаване на известие методът didReceive предава съдържанието и контролерът актуализира своите изгледи.

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 жестовете (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 MB на iOS 15+, ограничението се увеличава с всяка следваща актуализация. За поддръжка на множество изображения използвайте UNNotificationAttachment с различни идентификатори и ги показвайте чрез UIPageViewController.

Зареждане и показване на изображения

За да покажете изображение в персонализирания интерфейс, разширението получава UNNotificationAttachment от съдържанието на известието и го зарежда от локален URL. Прикаченият файл трябва предварително да бъде изтеглен от Notification Service Extension — Content Extension няма достъп до мрежата. Максимален размер на мултимедийния прикачен файл — 50 MB на iOS 15+, в по-ранни версии ограничението беше 10 MB. Разширението трябва правилно да обработва липсата на прикачен файл и да показва резервен интерфейс. За предварително зареждане на изображения с ниска резолюция използвайте версии с миниатюри, създадени от Service Extension преди прикачването.

Възпроизвеждане на видео в известието

iOS поддържа възпроизвеждане на видео в Notification Content Extension чрез AVPlayerLayer. Разширението може да покаже видео плейър с бутони за управление директно в известието. Това е особено полезно за приложения за видеонаблюдение, стрийминг или преглед на съдържание. Автоматичното възпроизвеждане без звук е позволено при условие, че потребителят очаква мултимедийно съдържание в това известие. При имплементиране на видео плейър добавете елементи за управление: play/pause, лента за напредък и бутон за затваряне. Уверете се, че видеото не стартира автоматично със звук — това нарушава препоръките на Apple за потребителското изживяване. За слайдшоу от няколко изображения използвайте анимиран преход между тях чрез UIView.transition с опция за преход на обръщане на страница.

Оптимизиране на производителността на разширението

Notification Content Extension работи в ограничена среда с лимит на паметта около 50 MB. За оптимизиране на производителността използвайте мързеливо зареждане на изображения, избягвайте тежки изчисления на основната нишка и прилагайте 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 и breakpoint-и като в обикновено приложение. За тестване изпратете push известие чрез Firebase Console или локално чрез Pusher.

Обобщение

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

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също