Notification Service Extension — istifadəçiyə göstərilməzdən əvvəl push-bildirişini tutan və məzmunu dəyişdirməyə imkan verən iOS genişləndirilməsidir. Genişləndirmə şifrələnmiş məlumatları deşifrə edə, media əlavələrini yükləyə, mətni dəyişə və ya xüsusi sahələr əlavə edə bilər. Apple Developer, 2025 məlumatına görə, Notification Service Extension fon rejimində tapşırığı yerinə yetirmək üçün 30 saniyəyə qədər vaxta malikdir.
Əsas
Notification Service Extension — push-bildirişinin göstərilməsindən əvvəl işə düşən iOS app extension-dir. O, serverə minimal payload göndərməyə imkan verir, genişləndirmə isə onu məzmunla tamamlayır: şəkilləri endirir, məlumatları deşifrə edir, mətni əvəz edir. İstifadəçi artıq hazır, işlənmiş bildiriş görür.
iOS push-bildirişini aldıqda sistem bu tətbiq üçün genişləndirmənin mövcudluğunu yoxlayır. Genişləndirmə qeydiyyatdan keçibsə, iOS onu fon prosesində işə salır və bildirişin məzmununu didReceive(_:withContentHandler:) metodu vasitəsilə ötürür. Genişləndirmə məzmunu emal edir və dəyişdirilmiş məzmunla contentHandler çağırır. Genişləndirmə 30 saniyə ərzində çatdıra bilmirsə, sistem orijinal bildirişi göstərir.
Service Extension bildiriş məzmununun cihazda emalını tələb edən ssenarilərdə zəruridir. Təhlükəsiz kommunikasiya: server şifrələnmiş payload göndərir, genişləndirmə onu yerli olaraq deşifrə edir. Zəngin media bildirişləri: server şəklin URL-ni göndərir, genişləndirmə onu endirib birləşdirir. Dinamik lokallaşdırma: genişləndirmə mətni cihazın dilində əvəz edir.
| Ssenari | Genişləndirmə olmadan | Genişləndirmə ilə |
|---|---|---|
| Şəkil | Dəstəklənmir | Endirilir və göstərilir |
| Şifrələmə | Açarı server saxlayır | Cihazda deşifrə |
| Mətn | Serverdə sabit müəyyən edilib | Dinamik əvəzetmə |
| Validasiya | Yoxlanılmır | Zərərli bildirişlərin ləğvi |
Notification Service Extension məhdud mühitdə işləyir. Maksimum icra müddəti — 30 saniyə. Genişləndirmə tətbiqin əsas yaddaşına (App Group istisna olmaqla) giriş imkanına malik deyil. Genişləndirmənin ölçüsü 50 MB ilə məhduddur. Müddət aşıldıqda sistem contentHandler-ı orijinal məzmunla çağırır və bütün dəyişikliklər itirilir.
Xcode-da Notification Service Extension, Notification Service Extension tipli yeni target yaradılaraq əlavə edilir. Xcode UNNotificationServiceExtension-dan miras alan və iki metodu — didReceive və serviceExtensionTimeWillExpire — olan NotificationService sinfinin şablonunu generasiya edir.
Xcode-da File → New → Target → Notification Service Extension seçin. Adı (məsələn, PushNotificationService) və Swift dilini qeyd edin. Target-ın əsas tətbiqə əlavə edildiyinə və düzgün imzaya malik olduğuna əmin olun. Yaradıldıqdan sonra əsas reallaşdırma ilə NotificationService.swift sinfi generasiya ediləcək.
Genişləndirmənin Info.plist faylı NSExtensionPointIdentifier (com.apple.usernotifications.service) və NSExtensionPrincipalClass (kontrollerinizin adı) alt-ayarları olan NSExtension açarını ehtiva edir. Əlavə olaraq genişləndirmənin aktivləşdirmə qaydaları ilə NSExtensionAttributes göstərilə bilər. Bu ayarları Xcode avtomatik generasiya edir.
Əsas reallaşdırma didReceive-ı əvəz edir, bildirişin məzmununu dəyişdirir və contentHandler çağırır. Emal çox vaxt aparırsa, cari vəziyyətlə işi tamamlamaq lazım olan serviceExtensionTimeWillExpire çağırılır.
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
contentHandler = handler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
bestAttemptContent.title = "[Emal edildi] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Service Extension-ın əsas tətbiqlərindən biri bildiriş məzmununun cihazda deşifrə edilməsidir. Server şifrələnmiş payload göndərir, genişləndirmə isə Keychain və ya App Group-da saxlanan açardan istifadə edərək onu deşifrə edir. Bu, məzmunun ötürmə zamanı ələ keçirilməsini qeyri-mümkün edir.
Server bildirişin gövdəsini simmetrik açardan (AES-256) istifadə edərək şifrələyir. Şifrələmə açarı əvvəlcədən müştəri və server arasında razılaşdırılır. Genişləndirmə payload-ın data sahəsində şifrələnmiş sətri alır, onu deşifrə edir və bildiriş sahələrinə əlavə edir. İstifadəçi açarı autentifikasiyadan sonra Keychain-dən əldə edilə bilər.
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
guard let content = request.content.mutableCopy()
as? UNMutableNotificationContent else {
handler(request.content)
return
}
guard let encryptedData = content.userInfo["encrypted_data"]
as? String else {
handler(content)
return
}
let decrypted = CryptoService.decrypt(encryptedData)
content.body = decrypted.body
content.title = decrypted.title
handler(content)
}
Deşifrə açarı genişləndirmənin kodunda və ya NSUserDefaults-da saxlanılmamalıdır. Həm tətbiqin, həm də genişləndirmənin açarı oxuya bilməsi üçün App Group vasitəsilə girişi olan iOS Keychain-dən istifadə edin. Müştəri tərəfində açarın generasiyası üçün AES-256-GCM alqoritmi ilə Security.framework-dən istifadə edin.
Notification Service Extension-ın ən çox yayılmış tətbiqi — bildirişdə göstərmək üçün şəkillərin, GIF-lərin və videoların endirilməsidir. Server media faylının URL-ni göndərir, genişləndirmə isə onu endirir, müvəqqəti kataloqda saxlayır və UNNotificationAttachment yaradır.
Genişləndirmə şəklin URL-ni bildirişin payload sahəsindən alır. URLSession istifadə edərək genişləndirmə faylı müvəqqəti kataloqa endirir. Yükləmə tamamlandıqdan sonra yerli URL ilə UNNotificationAttachment yaradılır. Əlavə dəyişdirilmiş məzmuna ötürülür. iOS avtomatik olaraq şəkli standart interfeysdə və ya Notification Content Extension-da göstərir.
private func downloadAndAttachMedia(
content: UNMutableNotificationContent,
mediaUrl: String,
handler: @escaping (UNNotificationContent) -> Void
) {
guard let url = URL(string: mediaUrl) else {
handler(content)
return
}
let task = URLSession.shared.downloadTask(with: url) { localUrl, _, error in
guard let localUrl = localUrl, error == nil else {
handler(content)
return
}
let attachment = try? UNNotificationAttachment(
identifier: "media",
url: localUrl,
options: nil
)
if let attachment = attachment {
content.attachments = [attachment]
}
handler(content)
}
task.resume()
}
iOS bildirişlərdə göstərmək üçün aşağıdakı formatları dəstəkləyir: JPEG, PNG, GIF (statik), 50 MB-a qədər MPEG-4 video. Audio fayllar üçün MP3, AAC və ALAC dəstəklənir. Vacib: bütün media faylları 30 saniyəlik limit ərzində endirilməlidir. Böyük fayllar üçün server tərəfində kəsmə və ya mütərəqqi yükləmədən istifadə etmək tövsiyə olunur.
30 saniyəlik limitin idarə edilməsi — Notification Service Extension-ın hazırlanmasında əsas vəzifədir. Genişləndirmə emalı tamamlamağa çatmırsa, sistem serviceExtensionTimeWillExpire çağırır və orijinal məzmunu göstərir. Hər emal növü üçün fallback ssenariləri nəzərdə tutmaq lazımdır.
Tapşırıqları prioritetlərə görə bölün. Kritik dəyişiklikləri (deşifrə, əsas lokallaşdırma) birinci növbədə yerinə yetirin. İstəyə bağlı təkmilləşdirmələri (şəkillərin endirilməsi, mətnin zənginləşdirilməsi) ikinci növbədə. Bütün limiti bir əməliyyata xərcləməmək üçün şəbəkə sorğuları üçün vaxt limitləri olan URLSession-dan istifadə edin.
Şəklin endirilməsi uğursuz olarsa və ya payload-ın deşifrəsi xəta qaytararsa, genişləndirmə contentHandler-ı orijinal məzmunla çağırmalıdır. Genişləndirməni heç vaxt contentHandler çağırmadan tamamlama — bu, bildirişin itirilməsinə səbəb olur. Genişləndirmənin kodunda həmişə təhlükəsiz fallback nəzərdə tutulmalıdır.
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// Kritik tapşırıq: deşifrə
var decryptedContent = tryDecryptPayload(content)
// İstəyə bağlı tapşırıq: media
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
Notification Service Extension-ı test etmək üçün Xcode-dan istifadə edin: genişləndirmənin target-ını seçin, simulyatorda işə salın və terminal və ya Firebase Console vasitəsilə push-bildiriş göndərin. Emalın hər mərhələsini os_log vasitəsilə jurnala yazın — bu, vaxt və yükləmə xətaları ilə bağlı problemləri diaqnoz etməyə kömək edir.
Tez-tez verilən suallar
Sistem serviceExtensionTimeWillExpire çağıracaq, bundan sonra orijinal bildirişi dəyişiklik olmadan göstərəcək. Bütün endirilmiş fayllar və dəyişikliklər ləğv ediləcək.
Bəli, contentHandler boş məzmunla (boş sahələri olan UNNotificationContent) çağırılarsa, bildiriş göstərilməyəcək. Bu, spam bildirişlərinin və ya səhv məlumatların filtirlənməsi üçün istifadə olunur.
Tokeni bildirişin userInfo payload-ında ötürmək və ya App Group vasitəsilə Keychain-dən əldə etmək olar. Tokenləri genişləndirmənin UserDefaults-da saxlamaq tövsiyə olunmur.
Genişləndirmə əsas tətbiqlə eyni developer sertifikatı ilə imzalanmalıdır. Prodakşn üçün Push Notifications capability-si aktiv olan production sertifikatı tələb olunur.
Cihazı Xcode-a qoşun, işə salma sxemində genişləndirmənin target-ını seçin və Firebase Console vasitəsilə push-bildiriş göndərin. Genişləndirmədəki breakpointlər əsas tətbiqdəki kimi işləyir.
Nəticələr
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