Notification Content Extension — суштина, прилагођени UI и подешавање у iOS-у

Аутор: IT Sectr Објављено: 2026-06-15 Време читања: 9 мин

Notification Content Extension — је тип iOS проширења који замењује стандардни шаблон push обавештења потпуно прилагођеним корисничким интерфејсом. Програмер добија могућност да приказује слике, аудио плејер, дугмад за радње, траке напретка и прилагођену анимацију унутар обавештења, проширујући стандардни банер у потпуну мини-апликацију. Према подацима WWDC 2025, проширење користи UNNotificationContentExtension и подржава до 4 медијска прилога у једном обавештењу, као и обраду интерактивних радњи кроз UNNotificationAction.

Главно

  • Notification Content Extension креира прилагођени интерфејс за push обавештења уместо стандардног системског шаблона
  • Архитектура се заснива на протоколу UNNotificationContentExtension са методама didReceive(_:with:) и didReceive(_:withCompletionHandler:)
  • Проширење може да приказује медијске прилоге — слике, аудио и видео — директно унутар обавештења без отварања апликације
  • Интерактивна обавештења подржавају прилагођене радње са повратном информацијом и уносом текста
  • Величина интерфејса је ограничена — максимална висина прилагођеног обавештења 320 тачака на iPhone-у и 352 на iPad-у

Шта је Notification Content Extension

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-у нису доступни због изолације процеса.

swift
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

UNNotificationContentExtension — главни протокол који дефинише животни циклус прилагођеног обавештења. Протокол пружа методе за примање садржаја, обраду радњи и управљање интерфејсом.

Метод didReceive:with:

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 или алтернативни текст.

Рад са security-scoped ресурсима

Сваки UNNotificationAttachment обезбеђује security-scoped URL, којем проширење мора приступити кроз startAccessingSecurityScopedResource() и ослободити га кроз stopAccessingSecurityScopedResource(). Ове методе морају бити позване у пару — у супротном ресурс неће бити ослобођен и изазваће цурење дозвола приступа.

swift
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-а.

swift
let category = UNNotificationCategory(
    identifier: "message",
    actions: [
        UNTextInputNotificationAction(
            identifier: "reply",
            title: "Reply",
            options: .authenticationRequired
        ),
        UNNotificationAction(
            identifier: "mark_read",
            title: "Mark Read",
            options: .foreground
        )
    ],
    intentIdentifiers: []
)

Често постављана питања

Која је разлика између Notification Content Extension и Service Extension?

Content Extension је одговоран за визуелни приказ обавештења, а Service Extension — за измену садржаја пре приказа. Content Extension ради након Service Extension-а и не може променити payload обавештења.

Који програмски језици су подржани?

Swift и Objective-C за UIKit. Од iOS 16, SwiftUI је такође подржан за креирање интерфејса обавештења кроз NotificationContentView са модификаторима величине и конфигурације.

Може ли се користити SwiftUI у Notification Content Extension-у?

Да, од 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-ја главне апликације нису доступни због изолације процеса проширења.

Закључак

  • Notification Content Extension замењује стандардни интерфејс обавештења прилагођеним са произвољним визуелним елементима
  • Архитектура користи протокол UNNotificationContentExtension са методама didReceive за ажурирање интерфејса
  • UNNotificationAttachment обезбеђује медијске прилоге са аутоматским позадинским преузимањем и security-scoped приступом
  • Интерактивне радње подржавају унос текста и деструктивне операције кроз UNNotificationAction
  • Максимална висина интерфејса — 320 тачака на iPhone-у, за прилагођавање садржаја препоручује се UIScrollView
  • Размена података са главном апликацијом — само кроз App Group и заједнички директоријум на диску

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође