Notification Service Extension: iOS da ko‘rsatishdan oldin kontentni qayta ishlash nima

Muallif: IT Sectr Nashr etilgan: 2026-03-21 O'qish vaqti: 8 daq

Notification Service Extension — bu iOS kengaytmasi bo‘lib, push bildirishnomani foydalanuvchiga ko‘rsatishdan oldin uni ushlab qoladi va kontentni o‘zgartirishga imkon beradi. Kengaytma shifrlangan ma‘lumotlarni deshifrlashi, media ilovalarni yuklab olishi, matnni o‘zgartirishi yoki maxsus maydonlar qo‘shishi mumkin. Apple Developer, 2025 ma‘lumotlariga ko‘ra, Notification Service Extension fon rejimida topshiriqni bajarish uchun 30 soniyagacha vaqtga ega.

Asosiy

  • Notification Service Extension — push bildirishnomani ko‘rsatishdan oldin qayta ishlash uchun iOS kengaytmasi.
  • Kengaytma UNNotificationServiceExtension dan meros oladi va didReceive metodini amalga oshiradi.
  • Ma‘lumotlarni yuklab olish va qayta ishlash uchun 30 soniyagacha fon bajarilishi mavjud.
  • Asosiy stsenariylar: payload deshifrlash, rasm va video yuklab olish, kontent validatsiyasi.
  • Kengaytma bildirishnomani ko‘rsatishni kechiktirishi yoki contentHandler orqali butunlay bekor qilishi mumkin.

Notification Service Extension nima

Notification Service Extension — iOS da app kengaytmasi bo‘lib, push bildirishnoma ko‘rsatilishidan oldin ishga tushadi. Serverga minimal payload yuborishga, kengaytma esa uni kontent bilan to‘ldirishga imkon beradi: rasmlarni yuklab olish, ma‘lumotlarni deshifrlash, matnni almashtirish. Foydalanuvchi tayyor, qayta ishlangan bildirishnomani ko‘radi.

Bu qanday ishlaydi

iOS push bildirishnomani olganda, sistema ushbu ilova uchun kengaytma mavjudligini tekshiradi. Agar kengaytma ro‘yxatdan o‘tgan bo‘lsa, iOS uni fon jarayonida ishga tushiradi va bildirishnoma kontentini didReceive(_:withContentHandler:) metodi orqali uzatadi. Kengaytma kontentni qayta ishlaydi va o‘zgartirilgan kontent bilan contentHandler ni chaqiradi. Agar kengaytma 30 soniya ichida ulgurmasa, sistema asl bildirishnomani ko‘rsatadi.

Service Extension qachon ishlatiladi

Service Extension bildirishnoma kontenti qurilmada qayta ishlashni talab qiladigan stsenariylarda zarur. Xavfsiz aloqa: server shifrlangan payload yuboradi, kengaytma uni lokal deshifrlaydi. Boy media bildirishnomalari: server rasm URL ini yuboradi, kengaytma uni yuklab oladi va biriktiradi. Dinamik lokalizatsiya: kengaytma matnni qurilma tilida almashtiradi.

StsenariyKengaytmasizKengaytma bilan
RasmQo‘llab-quvvatlanmaydiYuklanadi va ko‘rsatiladi
ShifrlashServer kalitni saqlaydiQurilmada deshifrlash
MatnServerda qattiq o‘rnatilganDinamik almashtirish
ValidatsiyaTekshirilmaydiZararli bildirishnomalarni bekor qilish

Cheklovlar va bajarilish vaqti

Notification Service Extension cheklangan muhitda ishlaydi. Maksimal bajarilish vaqti — 30 soniya. Kengaytma ilovaning asosiy xotirasiga (App Group dan tashqari) kira olmaydi. Kengaytma hajmi 50 MB bilan cheklangan. Vaqt oshib ketganda, sistema asl kontent bilan contentHandler ni chaqiradi va barcha o‘zgarishlar yo‘qoladi.

Kengaytmani yaratish va Info.plist sozlamasi

Xcode da Notification Service Extension Notification Service Extension tipidagi yangi target yaratish orqali qo‘shiladi. Xcode UNNotificationServiceExtension dan meros oladigan NotificationService sinf shablonini yaratadi, ikkita metod bilan: didReceive va serviceExtensionTimeWillExpire.

Loyihaga target qo‘shish

Xcode da File → New → Target → Notification Service Extension ni tanlang. Nom (masalan, PushNotificationService) va Swift tilini belgilang. Target asosiy ilovaga qo‘shilganligiga va to‘g‘ri imzolanganligiga ishonch hosil qiling. Yaratilgandan so‘ng NotificationService.swift sinfi asosiy tatbiq bilan yaratiladi.

Kengaytmaning Info.plist tuzilishi

Kengaytmaning Info.plist faylida NSExtensionPointIdentifier (com.apple.usernotifications.service) va NSExtensionPrincipalClass (kontrollyor nomi) pastki kalitlari bilan NSExtension kaliti mavjud. Qo‘shimcha ravishda faollashtirish qoidalari bilan NSExtensionAttributes ko‘rsatilishi mumkin. Ushbu sozlamalar Xcode tomonidan avtomatik yaratiladi.

Asosiy kengaytma namunasi

Asosiy tatbiq didReceive ni o‘zgartirib yozadi, bildirishnoma kontentini o‘zgartiradi va contentHandler ni chaqiradi. Agar qayta ishlash juda uzoq davom etsa, serviceExtensionTimeWillExpire chaqiriladi, bu erda joriy holat bilan ishni tugatish kerak.

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 = "[Qayta ishlangan] \(bestAttemptContent.title)"
            contentHandler?(bestAttemptContent)
        }
    }

    override func serviceExtensionTimeWillExpire() {
        if let contentHandler = contentHandler,
           let bestAttemptContent = bestAttemptContent {
            contentHandler(bestAttemptContent)
        }
    }
}

Shifrlangan payload deshifrlash

Service Extension ning asosiy qo‘llanilishlaridan biri bildirishnoma kontentini qurilmada deshifrlashdir. Server shifrlangan payload yuboradi, kengaytma esa Keychain yoki App Group da saqlangan kalitdan foydalanib uni deshifrlaydi. Bu kontentni uzatish paytida ushlanib qolishining oldini oladi.

Xavfsiz yetkazib berish arxitekturasi

Server simmetrik kalit (AES-256) yordamida bildirishnoma matnini shifrlaydi. Shifrlash kaliti oldindan mijoz va server o‘rtasida kelishiladi. Kengaytma payload ma‘lumot maydonida shifrlangan satrni oladi, uni deshifrlaydi va bildirishnoma maydonlariga joylashtiradi. Foydalanuvchi kaliti autentifikatsiyadan so‘ng Keychain dan olinishi mumkin.

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

Kalitlarni xavfsiz saqlash

Deshifrlash kaliti kengaytma kodida yoki NSUserDefaults da saqlanmasligi kerak. Ilova ham, kengaytma ham kalitni o‘qiy olishi uchun App Group orqali kirish bilan iOS Keychain dan foydalaning. Mijoz tomonida kalit yaratish uchun AES-256-GCM algoritmi bilan Security.framework dan foydalaning.

Media ilovalarni yuklab olish va biriktirish

Notification Service Extension ning eng keng tarqalgan qo‘llanilishi — bildirishnomada ko‘rsatish uchun rasmlar, GIF va videolarni yuklab olish. Server media faylining URL ini yuboradi, kengaytma uni yuklab oladi, vaqtinchalik katalogga saqlaydi va UNNotificationAttachment yaratadi.

Mediani yuklab olish va biriktirish jarayoni

Kengaytma bildirishnoma payloadidan rasm URL ini oladi. URLSession dan foydalanib, kengaytma faylni vaqtinchalik katalogga yuklab oladi. Yuklab olish tugagandan so‘ng lokal URL bilan UNNotificationAttachment yaratiladi. Ilova o‘zgartirilgan kontentga uzatiladi. iOS avtomatik ravishda rasmni standart interfeysda yoki Notification Content Extension da ko‘rsatadi.

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

Qo‘llab-quvvatlanadigan media formatlari

iOS bildirishnomalarda ko‘rsatish uchun quyidagi formatlarni qo‘llab-quvvatlaydi: JPEG, PNG, GIF (statik), 50 MB gacha MPEG-4 video. Audio fayllar uchun MP3, AAC va ALAC qo‘llab-quvvatlanadi. Muhim: barcha media fayllar 30 soniyalik cheklov ichida yuklab olinishi kerak. Katta fayllar uchun server tomonidan kesish yoki progressiv yuklab olish tavsiya etiladi.

Vaqtni boshqarish va zaxira stsenariylar

30 soniyalik cheklovni boshqarish — Notification Service Extension ni ishlab chiqishdagi asosiy vazifa. Agar kengaytma qayta ishlashni tugatmasa, sistema serviceExtensionTimeWillExpire ni chaqiradi va asl kontentni ko‘rsatadi. Har bir qayta ishlash turi uchun zaxira stsenariylar ko‘zda tutilishi kerak.

Prioritet strategiyasi

Vazifalarni prioritetlarga ko‘ra ajrating. Kritik o‘zgarishlar (deshifrlash, asosiy lokalizatsiya) birinchi navbatda bajarilishi kerak. Ixtiyoriy yaxshilanishlar (rasm yuklab olish, matn boyitish) — ikkinchi navbatda. Tarmoq so‘rovlari uchun butun cheklovni bitta operatsiyaga sarflamaslik uchun vaqt cheklovi bilan URLSession dan foydalaning.

Xatolarda zaxira stsenariylar

Agar rasm yuklab olish muvaffaqiyatsiz bo‘lsa yoki payload deshifrlash xato qaytarsa, kengaytma asl kontent bilan contentHandler ni chaqirishi kerak. Kengaytmani contentHandler ni chaqirmasdan tugatmang — bu bildirishnomaning yo‘qolishiga olib keladi. Xavfsiz zaxira har doim kengaytma kodida ko‘zda tutilishi kerak.

swift
override func didReceive(
    request: UNNotificationRequest,
    withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
    let content = (request.content.mutableCopy()
        as? UNMutableNotificationContent) ?? request.content

    // Kritik vazifa: deshifrlash
    var decryptedContent = tryDecryptPayload(content)

    // Ixtiyoriy vazifa: media
    guard let mediaUrl = decryptedContent.userInfo["media_url"]
        as? String else {
        handler(decryptedContent)
        return
    }

    downloadAndAttachMedia(
        content: decryptedContent,
        mediaUrl: mediaUrl,
        handler: handler
    )
}

Kengaytmani test qilish

Notification Service Extension ni test qilish uchun Xcode dan foydalaning: kengaytma targetini tanlang, simulyatorda ishga tushiring va terminal yoki Firebase Console orqali push bildirishnoma yuboring. Qayta ishlashning har bir bosqichini os_log orqali log qiling — bu vaqt va yuklash xatolari bilan bog‘liq muammolarni diagnostika qilishga yordam beradi.

Tez-tez beriladigan savollar

Kengaytma 30 soniyaga sig‘masa nima bo‘ladi?

Sistema serviceExtensionTimeWillExpire ni chaqiradi, so‘ngra asl bildirishnomani o‘zgarishsiz ko‘rsatadi. Barcha yuklab olingan fayllar va o‘zgarishlar bekor qilinadi.

Kengaytmadan bildirishnomani ko‘rsatishni bekor qilish mumkinmi?

Ha, bo‘sh kontent bilan contentHandler ni chaqirsangiz (bo‘sh maydonlar bilan UNNotificationContent), bildirishnoma ko‘rsatilmaydi. Bu spam bildirishnomalar yoki noto‘g‘ri ma‘lumotlarni filtrlash uchun ishlatiladi.

Media yuklab olish uchun avtorizatsiya tokenini qanday uzatish mumkin?

Token bildirishnoma payloadining userInfo sida uzatilishi yoki App Group orqali Keychain dan olinishi mumkin. Tokenlarni kengaytmaning UserDefaults ida saqlash tavsiya etilmaydi.

Kengaytma uchun maxsus sertifikat sozlamasi kerakmi?

Kengaytma asosiy ilova bilan bir xil dasturchi sertifikati bilan imzolanishi kerak. Ishlab chiqarish uchun Push Notifications imkoniyati yoqilgan ishlab chiqarish sertifikati talab qilinadi.

Haqiqiy qurilmada kengaytmani qanday sozlash mumkin?

Qurilmani Xcode ga ulang, ishga tushirish sxemasida kengaytma targetini tanlang va Firebase Console orqali push bildirishnoma yuboring. Breakpoints kengaytmada asosiy ilovadagi kabi ishlaydi.

Xulosa

  • Notification Service Extension — push bildirishnomalarini ko‘rsatishdan oldin fonda qayta ishlash uchun iOS kengaytmasi.
  • Maksimal bajarilish vaqti — 30 soniya, shundan so‘ng sistema asl kontentni ko‘rsatadi.
  • Asosiy qo‘llanilishlar: payload deshifrlash, media yuklab olish, kontent validatsiyasi va lokalizatsiyasi.
  • Kengaytma didReceive va serviceExtensionTimeWillExpire metodlari bilan UNNotificationServiceExtension dan meros oladi.
  • Media yuklab olish uchun URLSession, kalitlarni saqlash uchun iOS Keychain dan foydalaning.
  • Har doim zaxirani ko‘zda tuting — xatolarda asl kontent bilan contentHandler ni chaqiring.
  • Bildirishnomalar ustidan to‘liq nazorat uchun Service Extension ni Content Extension bilan birlashtiring.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing