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 — 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.
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.
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.
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.
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 — 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:) 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() 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ş.
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.
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.
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ə.
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()
}
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.
Ç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.
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.
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
Tez-tez verilən suallar
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.
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.
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.
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.
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ə
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.
Həm də oxuyun