Notification Extension: concepte cheie, tipuri de extensii și configurare

Autor: IT Sectr Publicat: 2026-03-20 Timp de citire: 8 min

Notification Extension este un mecanism iOS care permite modificarea conținutului și aspectului notificărilor push înainte de afișarea lor utilizatorului. Extensiile funcționează în sistemul de operare într-un proces separat: UNNotificationServiceExtension procesează conținutul primit, iar UNNotificationContentExtension gestionează interfața. Conform Apple Developer Documentation, 2026, Service Extension are până la 30 de secunde pentru a executa sarcinile înainte de afișarea notificării. Această limitare este critică la încărcarea atașamentelor sau la decriptarea datelor.

Principalele puncte

  • Service Extension — interceptează notificarea înainte de afișare, permite modificarea textului, adăugarea de media și decriptarea datelor cu o limită de 30 de secunde.
  • Content Extension — creează o interfață personalizată pentru notificare cu UI arbitrar, butoane și procesare atingeri prin storyboard sau SwiftUI.
  • Atașamente media — imagini, video și audio se adaugă prin UNNotificationAttachment în Service Extension înainte de transmiterea către Content Extension.
  • Înregistrare — ambele extensii se înregistrează în Info.plist ca target-uri separate cu specificarea categoriilor de notificări și NSExtensionPointIdentifier.
  • Limitări — extensiile nu au acces la aplicația principală, funcționează într-un sandbox izolat cu o limită de memorie de 50 MB.

Ce este Notification Extension

Notification Extension este o componentă software iOS care extinde comportamentul standard al notificărilor push, adăugând posibilitatea de modificare a conținutului și personalizare a interfeței. Spre deosebire de notificările obișnuite care sunt afișate de sistem în formă standard, extensiile permit dezvoltatorului să influențeze conținutul înainte de afișare și să creeze o interfață unică pentru utilizator.

Două tipuri de extensii de notificări

Apple oferă două tipuri de Notification Extension pentru scopuri diferite: UNNotificationServiceExtension se ocupă de procesarea payload-ului primit, iar UNNotificationContentExtension gestionează afișarea. Service Extension se lansează înainte de afișarea notificării și are timp limitat pentru execuție — până la 30 de secunde conform Apple Developer Documentation. Content Extension se activează după ce utilizatorul interacționează cu notificarea și afișează o vizualizare personalizată.

Diferența față de notificările standard

Notificarea push standard iOS este afișată automat de sistem pe baza câmpurilor alert, title și subtitle din JSON-payload. Notification Extension preia controlul: Service Extension primește payload-ul brut, îl modifică și îl transmite sistemului pentru afișare. Content Extension înlocuiește banner-ul standard cu o interfață arbitrară cu orice elemente de control.

Ciclul de viață al extensiei

Când dispozitivul primește o notificare push cu cheia mutable-content: 1, sistemul lansează Service Extension într-un proces separat. Procesul extensiei este izolat de aplicația principală și are propriul sandbox cu o limită de memorie de 50 MB. După finalizarea procesării, extensia apelează completion handler-ul, transmițând UNNotificationContent modificat sistemului pentru afișare.

UNNotificationServiceExtension: modificarea conținutului

UNNotificationServiceExtension este instrumentul principal pentru modificarea programatică a notificărilor push înainte de afișarea lor utilizatorului. Extensia se activează automat la primirea unei notificări în al cărei payload este setat flag-ul mutable-content: 1. În termen de 30 de secunde, extensia poate încărca un atașament media, poate modifica textul, poate decripta datele criptate sau poate îmbogăți conținutul.

Metodele protocolului UNNotificationServiceExtension

Extensia implementează două metode cheie din protocolul UNNotificationServiceExtension. Metoda didReceive primește cererea primită cu UNNotificationRequest brut și permite modificarea acesteia prin completion handler cu un nou UNNotificationContent. Metoda serviceExtensionTimeWillExpire este apelată de sistem cu o secundă înainte de expirarea timeout-ului — în ea trebuie să finalizați procesarea și să transmiteți rezultatul curent (posibil parțial).

Exemplu: adăugarea unei imagini la notificare

Să analizăm un scenariu în care serverul trimite un push cu URL-ul unei imagini într-un câmp personalizat. Service Extension încarcă această imagine prin rețea, creează UNNotificationAttachment și îl adaugă la conținut. UNNotificationAttachment primește un fișier local de imagine, video sau audio și îl copiază automat în sandbox-ul extensiei. După crearea atașamentului, extensia transmite conținutul actualizat sistemului.

swift
class NotificationService: UNNotificationServiceExtension {

    override func didReceive(_ request: UNNotificationRequest,
        withContentHandler contentHandler:
        @escaping (UNNotificationContent) -> Void) {

        let userInfo = request.content.userInfo
        guard let imageURL = URL(string: userInfo["image-url"] as! String)
        else { contentHandler(request.content); return }

        let attachment = try! UNNotificationAttachment(
            identifier: "image", url: imageURL,
            options: [UNNotificationAttachmentOptionsTypeHintKey: "jpg"])

        let modifiedContent = request.content.mutableCopy()
            as! UNMutableNotificationContent
        modifiedContent.attachments = [attachment]
        contentHandler(modifiedContent)
    }

    override func serviceExtensionTimeWillExpire() {
        contentHandler?(bestAttemptContent ?? request.content)
    }
}

Cache și reutilizare

La trimiterea frecventă a notificărilor cu aceleași atașamente, se recomandă stocarea în cache a fișierelor încărcate pe dispozitiv. FileManager oferă acces la directorul de cache al extensiei, care se păstrează între lansări. Aceasta reduce timpul de procesare a notificărilor ulterioare și scade încărcarea rețelei. Conform Apple, stocarea în cache a atașamentelor poate reduce timpul de procesare la 2–5 secunde în loc de încărcarea completă.

UNNotificationContentExtension: interfață personalizată

UNNotificationContentExtension permite înlocuirea banner-ului standard al notificării cu o interfață personalizată creată în Interface Builder sau SwiftUI. Extensia se activează când utilizatorul efectuează o acțiune cu notificarea: atingere, glisare în jos sau 3D Touch. Content Extension primește conținutul deja procesat de Service Extension și îl afișează într-o vizualizare personalizată.

Storyboard și categorii de notificări

Fiecare Content Extension este legat de una sau mai multe categorii de notificări prin Info.plist. Categoria este determinată pe server de câmpul category din payload-ul APNS. Sistemul selectează automat extensia potrivită pe baza categoriei notificării primite. Interfața se construiește prin storyboard folosind componente standard UIKit sau SwiftUI View.

Procesarea acțiunilor utilizatorului

Content Extension suportă butoane personalizate și gestionarea atingerilor definite în UNNotificationAction. UNNotificationAction se creează în etapa de înregistrare a categoriei și poate fi de tip introducere text prin UNTextInputNotificationAction. Când utilizatorul apasă un buton, extensia primește callback-ul didReceive cu identificatorul acțiunii și poate executa logica corespunzătoare — deschide un URL, trimite o cerere la server sau actualizează interfața.

Limitări de performanță

Content Extension funcționează într-un proces izolat cu propria buclă de execuție și o limită de memorie de aproximativ 50 MB. Performanța extensiei este critică, deoarece watchdog-ul sistemului termină procesul la depășirea limitelor. Se recomandă evitarea calculelor grele, încărcării imaginilor mari și cererilor de rețea lungi în interiorul Content Extension.

Atașamente media și UNNotificationAttachment

UNNotificationAttachment este un obiect care adaugă un fișier media la notificarea push: imagine, video, audio sau GIF. Atașamentul se creează dintr-un URL local al fișierului care trebuie să se afle în sandbox-ul extensiei. Dimensiunea maximă a atașamentului nu trebuie să depășească 10 MB, altfel sistemul va respinge atașamentul la creare.

Formate suportate

Apple suportă un set limitat de formate pentru atașamentele media. Imagini — JPEG, PNG, GIF (inclusiv animate), TIFF. Video — MPEG, MP4, MOV cu durata maximă de 30 de secunde. Audio — MP3, AAC, WAV, CAF. Pentru fiecare format se poate specifica tipul prin UNNotificationAttachmentOptionsTypeHintKey, ceea ce ajută sistemul să proceseze corect fișierul.

Încărcarea atașamentului din rețea

Deoarece payload-ul push conține doar URL-ul, nu și fișierul propriu-zis, încărcarea atașamentului trebuie efectuată în interiorul Service Extension. Timpul maxim de încărcare este limitat la 30 de secunde, de aceea se recomandă utilizarea URLSession cu setări minime și dezactivarea încărcării la semnal slab. Dacă atașamentul nu s-a încărcat la timp, notificarea se afișează fără media — acesta este comportamentul implicit al sistemului.

Exemplu de implementare în Swift

Să analizăm un exemplu complet de Notification Extension care încarcă o imagine, o descarcă și o adaugă la notificare. NotificationService moștenește UNNotificationServiceExtension și suprascrie metoda didReceive. În exemplu este prezentată procesarea câmpurilor opționale, crearea atașamentului și apelarea completion handler-ului cu conținutul modificat.

swift
import UserNotifications

class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(
        _ request: UNNotificationRequest,
        withContentHandler contentHandler:
        @escaping (UNNotificationContent) -> Void
    ) {
        self.contentHandler = contentHandler
        self.bestAttemptContent =
            (request.content.mutableCopy()
                as! UNMutableNotificationContent)

        guard let attachmentURLString =
            bestAttemptContent?.userInfo["attachment-url"] as? String,
            let url = URL(string: attachmentURLString)
        else {
            contentHandler(request.content)
            return
        }

        URLSession.shared.downloadTask(with: url) {
            [weak self] localURL, _, error in
            guard let localURL = localURL, error == nil
            else {
                contentHandler(request.content)
                return
            }
            let attachment = try! UNNotificationAttachment(
                identifier: "media", url: localURL)
            self?.bestAttemptContent?.attachments = [attachment]
            contentHandler(self?.bestAttemptContent
                ?? request.content)
        }.resume()
    }

    override func serviceExtensionTimeWillExpire() {
        if let content = bestAttemptContent {
            contentHandler?(content)
        }
    }
}

Configurarea Info.plist pentru extensie

Pentru funcționarea corectă a extensiei, trebuie înregistrate categoriile de notificări în Info.plist. Cheia NSExtensionPointIdentifier se setează la com.apple.usernotifications.service pentru Service Extension sau com.apple.usernotifications.content pentru Content Extension. Categoriile se definesc în AppDelegate la lansarea aplicației prin UNUserNotificationCenter, iar extensia se activează doar pentru notificările cu categoria corespunzătoare în payload.

Întrebări frecvente

Care este diferența dintre Service Extension și Content Extension?

Service Extension modifică conținutul înainte de afișarea notificării — adaugă media, schimbă textul, decriptează datele. Content Extension înlocuiește interfața notificării cu una personalizată după interacțiunea utilizatorului. Service Extension funcționează înainte de afișare, Content Extension — după.

Cât timp este alocat pentru procesare în Service Extension?

Sistemul alocă 30 de secunde pentru executarea codului în didReceive. Dacă procesarea nu se finalizează în acest timp, se apelează serviceExtensionTimeWillExpire, unde trebuie transmis rezultatul curent. Se recomandă încadrarea în 10–15 secunde, ținând cont de încărcarea atașamentelor.

Se poate folosi SwiftUI în Content Extension?

Da, SwiftUI este suportat în Content Extension începând cu iOS 16. View-ul se înfășoară în UIHostingController și se adaugă pe storyboard. Totuși, din cauza limitelor de memorie, se recomandă utilizarea SwiftUI doar pentru interfețe simple cu un număr minim de elemente.

Cum se gestionează erorile de încărcare a atașamentelor?

La eroare de încărcare sau depășire a limitei de timp, apelați completion handler-ul cu conținutul original fără atașament. Sistemul va afișa notificarea în formă standard fără media. Înregistrați erorile prin OSLog pentru diagnosticare, dar nu blocați afișarea notificării.

Care sunt limitele de memorie ale Notification Extension?

Extensia funcționează într-un proces izolat cu o limită de aproximativ 50 MB. La depășirea limitei, sistemul ucide procesul prin watchdog. Evitați încărcarea fișierelor mari, stocarea imaginilor în memorie și scurgerile de memorie la lucrul cu URLSession.

Rezumat

  • Notification Extension — mecanism iOS pentru modificarea notificărilor push, incluzând Service Extension (conținut) și Content Extension (interfață).
  • Service Extension procesează payload-ul înainte de afișarea notificării cu o limită de 30 de secunde, poate adăuga atașamente media și decripta date.
  • Content Extension înlocuiește banner-ul standard cu o interfață personalizată prin UIKit sau SwiftUI cu suport pentru butoane interactive.
  • UNNotificationAttachment adaugă imagini, video și audio la notificare, suportând formatele JPEG, PNG, MP4, MP3 și altele.
  • Înregistrarea extensiilor se face prin Info.plist cu specificarea NSExtensionPointIdentifier și a categoriilor de notificări pentru activare.
  • Limitări — limită de memorie de 50 MB, sandbox izolat fără acces la aplicația principală, timp de execuție limitat.
  • Notification Extension este un instrument cheie pentru crearea de notificări bogate, sporind implicarea și funcționalitatea comunicărilor push în iOS.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și