Notification Service Extension: bu nədir, iOS-da göstərilmədən əvvəl məzmunun emalı

Müəllif: IT Sectr Dərc olunub: 2026-03-21 Oxuma vaxtı: 8 dəq

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 — göstərilmədən əvvəl push-bildirişinin emalı üçün iOS genişləndirilməsi.
  • Genişləndirmə UNNotificationServiceExtension-dan miras alır və didReceive metodunu tətbiq edir.
  • Məlumatların yüklənməsi və emalı üçün 30 saniyəyə qədər fon icrası mövcuddur.
  • Əsas ssenarilər: payload-ın deşifrə edilməsi, şəkillərin və videoların yüklənməsi, məzmunun validasiyası.
  • Genişləndirmə bildirişin göstərilməsini təxirə sala və ya contentHandler vasitəsilə tamamilə ləğv edə bilər.

Notification Service Extension nədir

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.

Bu necə işləyir

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 nə vaxt istifadə edilməlidir

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.

SsenariGenişləndirmə olmadanGenişləndirmə ilə
ŞəkilDəstəklənmirEndirilir və göstərilir
ŞifrələməAçarı server saxlayırCihazda deşifrə
MətnServerdə sabit müəyyən edilibDinamik əvəzetmə
ValidasiyaYoxlanılmırZərərli bildirişlərin ləğvi

Məhdudiyyətlər və icra müddəti

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.

Genişləndirmənin yaradılması və Info.plist konfiqurasiyası

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.

Layihəyə target əlavə etmək

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 strukturu

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 genişləndirmə nümunəsi

Ə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.

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

Şifrələnmiş payload-ın deşifrə edilməsi

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.

Təhlükəsiz çatdırılma arxitekturası

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.

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

Açarların təhlükəsiz saxlanılması

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.

Media əlavələrinin yüklənməsi və birləşdirilməsi

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.

Media yükləmə və birləşdirmə prosesi

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.

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

Dəstəklənən media formatları

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.

Vaxtın idarə edilməsi və fallback ssenariləri

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.

Prioritetlər strategiyası

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.

Xətalar zamanı fallback

Şə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.

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

Genişləndirmənin test edilməsi

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

Genişləndirmə 30 saniyəyə çatmasa nə baş verəcək?

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.

Genişləndirmədən bildirişin göstərilməsini ləğv etmək mümkündürmü?

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.

Media endirmək üçün avtorizasiya tokenini necə ötürmək olar?

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ə üçün sertifikatların xüsusi konfiqurasiyası tələb olunurmu?

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.

Genişləndirməni real cihazda necə debug etmək olar?

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

  • Notification Service Extension — göstərilmədən əvvəl push-bildirişlərinin fon emalı üçün iOS genişləndirilməsi.
  • Maksimum icra müddəti — 30 saniyə, bundan sonra sistem orijinal məzmunu göstərir.
  • Əsas tətbiqlər: payload-ın deşifrəsi, media endirilməsi, məzmunun validasiyası və lokallaşdırılması.
  • Genişləndirmə didReceive və serviceExtensionTimeWillExpire metodları ilə UNNotificationServiceExtension-dan miras alır.
  • Media endirmək üçün URLSession, açarları saxlamaq üçün isə iOS Keychain istifadə edin.
  • Həmişə fallback nəzərdə tutun — xətalar zamanı contentHandler-ı orijinal məzmunla çağırın.
  • Bildirişlər üzərində tam nəzarət üçün Service Extension-u Content Extension ilə birləşdirin.

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