Notification Service Extension — bildiriş emalı necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-06-16 Oxuma vaxtı: 9 dəq

Notification Service Extension — bu, push bildirişini istifadəçiyə göstərilməzdən əvvəl ələ keçirən iOS genişlənməsidir. Genişlənmə şifrələnmiş payload-u deşifrə edə, mediya faylını yükləyib əlavə edə, bildirişin mətnini və ya başlığını real vaxtda dəyişə bilər. Apple Developer Documentation (2025) məlumatına görə, genişlənməni aktivləşdirmək üçün server bildiriş atributlarında mutable-content:1 açarını göndərməlidir — bu UNNotificationServiceExtension-in işə düşməsi üçün yeganə şərtdir.

Əsas məqamlar

  • Notification Service Extension push bildirişini iOS cihazında istifadəçiyə göstərilməzdən əvvəl dəyişdirir
  • Genişlənmənin aktivləşməsi üçün serverdən bildiriş payload-da mutable-content:1 parametri tələb olunur
  • Əsas protokol — UNNotificationServiceExtension didReceive(_:withContentHandler:) və serviceExtensionTimeWillExpire() metodları ilə
  • Genişlənmə şəbəkədən mediya əlavələrini yükləyib UNNotificationAttachment vasitəsilə bildirişə əlavə edə bilər
  • İcra müddəti məhduddur — sistem bir bildirişin tam emalı üçün təxminən 30 saniyə ayırır

Notification Service Extension nədir

Notification Service Extension — iOS-da app extensiondir, cihaz tərəfindən daxil olan push bildirişini ələ keçirir və istifadəçi onu görməzdən əvvəl məzmununu dəyişməyə imkan verir. Bu, məzmunla işləyən, göstərilmə ilə deyil, yeganə bildiriş genişlənmə növüdür.

Notification Content Extension-dən əsas fərq: Service Extension bildirişin göstərilməsindən əvvəl işləyir və başlığı, mətni, səs faylını və əlavələri dəyişə bilər. Content Extension göstərilmədən sonra işləyir və yalnız hazır bildirişin vizual təqdimatını idarə edir. Bu iki genişlənmə birlikdə işləyə bilər: Service Extension şəkli yükləyir, Content Extension isə onu xüsusi interfeysdə göstərir.

Genişlənmə aps-lüğətində mutable-content:1 atributu olan push bildirişi alındıqda avtomatik aktivləşir. iOS genişlənməni fon rejimində işə salır, ona orijinal UNNotificationRequest göndərir və göstərilmək üçün dəyişdirilmiş versiyanı gözləyir.

Push bildirişlərinin anında emalı

UNNotificationServiceExtension orijinal məzmunu olan tam UNNotificationRequest alır. Genişlənmə UNNotificationContent-in istənilən sahəsini dəyişə bilər: title, subtitle, body, userInfo, attachments və sound. Dəyişikliklər bildiriş göstərilməzdən əvvəl tətbiq olunur.

Tipik istifadə ssenariləri

Məzmunun deşifrə edilməsi — push bildirişi şifrələnmiş payload ehtiva edirsə, genişlənmə onu göstərməzdən əvvəl deşifrə edir. Mediya yükləmə — bildirişə şəkil və ya video əlavə etmək. Lokallaşdırma — bildiriş mətninin cihazın regional parametrlərinə uyğunlaşdırılması. Məlumatların zənginləşdirilməsi — yerli yaddaşdan və ya keşdən əlavə məlumatların əlavə edilməsi.

Apple məlumatına görə, tətbiqlər arasında ən çox yayılmış ssenari zəngin mediya bildirişləri üçün şəkillərin yüklənməsidir. Server payload-da şəkil URL-i göndərir, genişlənmə onu müvəqqəti kataloqa endirir və sistemin standart və ya xüsusi interfeysdə göstərdiyi UNNotificationAttachment yaradır.

Mətnin və başlığın dəyişdirilməsi

Genişlənmə bildirişin text sahəsini tamamilə yenidən yaza, başlığı dəyişə və ya subtitle əlavə edə bilər. Məsələn, mesajlaşma tətbiqi şifrələnmiş bildiriş ala, onu genişlənmədə deşifrə edə və oxunaqlı mətn göstərə bilər. Xəbər tətbiqi göstərməzdən əvvəl alt başlığa xəbər kateqoriyasını əlavə edə bilər.

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 protokolu

UNNotificationServiceExtension — Service Extension-in varis olduğu əsas sinif. Sinif iki həyat dövrü metodunu müəyyən edir: didReceive(_:withContentHandler:) — əsas emal metodu, və serviceExtensionTimeWillExpire() — vaxtın bitməsi işləyicisi.

didReceive:withContentHandler: metodu

didReceive(_:withContentHandler:) bildiriş alındıqda çağırılır. Genişlənmə UNNotificationRequest və dəyişdirilmiş UNMutableNotificationContent ilə çağırılmalı olan contentHandler closure-nu alır. Genişlənmə contentHandler-i çağırmalıdır — əgər bu edilməzsə, iOS vaxt aşımından sonra orijinal bildirişi göstərəcək.

Vacib: genişlənmə bir dəfə yalnız bir bildirişi emal edə bilər. Eyni anda bir neçə bildiriş gələrsə, iOS hər biri üçün ayrı genişlənmə nümunələri yaradır. Ardıcıl emal üçün qlobal vəziyyətdən istifadə etmək olmaz.

serviceExtensionTimeWillExpire: metodu

serviceExtensionTimeWillExpire() sistem tərəfindən qalan icra müddəti sona çatdıqda çağırılır. Bu metodda dərhal contentHandler-i hazır olan məzmunla çağırmaq lazımdır — hətta mediya faylı hələ yüklənməmiş olsa belə. Bu metodda contentHandler çağırılmazsa, iOS orijinal bildirişi göstərəcək.

Bu metodda minimal qəbul edilə bilən məzmun saxlamaq tövsiyə olunur — məsələn, mətn və başlıqlı, lakin vaxtında yüklənməmiş şəkli olmayan bildiriş.

Şifrələmə və mediya əlavələri

UNNotificationAttachment — genişlənmə tərəfindən bildirişə mediya faylı əlavə etmək üçün yaradılan obyekt. Genişlənmə faylı şəbəkədən yükləyir, müvəqqəti kataloqa saxlayır və məzmun növünü göstərən UNNotificationAttachment yaradır.

Yüklənmiş fayldan əlavənin yaradılması

UNNotificationAttachment init(identifier:url:options:) initilizatoru ilə yaradılır. URL genişlənmə üçün əlçatan olan müvəqqəti kataloqdakı yerli faylı göstərməlidir. Əlavə yaradıldıqdan sonra UNMutableNotificationContent-in attachments massivinə əlavə olunur.

Apple yükləmə üçün fon konfiqurasiyası ilə URLSession istifadəsini tövsiyə edir — standart URLSession istifadə edildikdə yükləmə thread-i bloklayır və 30 saniyəlik limitdən vaxt sərf edir. Fon URLSession genişlənmə başa çatsa belə yükləməni davam etdirir və nəticə növbəti işə salınmada istifadə oluna bilər.

Şifrələnmiş payload-un deşifrə edilməsi

Server şifrələnmiş bildiriş göndərərsə, genişlənmə contentHandler-i çağırmazdan əvvəl payload-u deşifrə etməlidir. Deşifrə adətən Keychain və ya App Group-dan açarın alınması, CommonCrypto vasitəsilə şifrənin açılması və bildirişin body və ya userInfo sahəsinin dəyişdirilməsini əhatə edir. Deşifrə xətası halında contentHandler orijinal məzmunla çağırılmalıdır — istifadəçi heç olmasa bildirişin gəldiyini görsün, hətta oxunmasa belə.

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()
}

Vaxt aşımı və fallback mexanizmləri

Notification Service Extension sərt vaxt çərçivəsində işləyir. iOS aktivasiya anından etibarən təxminən 30 saniyə sabit icra müddəti ayırır. Genişlənmə bu müddət ərzində contentHandler-i çağırmazsa, sistem prosesi məcburi dayandırır və orijinal bildirişi dəyişikliksiz göstərir.

Graceful degradation strategiyası

Çoxsəviyyəli fallback tətbiq etmək tövsiyə olunur: əvvəlcə mediyanı yükləməyə cəhd etmək, uğur qazanıldıqda — tam məzmunla contentHandler-i çağırmaq; uğursuzluq halında — mətnlə, lakin mediyasız contentHandler-i çağırmaq; kritik xəta olduqda — orijinal məzmunu ötürmək. Bu yanaşma istifadəçinin həmişə bildiriş görməsini təmin edir, boş ekran deyil.

Apple məlumatına görə, vaxt aşımının ən çox yayılmış səbəbi yavaş əlaqədə böyük mediya fayllarının yüklənməsidir. Riski azaltmaq üçün serverdə şəkillərin ölçüsünü optimallaşdırmaq tövsiyə olunur — tam rezolyusiya əvəzinə 300 KB-a qədər önəm göndərmək. Tam ölçülü şəkilləri tətbiq açıldıqda yükləmək daha yaxşıdır.

Performans monitorinqi

Vaxt aşımlarını və genişlənmə xətalarını izləmək üçün Unified Logging System-də diaqnostik mesajlar yazmaq üçün os_log istifadə edilə bilər. Genişlənmədə fayla birbaşa loglama çətin olsa da, os_log Console.app vasitəsilə tərtibatçı cihazında performansı təhlil etməyə imkan verir. Apple hər didReceive çağırışına metrikalar əlavə etməyi tövsiyə edir — yükləmə vaxtı, fayl ölçüsü, əməliyyat nəticəsi.

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

Tez-tez verilən suallar

Server Notification Service Extension-i necə aktivləşdirir?

Server push bildirişinin aps lüğətinə mutable-content:1 açarını əlavə edir. Bu parametr olmadan sistem genişlənməni nəzərə almır və standart bildiriş göstərir.

Genişlənməni mutable-content olmadan istifadə etmək olar?

Xeyr. mutable-content:1 Service Extension-in aktivləşməsi üçün məcburi şərtdir. Açar yoxdursa və ya 0-a təyin edilibsə, bildiriş genişlənmə çağırılmadan göstərilir.

30 saniyəlik limit aşıldıqda nə baş verir?

iOS genişlənməni məcburi dayandırır və orijinal bildirişi dəyişikliksiz göstərir. Bunun qarşısını almaq üçün minimal qəbul edilə bilən məzmunla serviceExtensionTimeWillExpire() tətbiq edin.

Şifrələmə açarlarını genişlənməyə necə ötürmək olar?

App Group (ümumi UserDefaults və ya fayl) və ya tətbiq və genişlənmə arasında ümumi girişi olan Keychain vasitəsilə. Açarların birbaşa bildiriş payload-da ötürülməsi təhlükəsiz deyil.

Service Extension-də neçə mediya faylı əlavə etmək olar?

Bir bildiriş üçün 4 əlavəyə qədər, hər biri 50 MB-a qədər. Əlavələrin ümumi ölçüsü yükləmə müddətinə təsir edir — nə qədər çox fayl varsa, vaxt aşımı riski bir o qədər yüksəkdir.

Nəticə

  • Notification Service Extension push bildirişlərini cihazda göstərilməzdən əvvəl dəyişdirir, mətni, başlığı və mediya əlavələrini redaktə edir
  • Aktivləşmə üçün aps lüğətində mutable-content:1 açarı tələb olunur — olmadan genişlənmə işə düşmür
  • Əsas protokol UNNotificationServiceExtension emal üçün didReceive və serviceExtensionTimeWillExpire metodlarını müəyyən edir
  • Genişlənmə şəbəkədən mediya yükləyə, payload-u deşifrə edə və bildirişə 4 əlavəyə qədər əlavə edə bilər
  • İcra müddəti təxminən 30 saniyə ilə məhdudlaşır — limit aşıldıqda iOS orijinal bildirişi göstərir
  • Boş bildirişlərin qarşısını almaq üçün çoxsəviyyəli fallback ilə graceful degradation strategiyası tövsiyə olunur

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun