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 — 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.
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 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.
| Stsenariy | Kengaytmasiz | Kengaytma bilan |
|---|---|---|
| Rasm | Qo‘llab-quvvatlanmaydi | Yuklanadi va ko‘rsatiladi |
| Shifrlash | Server kalitni saqlaydi | Qurilmada deshifrlash |
| Matn | Serverda qattiq o‘rnatilgan | Dinamik almashtirish |
| Validatsiya | Tekshirilmaydi | Zararli bildirishnomalarni bekor qilish |
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.
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.
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 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 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.
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)
}
}
}
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.
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.
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)
}
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.
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.
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.
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 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.
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.
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.
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.
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
)
}
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
Sistema serviceExtensionTimeWillExpire ni chaqiradi, so‘ngra asl bildirishnomani o‘zgarishsiz ko‘rsatadi. Barcha yuklab olingan fayllar va o‘zgarishlar bekor qilinadi.
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.
Token bildirishnoma payloadining userInfo sida uzatilishi yoki App Group orqali Keychain dan olinishi mumkin. Tokenlarni kengaytmaning UserDefaults ida saqlash tavsiya etilmaydi.
Kengaytma asosiy ilova bilan bir xil dasturchi sertifikati bilan imzolanishi kerak. Ishlab chiqarish uchun Push Notifications imkoniyati yoqilgan ishlab chiqarish sertifikati talab qilinadi.
Qurilmani Xcode ga ulang, ishga tushirish sxemasida kengaytma targetini tanlang va Firebase Console orqali push bildirishnoma yuboring. Breakpoints kengaytmada asosiy ilovadagi kabi ishlaydi.
Xulosa
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.