Notification Service Extension — bu iOS kengaytmasi bo'lib, push bildirishnomani qabul qilgandan so'ng darhol, ammo foydalanuvchiga ko'rsatishdan oldin tutib oladi. Kengaytma shifrlangan payloadni shifrdan chiqarishi, media faylni yuklab biriktirishi, bildirishnoma matni yoki sarlavhasini real vaqtda o'zgartirishi mumkin. Apple Developer Documentation (2025) ma'lumotlariga ko'ra, kengaytmani faollashtirish uchun server bildirishnoma atributlarida mutable-content:1 kalitini yuborishi kerak — bu UNNotificationServiceExtension ni ishga tushirishning yagona shartidir.
Asosiy nuqtalar
Notification Service Extension — iOS da app kengaytmasi bo'lib, qurilmada kiruvchi push bildirishnomani tutib oladi va foydalanuvchi uni ko'rishidan oldin uning mazmunini o'zgartirishga imkon beradi. Bu mazmun bilan ishlaydigan, ko'rsatish bilan emas, yagona bildirishnoma kengaytma turidir.
Notification Content Extension dan asosiy farq: Service Extension bildirishnoma ko'rsatilishidan oldin ishlaydi va sarlavha, matn, ovoz fayli va birikmalarni o'zgartirishi mumkin. Content Extension ko'rsatilishdan keyin ishlaydi va faqat tayyor bildirishnomaning vizual taqdimotini boshqaradi. Bu ikki kengaytma birgalikda ishlashi mumkin: Service Extension rasmni yuklaydi, Content Extension esa uni maxsus interfeysda ko'rsatadi.
Kengaytma aps lug'atida mutable-content:1 atributi bo'lgan push bildirishnomasi olinganda avtomatik faollashadi. iOS kengaytmani fon rejimida ishga tushiradi, unga asl UNNotificationRequest ni uzatadi va ko'rsatish uchun o'zgartirilgan versiyani kutadi.
UNNotificationServiceExtension asl mazmun bilan to'liq UNNotificationRequest ni oladi. Kengaytma UNNotificationContent ning istalgan maydonini o'zgartirishi mumkin: title, subtitle, body, userInfo, attachments va sound. O'zgarishlar bildirishnoma ko'rsatilishidan oldin qo'llaniladi.
Mazmunni shifrdan chiqarish — agar push bildirishnomasi shifrlangan payload ni o'z ichiga olsa, kengaytma uni ko'rsatishdan oldin shifrdan chiqaradi. Media yuklash — bildirishnomaga rasm yoki video biriktirish. Mahalliylashtirish — bildirishnoma matnini qurilmaning mintaqaviy sozlamalariga moslashtirish. Ma'lumotlarni boyitish — mahalliy saqlash yoki keshdan qo'shimcha ma'lumotlarni qo'shish.
Apple ma'lumotlariga ko'ra, ilovalar orasida eng keng tarqalgan stsenariy boy media bildirishnomalari uchun rasmlarni yuklashdir. Server payload da rasm URL ini yuboradi, kengaytma uni vaqtinchalik katalogga yuklab oladi va tizim standart yoki maxsus interfeysda ko'rsatadigan UNNotificationAttachment yaratadi.
Kengaytma bildirishnomaning text maydonini butunlay qayta yozishi, sarlavhani almashtirishi yoki subtitle qo'shishi mumkin. Masalan, messenjer ilovasi shifrlangan bildirishnoma olishi, uni kengaytmada shifrdan chiqarishi va o'qiladigan matn ko'rsatishi mumkin. Yangiliklar ilovasi ko'rsatishdan oldin subtitrga yangilik turkumini qo'shishi mumkin.
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
let content = request.content.mutableCopy()
as! UNMutableNotificationContent
if let imageURL = content.userInfo["media-url"]
as? String {
downloadAndAttach(imageURL: imageURL,
content: content,
handler: contentHandler)
}
}
UNNotificationServiceExtension — Service Extension meros oladigan asosiy sinf. Sinf ikkita hayot sikli metodini belgilaydi: didReceive(_:withContentHandler:) — asosiy qayta ishlash metodi, va serviceExtensionTimeWillExpire() — vaqt tugashini boshqaruvchi.
didReceive(_:withContentHandler:) bildirishnoma olinganda chaqiriladi. Kengaytma UNNotificationRequest va o'zgartirilgan UNMutableNotificationContent bilan chaqirilishi kerak bo'lgan contentHandler closure ni oladi. Kengaytma contentHandler ni chaqirishi shart — agar buni qilmasa, iOS vaqt tugashidan keyin asl bildirishnomani ko'rsatadi.
Muhim: kengaytma bir vaqtning o'zida faqat bitta bildirishnomani qayta ishlashi mumkin. Agar bir vaqtning o'zida bir nechta bildirishnoma kelsa, iOS har biri uchun alohida kengaytma nusxalarini yaratadi. Ketma-ket qayta ishlash uchun global holatdan foydalanib bo'lmaydi.
serviceExtensionTimeWillExpire() tizim tomonidan qolgan ijro vaqti tugayotganda chaqiriladi. Bu metodda darhol hozirgi vaqtda tayyor bo'lgan mazmun bilan contentHandler ni chaqirish kerak — hatto media fayl hali yuklanmagan bo'lsa ham. Agar bu metodda contentHandler chaqirilmasa, iOS asl bildirishnomani ko'rsatadi.
Bu metodda minimal qabul qilinadigan mazmunni saqlash tavsiya etiladi — masalan, matn va sarlavhali, ammo yuklanishi o'z vaqtida tugamagan rasmsiz bildirishnoma.
UNNotificationAttachment — kengaytma tomonidan bildirishnomaga media fayl biriktirish uchun yaratilgan ob'ekt. Kengaytma faylni tarmoqdan yuklab oladi, vaqtinchalik katalogga saqlaydi va mazmun turini ko'rsatgan holda UNNotificationAttachment yaratadi.
UNNotificationAttachment init(identifier:url:options:) initsializatori yordamida yaratiladi. URL kengaytma uchun mavjud bo'lgan vaqtinchalik katalogdagi mahalliy faylga ishora qilishi kerak. Birikma yaratilgandan so'ng, UNMutableNotificationContent ning attachments massiviga qo'shiladi.
Apple yuklab olish uchun fon konfiguratsiyasi bilan URLSession dan foydalanishni tavsiya qiladi — standart URLSession dan foydalanganda yuklab olish oqimni bloklaydi va 30 soniyalik limitdan vaqt sarflaydi. Fon URLSession kengaytma tugagan bo'lsa ham yuklab olishni davom ettiradi va natija keyingi ishga tushirishda ishlatilishi mumkin.
Server shifrlangan bildirishnoma yuborsa, kengaytma contentHandler ni chaqirishdan oldin payload ni shifrdan chiqarishi kerak. Shifrdan chiqarish odatda Keychain yoki App Group dan kalitni so'rash, CommonCrypto orqali shifrni ochish va bildirishnomaning body yoki userInfo maydonini almashtirishni o'z ichiga oladi. Shifrdan chiqarish xatosi bo'lsa, contentHandler asl mazmun bilan chaqirilishi kerak — foydalanuvchi hech bo'lmasa bildirishnoma kelganini ko'rsin, hatto o'qib bo'lmasa ham.
func downloadAndAttach(
imageURL: String,
content: UNMutableNotificationContent,
handler: @escaping (UNNotificationContent) -> Void
) {
let task = URLSession.shared.dataTask(with:
URL(string: imageURL)!) { data, _, _ in
let url = FileManager.default
.temporaryDirectory
.appendingPathComponent("image.jpg")
try? data?.write(to: url)
let attachment = try? UNNotificationAttachment(
identifier: "image", url: url)
content.attachments = [attachment].compactMap { $0 }
handler(content)
}
task.resume()
}
Notification Service Extension qattiq vaqt chegaralarida ishlaydi. iOS faollashtirilgan paytdan boshlab taxminan 30 soniya qat'iy ijro vaqtini ajratadi. Agar kengaytma shu vaqt ichida contentHandler ni chaqirmasa, tizim jarayonni majburiy tugatadi va asl bildirishnomani o'zgarishsiz ko'rsatadi.
Ko'p darajali fallback ni amalga oshirish tavsiya etiladi: avval media yuklashga urinish, muvaffaqiyat bo'lsa — to'liq mazmun bilan contentHandler ni chaqirish; muvaffaqiyatsizlikda — matn bilan, ammo mediasiz contentHandler ni chaqirish; tanqidiy xatoda — asl mazmunni uzatish. Bunday yondashuv foydalanuvchining har doim bildirishnomani ko'rishini kafolatlaydi, bo'sh ekran emas.
Apple ma'lumotlariga ko'ra, vaqt chegarasining eng keng tarqalgan sababi sekin ulanishda katta media fayllarni yuklashdir. Xavfni kamaytirish uchun serverda rasmlar hajmini optimallashtirish tavsiya etiladi — to'liq rezolyusiya o'rniga 300 KB gacha bo'lgan prevyu yuborish. To'liq o'lchamdagi rasmlarni ilova ochilganda yuklash yaxshiroq.
Vaqt chegaralari va kengaytma xatolarini kuzatish uchun Unified Logging System da diagnostik xabarlarni yozish uchun os_log dan foydalanish mumkin. Kengaytmada faylga to'g'ridan-to'g'ri log yozish qiyin bo'lsa-da, os_log Console.app orqali ishlab chiquvchi qurilmasida samaradorlikni tahlil qilish imkonini beradi. Apple har bir didReceive chaqiruviga metrikalar qo'shishni tavsiya qiladi — yuklash vaqti, fayl hajmi, operatsiya natijasi.
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
Tez-tez beriladigan savollar
Server push bildirishnomasining aps lug'atiga mutable-content:1 kalitini qo'shadi. Bu parametrsiz tizim kengaytmani e'tiborsiz qoldiradi va standart bildirishnomani ko'rsatadi.
Yo'q. mutable-content:1 Service Extension ni faollashtirish uchun majburiy shartdir. Agar kalit mavjud bo'lmasa yoki 0 ga o'rnatilgan bo'lsa, bildirishnoma kengaytma chaqirilmasdan ko'rsatiladi.
iOS kengaytmani majburiy tugatadi va asl bildirishnomani o'zgarishsiz ko'rsatadi. Buning oldini olish uchun minimal qabul qilinadigan mazmun bilan serviceExtensionTimeWillExpire() ni amalga oshiring.
App Group (umumiy UserDefaults yoki fayl) yoki ilova va kengaytma o'rtasida umumiy kirishga ega Keychain orqali. Kalitlarni to'g'ridan-to'g'ri bildirishnoma payloadida uzatish xavfsiz emas.
Bitta bildirishnoma uchun 4 ta birikmagacha, har biri 50 MB gacha. Birikmalarning umumiy hajmi yuklab olish vaqtiga ta'sir qiladi — qancha ko'p fayl bo'lsa, vaqt chegarasi xavfi shuncha yuqori.
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.