Notification Extension iOS mexanizmidir ki, push bildirişlərinin məzmununu və görünüşünü istifadəçiyə göstərilməzdən əvvəl dəyişdirməyə imkan verir. Genişləndirmələr əməliyyat sistemi tərəfindən ayrıca prosesdə işləyir: UNNotificationServiceExtension daxil olan məzmunu emal edir, UNNotificationContentExtension isə interfeysi idarə edir. Apple Developer Documentation, 2026-ya görə, Service Extension bildiriş göstərilməzdən əvvəl tapşırıqları yerinə yetirmək üçün 30 saniyəyə qədər vaxt alır. Bu məhdudiyyət qoşmaların yüklənməsi və ya məlumatların şifrəsinin açılması zamanı kritikdir.
Əsas məqamlar
Notification Extension iOS-un proqram komponentidir ki, push bildirişlərinin standart davranışını genişləndirir, məzmun modifikasiyası və interfeysin fərdiləşdirilməsi imkanı əlavə edir. Adi bildirişlərdən fərqli olaraq, sistem tərəfindən standart formada göstərilən bildirişlər əvəzinə, genişləndirmələr proqramçıya göstərilməzdən əvvəl məzmuna təsir etməyə və unikal istifadəçi interfeysi yaratmağa imkan verir.
Apple müxtəlif məqsədlər üçün iki növ Notification Extension təqdim edir: UNNotificationServiceExtension daxil olan payload-un emalına cavabdehdir, UNNotificationContentExtension isə göstərilməni idarə edir. Service Extension bildiriş göstərilməzdən əvvəl işə düşür və Apple Developer Documentation-a görə icra üçün məhdud vaxt — 30 saniyəyə qədər alır. Content Extension istifadəçi bildirişlə qarşılıqlı əlaqədə olduqdan sonra aktivləşir və fərdi görünüşü göstərir.
Standart iOS push bildirişi sistem tərəfindən JSON-payload-dakı alert, title və subtitle sahələri əsasında avtomatik göstərilir. Notification Extension idarəetməni ələ keçirir: Service Extension xam payload alır, onu dəyişdirir və göstərilmək üçün sistemə ötürür. Content Extension standart banneri istənilən idarəetmə elementləri ilə fərdi interfeyslə əvəz edir.
Cihaz mutable-content: 1 açarı olan push bildirişi aldıqda, sistem ayrıca prosesdə Service Extension-u işə salır. Genişləndirmə prosesi əsas tətbiqdən izolyasiya olunur və 50 MB yaddaş limiti ilə öz qum qutusuna malikdir. Emal bitdikdən sonra genişləndirmə completion handler-i çağırır, dəyişdirilmiş UNNotificationContent-u göstərilmək üçün sistemə ötürür.
UNNotificationServiceExtension push bildirişlərini istifadəçiyə göstərilməzdən əvvəl proqramlı şəkildə dəyişdirmək üçün əsas vasitədir. Genişləndirmə payload-da mutable-content: 1 bayrağı qoyulmuş bildiriş alındıqda avtomatik aktivləşir. 30 saniyə ərzində genişləndirmə media qoşması yükləyə, mətni dəyişdirə, şifrələnmiş məlumatları deşifrə edə və ya məzmunu zənginləşdirə bilər.
Genişləndirmə UNNotificationServiceExtension protokolundan iki əsas metodu tətbiq edir. didReceive metodu xam UNNotificationRequest ilə daxil olan sorğunu alır və yeni UNNotificationContent ilə completion handler vasitəsilə onu dəyişdirməyə imkan verir. serviceExtensionTimeWillExpire metodu sistem tərəfindən vaxt aşımına bir saniyə qalmış çağırılır — burada emalı bitirmək və cari (bəlkə də qismən) nəticəni ötürmək lazımdır.
Serverin fərdi sahədə şəkil URL-i ilə push göndərdiyi ssenarini nəzərdən keçirək. Service Extension bu şəkili şəbəkə vasitəsilə yükləyir, UNNotificationAttachment yaradır və onu məzmuna əlavə edir. UNNotificationAttachment yerli şəkil, video və ya audio faylı qəbul edir və avtomatik olaraq genişləndirmənin qum qutusuna kopyalayır. Attachment yaradıldıqdan sonra genişləndirmə yenilənmiş məzmunu sistemə ötürür.
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)
}
}
Eyni qoşmalarla bildirişlərin tez-tez göndərilməsi zamanı yüklənmiş faylları cihazda keşləmək tövsiyə olunur. FileManager genişləndirmənin keş kataloquna girişi təmin edir, bu kataloq işəsalmalar arasında saxlanılır. Bu, sonrakı bildirişlərin emal müddətini qısaldır və şəbəkə yükünü azaldır. Apple-a görə, qoşmaların keşlənməsi emal müddətini tam yükləmə əvəzinə 2–5 saniyəyə qədər azalda bilər.
UNNotificationContentExtension standart bildiriş bannerini Interface Builder və ya SwiftUI-də yaradılmış fərdi interfeyslə əvəz etməyə imkan verir. Genişləndirmə istifadəçi bildirişlə hərəkət etdikdə aktivləşir: toxunma, aşağı sürüşdürmə və ya 3D Touch. Content Extension Service Extension tərəfindən artıq emal edilmiş məzmunu alır və onu fərdi görünüşdə göstərir.
Hər bir Content Extension Info.plist vasitəsilə bir və ya bir neçə bildiriş kateqoriyasına bağlanır. Kateqoriya server tərəfindən APNS payload-unda category sahəsi ilə müəyyən edilir. Sistem alınan bildirişin kateqoriyası əsasında lazımi genişləndirməni avtomatik seçir. İnterfeys standart UIKit komponentləri və ya SwiftUI View istifadə edərək storyboard vasitəsilə qurulur.
Content Extension UNNotificationAction-da müəyyən edilmiş fərdi düymələri və toxunma emalçılarını dəstəkləyir. UNNotificationAction kateqoriyanın qeydiyyatı mərhələsində yaradılır və UNTextInputNotificationAction vasitəsilə mətn daxiletmə ola bilər. İstifadəçi düyməni basdıqda, genişləndirmə hərəkət identifikatoru ilə didReceive callback-i alır və müvafiq məntiqi yerinə yetirə bilər — URL açmaq, serverə sorğu göndərmək və ya interfeysi yeniləmək.
Content Extension öz icra dövrü və təxminən 50 MB yaddaş limiti ilə izolyasiya edilmiş prosesdə işləyir. Genişləndirmənin performansı kritikdir, çünki sistem watchdog limitlər aşıldıqda prosesi dayandırır. Content Extension daxilində ağır hesablamalardan, böyük şəkillərin yüklənməsindən və uzunmüddətli şəbəkə sorğularından qaçınmaq tövsiyə olunur.
UNNotificationAttachment push bildirişinə media faylı əlavə edən obyektdir: şəkil, video, audio və ya GIF. Qoşma genişləndirmənin qum qutusunda yerləşməli olan yerli fayl URL-indən yaradılır. Qoşmanın maksimum ölçüsü 10 MB-dan çox olmamalıdır, əks halda sistem attachment yaradılmasını rədd edəcək.
Apple media qoşmaları üçün məhdud format dəsti dəstəkləyir. Şəkillər — JPEG, PNG, GIF (animasiyalı daxil olmaqla), TIFF. Video — MPEG, MP4, MOV maksimum 30 saniyə müddəti ilə. Audio — MP3, AAC, WAV, CAF. Hər bir format üçün növü UNNotificationAttachmentOptionsTypeHintKey vasitəsilə göstərmək olar ki, bu da sistemə faylı düzgün emal etməyə kömək edir.
Push payload yalnız URL ehtiva etdiyi üçün, faylın özü deyil, qoşmanın yüklənməsi Service Extension daxilində aparılmalıdır. Maksimum yükləmə vaxtı 30 saniyə ilə məhdudlaşdırılıb, buna görə minimal parametrlərlə URLSession istifadə etmək və zəif siqnal olduqda yükləməni söndürmək tövsiyə olunur. Qoşma vaxtında yüklənməzsə, bildiriş media olmadan göstərilir — bu sistemin standart davranışıdır.
Notification Extension-in şəkil yükləyən, onu endirən və bildirişə əlavə edən tam nümunəsini nəzərdən keçirək. NotificationService UNNotificationServiceExtension-dən miras alır və didReceive metodunu ləğv edir. Nümunədə isteğe bağlı sahələrin emalı, attachment yaradılması və dəyişdirilmiş məzmunla completion handler-in çağırılması göstərilir.
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)
}
}
}
Genişləndirmənin düzgün işləməsi üçün bildiriş kateqoriyalarını Info.plist-də qeydiyyatdan keçirmək lazımdır. NSExtensionPointIdentifier açarı Service Extension üçün com.apple.usernotifications.service və ya Content Extension üçün com.apple.usernotifications.content olaraq təyin edilir. Kateqoriyalar AppDelegate-də tətbiq işə salındıqda UNUserNotificationCenter vasitəsilə müəyyən edilir və genişləndirmə yalnız payload-da müvafiq kateqoriyası olan bildirişlər üçün aktivləşir.
Tez-tez verilən suallar
Service Extension bildiriş göstərilməzdən əvvəl məzmunu dəyişdirir — media əlavə edir, mətni dəyişir, məlumatları deşifrə edir. Content Extension istifadəçi qarşılıqlı əlaqəsindən sonra bildiriş interfeysini fərdi ilə əvəz edir. Service Extension göstərilməzdən əvvəl işləyir, Content Extension — sonra.
Sistem 30 saniyə ayırır didReceive-də kodun icrası üçün. Emal bu müddətdə bitməzsə, serviceExtensionTimeWillExpire çağırılır, burada cari nəticəni ötürmək lazımdır. Qoşmaların yüklənməsini nəzərə alaraq 10–15 saniyəyə sığmaq tövsiyə olunur.
Bəli, SwiftUI iOS 16-dan etibarən Content Extension-da dəstəklənir. View UIHostingController-ə bükülür və storyboard-a əlavə edilir. Lakin yaddaş məhdudiyyətləri səbəbindən SwiftUI-dən yalnız minimal elementlərlə sadə interfeyslər üçün istifadə etmək tövsiyə olunur.
Yükləmə xətası və ya vaxt limitinin aşılması halında sadəcə attachment olmadan orijinal məzmunla completion handler-i çağırın. Sistem bildirişi media olmadan standart formada göstərəcək. Diaqnostika üçün xətaları OSLog vasitəsilə qeyd edin, lakin bildirişin göstərilməsini bloklamayın.
Genişləndirmə təxminən 50 MB limiti ilə izolyasiya edilmiş prosesdə işləyir. Limit aşıldıqda sistem watchdog vasitəsilə prosesi dayandırır. Böyük faylların yüklənməsindən, şəkillərin yaddaşda saxlanmasından və URLSession ilə işləyərkən sızmalardan qaçının.
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