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 MB в разопакован вид. Времето за показване на съдържанието също е ограничено — ако разширението не завърши актуализацията в разумен срок, системата го затваря.
За да създадете разширението в 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-разширението: отделна папка за контролери, отделна за персонализирани изгледи. Тъй като разширението е отделен двоичен файл, кодът на основното приложение не е пряко достъпен. За споделяне на код създайте отделен framework или използвайте App Group за данни.
UNNotificationContentExtension — протокол, който контролерът в Notification Content Extension трябва да имплементира. Единственият задължителен метод е didReceive(_:with:), извикван при получаване на известие. Контролерът получава известието и готов view controller, който трябва да се актуализира с данни.
Контролерът на разширението трябва да наследява UIViewController и да имплементира UNNotificationContentExtension. Storyboard или xib е свързан с този контролер. При получаване на известие методът didReceive предава съдържанието и контролерът актуализира своите изгледи.
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.
Често задавани въпроси
Да, от 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 и breakpoint-и като в обикновено приложение. За тестване изпратете push известие чрез Firebase Console или локално чрез Pusher.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също