Notification Content Extension — је тип iOS проширења који замењује стандардни шаблон push обавештења потпуно прилагођеним корисничким интерфејсом. Програмер добија могућност да приказује слике, аудио плејер, дугмад за радње, траке напретка и прилагођену анимацију унутар обавештења, проширујући стандардни банер у потпуну мини-апликацију. Према подацима WWDC 2025, проширење користи UNNotificationContentExtension и подржава до 4 медијска прилога у једном обавештењу, као и обраду интерактивних радњи кроз UNNotificationAction.
Главно
Notification Content Extension — је проширење апликације које преиначује приказ push обавештења на iOS-у. Уместо стандардног банера са насловом, телом поруке и дугмадима може се приказати интерфејс потпуно дизајниран у Interface Builder-у или програмски кроз UIKit или SwiftUI.
За разлику од Notification Service Extension, које мења садржај пре приказа, Content Extension је одговоран само за визуелну презентацију. Проширење добија готово обавештење након свих измена и одлучује како да га прикаже. Ово је кључна разлика између ова два типа проширења обавештења.
Проширење се активира када корисник изведе гест проширења — скролује обавештење надоле или кликне на њега (у зависности од модела уређаја). iOS покреће процес проширења, креира контролер из наведеног nib-а или storyboard-а и прослеђује обавештење кроз UNNotificationContentExtension.
Развој почиње додавањем новог target-а у Xcode са шаблоном Notification Content Extension. Xcode креира датотеку MainInterface.storyboard и класу која наслеђује UIViewController, имплементирајући протокол UNNotificationContentExtension.
Максимална висина прилагођене области — 320 тачака на iPhone-у (за моделе са великим екраном) и 352 тачке на iPad-у. Садржај који прелази ове границе бива одсечен. За прилагођавање различитим величинама препоручује се коришћење Auto Layout-а и UIScrollView-а за садржај који се може скроловати. Ширина је увек једнака ширини обавештења и мења се аутоматски при ротацији уређаја.
Apple Human Interface Guidelines упозоравају: интерфејс обавештења треба да буде концизан и да садржи само један главни елемент — слику, плејер, мапу или формулар за брзи унос. Вишеструки интерактивни елементи оптерећују корисника и отежавају интеракцију.
App Group — једини је механизам размене података између проширења и главне апликације. Кроз заједнички директоријум App Group-а могу се преносити кеширане слике, токени и подешавања. Директни позиви API-ја главне апликације или приступ њеном UserDefaults-у нису доступни због изолације процеса.
class NotificationViewController: UIViewController {
func didReceive(
_ notification: UNNotification
) {
guard let attachment = notification
.request.content.attachments.first()
else { return }
if attachment.url.startAccessingSecurityScopedResource() {
imageView.image = UIImage(contentsOfFile:
attachment.url.path)
attachment.url.stopAccessingSecurityScopedResource()
}
}
}
UNNotificationContentExtension — главни протокол који дефинише животни циклус прилагођеног обавештења. Протокол пружа методе за примање садржаја, обраду радњи и управљање интерфејсом.
didReceive(_:with:) се позива при пријему обавештења. Проширење добија објекат UNNotification и UNNotificationContentExtensionMediaPlayPauseButtonType за управљање медија плејером. У овој методи треба конфигурисати интерфејс — учитати слику, иницијализовати плејер или приказати податке. Систем позива ову методу сваки пут када се обавештење ажурира у реалном времену.
Важно је узети у обзир да проширење има ограничено време за извршење — око 30 секунди за пун циклус приказа. Ако интерфејс не буде припремљен за то време, iOS ће приказати системско обавештење. За тешке ресурсе — учитавање слика из мреже, декодовање видеа — препоручује се коришћење асинхроних операција са претходним кеширањем кроз App Group.
Протокол укључује опционе методе за дугмад play/pause: mediaPlay, mediaPause и mediaPlayPauseButtonType. Ако обавештење садржи аудио или видео садржај, проширење може приказати уграђени плејер са системским контролним елементом. iOS аутоматски додаје дугме за репродукцију у горњем десном углу проширења при враћању одговарајућег типа дугмета.
UNNotificationAttachment — објекат који садржи медијске податке прикачене уз обавештење. Слике, аудио датотеке и видео се додају у фази креирања обавештења на серверу или у Notification Service Extension-у кроз UNNotificationAttachment.
За слике: JPEG, PNG, GIF, HEIF. За аудио: MP3, AAC, ALAC, WAV. За видео: MPEG-4, H.264, HEVC. Максимална величина сваког прилога — 50 MB, до 4 прилога по обавештењу. Систем аутоматски преузима прилоге у позадини пре приказа обавештења и обезбеђује проширењу приступ локалним URL-овима кроз security-scoped ресурсе.
Према Apple-у, проширење не треба самостално да учитава медије — UNNotificationAttachment већ садржи локални URL након завршетка преузимања од стране система. Међутим, ако прилог није преузет на време (нпр. при слабој вези), проширење може приказати placeholder или алтернативни текст.
Сваки UNNotificationAttachment обезбеђује security-scoped URL, којем проширење мора приступити кроз startAccessingSecurityScopedResource() и ослободити га кроз stopAccessingSecurityScopedResource(). Ове методе морају бити позване у пару — у супротном ресурс неће бити ослобођен и изазваће цурење дозвола приступа.
let attachment = notification.request.content.attachments.first()
guard attachment.url.startAccessingSecurityScopedResource()
else { return }
defer { attachment.url.stopAccessingSecurityScopedResource() }
let data = try Data(contentsOf: attachment.url)
imageView.image = UIImage(data: data)
Notification Content Extension подржава прилагођене интерактивне радње — дугмад која се приказују испод садржаја обавештења. Радње се региструју при креирању категорије обавештења кроз UNNotificationCategory и могу бити деструктивне, текстуалне или позадинске.
UNNotificationAction — једноставна радња са насловом и опционим флагом деструктивности. UNTextInputNotificationAction — радња са пољем за унос текста, на пример за брзи одговор на поруку. Оба типа подржавају опцију UNNotificationActionOptions.authenticationRequired — захтев за откључавање уређаја пре извршења.
Проширење прима изабрану радњу кроз метод didReceive(_:withCompletionHandler:), где се прослеђује објекат UNNotificationResponse са идентификатором радње и опционим текстом. Проширење може обрадити одговор самостално или га проследити главној апликацији кроз заједнички контејнер App Group-а.
let category = UNNotificationCategory(
identifier: "message",
actions: [
UNTextInputNotificationAction(
identifier: "reply",
title: "Reply",
options: .authenticationRequired
),
UNNotificationAction(
identifier: "mark_read",
title: "Mark Read",
options: .foreground
)
],
intentIdentifiers: []
)
Често постављана питања
Content Extension је одговоран за визуелни приказ обавештења, а Service Extension — за измену садржаја пре приказа. Content Extension ради након Service Extension-а и не може променити payload обавештења.
Swift и Objective-C за UIKit. Од iOS 16, SwiftUI је такође подржан за креирање интерфејса обавештења кроз NotificationContentView са модификаторима величине и конфигурације.
Да, од iOS 16 проширење може користити SwiftUI кроз UIHostingController. Међутим, све компетенције UIKit-а — величина, ограничења, security-scoped ресурси — остају и примењују се на SwiftUI садржај.
До 4 прилога по обавештењу. Сваки прилог величине до 50 MB. Подржане су слике (JPEG, PNG, HEIF), аудио (MP3, AAC) и видео (MPEG-4, H.264).
Кроз App Group — заједнички директоријум на диску. UserDefaults са суфиксом app group такође ради. Директни позиви API-ја главне апликације нису доступни због изолације процеса проширења.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође