Notification Service Extension — како функционише обрада обавештења

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

Notification Service Extension је iOS проширење које пресреће push обавештење одмах након пријема, али пре приказивања кориснику. Проширење може да дешифрује шифровани payload, преузме и приложи медијску датотеку, измени текст или наслов обавештења у реалном времену. Према Apple Developer Documentation (2025), за активацију проширења сервер мора да пошаље кључ mutable-content:1 у атрибутима обавештења — то је једини услов за покретање UNNotificationServiceExtension.

Главне тачке

  • Notification Service Extension мења push обавештење пре његовог приказивања кориснику на iOS уређају
  • За активацију проширења потребан је параметар mutable-content:1 у payload-у обавештења са сервера
  • Основни протокол — UNNotificationServiceExtension са методама didReceive(_:withContentHandler:) и serviceExtensionTimeWillExpire()
  • Проширење може да преузима медијске прилоге из мреже и прилаже их обавештењу путем UNNotificationAttachment
  • Време извршења је ограничено — систем додељује око 30 секунди за потпуну обраду једног обавештења

Шта је Notification Service Extension

Notification Service Extension је app проширење у iOS-у које пресреће долазно push обавештење на страни уређаја и омогућава измену његовог садржаја пре него што га корисник види. Ово је једини тип проширења обавештења који ради са садржајем, а не са приказивањем.

Кључна разлика у односу на Notification Content Extension: Service Extension ради пре приказивања обавештења и може да измени наслов, тело, звучну датотеку и прилоге. Content Extension ради после приказивања и управља само визуелним приказом готовог обавештења. Ова два проширења могу да раде заједно: Service Extension преузима слику, а Content Extension је приказује у прилагођеном интерфејсу.

Проширење се аутоматски активира при пријему push обавештења са атрибутом mutable-content:1 у aps речнику. iOS покреће проширење у позадини, прослеђује му оригинални UNNotificationRequest и очекује измењену верзију за приказивање.

Обрада push обавештења у лету

UNNotificationServiceExtension прима пуни UNNotificationRequest са оригиналним садржајем. Проширење може да модификује било која поља UNNotificationContent: title, subtitle, body, userInfo, attachments и sound. Измене се примењују пре него што обавештење буде приказано.

Типични сценарији коришћења

Дешифровање садржаја — ако push обавештење садржи шифровани payload, проширење га дешифрује пре приказивања. Преузимање медија — прилагање слике или видеа обавештењу. Локализација — прилагођавање текста обавештења регионалним подешавањима уређаја. Обогаћивање података — додавање додатних информација из локалног складишта или кеша.

Према Apple-у, најчешћи сценариј међу апликацијама је преузимање слика за богата медијска обавештења. Сервер шаље URL слике у payload-у, проширење је преузима у привремени директоријум и креира UNNotificationAttachment који систем приказује у стандардном или прилагођеном интерфејсу.

Измена текста и наслова

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

swift
override func didReceive(
    _ request: UNNotificationRequest,
    withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
    let content = request.content.mutableCopy()
        as! UNMutableNotificationContent
    if let imageURL = content.userInfo["media-url"]
        as? String {
        downloadAndAttach(imageURL: imageURL,
            content: content,
            handler: contentHandler)
    }
}

Протокол UNNotificationServiceExtension

UNNotificationServiceExtension — основна класа од које наслеђује Service Extension. Класа дефинише две методе животног циклуса: didReceive(_:withContentHandler:) — главна метода обраде, и serviceExtensionTimeWillExpire() — руковалац истека времена.

Метода didReceive:withContentHandler:

didReceive(_:withContentHandler:) се позива при пријему обавештења. Проширење прима UNNotificationRequest и затварање contentHandler које треба позвати са измењеним UNMutableNotificationContent. Проширење је обавезно да позове contentHandler — ако то не уради, iOS ће приказати оригинално обавештење након истека времена.

Важно: проширење може да обрађује само једно обавештење истовремено. Ако стигне више обавештења истовремено, iOS креира засебне инстанце проширења за свако. Не може се користити глобално стање за секвенцијалну обраду.

Метода serviceExtensionTimeWillExpire:

serviceExtensionTimeWillExpire() позива систем када преостало време извршења приђе крају. У овој методи треба одмах позвати contentHandler са садржајем који је спреман у том тренутку — чак и ако се медијска датотека још није преузела. Ако се contentHandler не позове у овој методи, iOS ће приказати оригинално обавештење.

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

Шифровање и медијски прилози

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

Креирање прилога из преузете датотеке

UNNotificationAttachment се креира помоћу иницијализатора init(identifier:url:options:). URL мора да указује на локалну датотеку у привременом директоријуму доступном проширењу. Након креирања, прилог се додаје у низ attachments у UNMutableNotificationContent.

Apple препоручује коришћење URLSession са позадинском конфигурацијом за преузимање — при коришћењу стандардног URLSession-а, преузимање блокира нит и троши време од 30-секундног лимита. Позадински URLSession наставља преузимање чак и по завршетку проширења, а резултат се може користити при следећем покретању.

Дешифровање шифрованог payload-а

Ако сервер шаље шифровано обавештење, проширење мора да дешифрује payload пре позивања contentHandler-а. Дешифровање обично укључује захтев за кључем из Keychain-а или App Group-а, дешифровање путем CommonCrypto-а и замену body или userInfo обавештења. При грешци дешифровања треба позвати contentHandler са оригиналним садржајем — како би корисник бар видео да је обавештење стигло, макар и нечитко.

swift
func downloadAndAttach(
    imageURL: String,
    content: UNMutableNotificationContent,
    handler: @escaping (UNNotificationContent) -> Void
) {
    let task = URLSession.shared.dataTask(with:
        URL(string: imageURL)!) { data, _, _ in
        let url = FileManager.default
            .temporaryDirectory
            .appendingPathComponent("image.jpg")
        try? data?.write(to: url)
        let attachment = try? UNNotificationAttachment(
            identifier: "image", url: url)
        content.attachments = [attachment].compactMap { $0 }
        handler(content)
    }
    task.resume()
}

Тајмаути и fallback механизми

Notification Service Extension ради у строгим временским оквирима. iOS додељује фиксно време за извршење — око 30 секунди од тренутка активације. Ако проширење не позове contentHandler за то време, систем принудно завршава процес и приказује оригинално обавештење без измена.

Стратегија graceful degradation

Препоручује се имплементација вишеслојног fallback-а: прво покушати преузети медиј, при успеху — позвати contentHandler са комплетним садржајем; при неуспеху — позвати contentHandler са текстом, али без медија; при критичној грешци — проследити оригинални садржај. Овакав приступ гарантује да ће корисник увек видети обавештење, а не празан екран.

Према Apple-у, најчешћи узрок тајмаута је преузимање великих медијских датотека при спорој вези. За смањење ризика препоручује се оптимизација величине слика на серверу — слање прегледа до 300 KB уместо пуне резолуције. Слике пуне резолуције треба преузимати тек при отварању апликације.

Праћење перформанси

За праћење тајмаута и грешака проширења може се користити os_log за записивање дијагностичких порука у Unified Logging System. Иако је директно евидентирање у датотеку у проширењу отежано, os_log омогућава анализу перформанси путем Console.app на уређају програмера. Apple препоручује додавање метрика при сваком позиву didReceive — време преузимања, величина датотеке, резултат операције.

swift
override func serviceExtensionTimeWillExpire() {
    let fallback = bestEffortContent as?
        UNMutableNotificationContent
        ?? request.content.mutableCopy()
        as! UNMutableNotificationContent
    contentHandler(fallback)
}

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

Како сервер активира Notification Service Extension?

Сервер додаје кључ mutable-content:1 у aps речник push обавештења. Без овог параметра, систем игнорише проширење и приказује стандардно обавештење.

Може ли се проширење користити без mutable-content?

Не. mutable-content:1 је обавезан услов за активацију Service Extension-а. Ако кључ недостаје или је постављен на 0, обавештење се приказује без позивања проширења.

Шта се дешава при прекорачењу лимита од 30 секунди?

iOS принудно завршава проширење и приказује оригинално обавештење без измена. Да бисте то избегли, имплементирајте serviceExtensionTimeWillExpire() са минимално прихватљивим садржајем.

Како проследити кључеве за шифровање у проширење?

Путем App Group (заједнички UserDefaults или датотека) или Keychain-а са заједничким приступом између апликације и проширења. Директно прослеђивање кључева у payload-у обавештења није безбедно.

Колико медијских датотека се може приложити у Service Extension-у?

До 4 прилога по обавештењу, сваки до 50 MB. Укупна величина прилога утиче на време преузимања — што више датотека, већи је ризик од тајмаута.

Резиме

  • Notification Service Extension мења push обавештења на уређају пре приказивања, уређујући текст, наслов и медијске прилоге
  • За активацију је потребан кључ mutable-content:1 у aps речнику — без њега проширење не стартује
  • Основни протокол UNNotificationServiceExtension дефинише методе didReceive и serviceExtensionTimeWillExpire за обраду
  • Проширење може да преузима медије из мреже, дешифрује payload и додаје до 4 прилога обавештењу
  • Време извршења је ограничено на око 30 секунди — при прекорачењу iOS приказује оригинално обавештење
  • Препоручује се стратегија graceful degradation са вишеслојним fallback-ом за спречавање празних обавештења

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

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

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

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