Notification Service Extension ایک iOS ایکسٹینشن ہے جو پش نوٹیفکیشن کو موصول ہونے کے فوراً بعد لیکن صارف کو دکھائے جانے سے پہلے روک لیتی ہے۔ ایکسٹینشن خفیہ کردہ پے لوڈ کو ڈیکرپٹ کر سکتی ہے، میڈیا فائلیں ڈاؤن لوڈ اور منسلک کر سکتی ہے، اور حقیقی وقت میں نوٹیفکیشن کا متن یا عنوان بدل سکتی ہے۔ Apple ڈویلپر دستاویزات (2025) کے مطابق، ایکسٹینشن کو فعال کرنے کے لیے سرور کو نوٹیفکیشن کی خصوصیات میں mutable-content:1 کلید بھیجنی ہوگی — یہ UNNotificationServiceExtension چلانے کی واحد شرط ہے۔
اہم نکات
Notification Service Extension iOS میں ایک ایپ ایکسٹینشن ہے جو ڈیوائس سائیڈ پر آنے والے پش نوٹیفکیشن کو روکتی ہے اور صارف کے دیکھنے سے پہلے اس کے مواد میں تبدیلی کی اجازت دیتی ہے۔ یہ نوٹیفکیشن ایکسٹینشن کی واحد قسم ہے جو ڈسپلے کے بجائے مواد کے ساتھ کام کرتی ہے۔
Notification Content Extension سے بنیادی فرق: Service Extension نوٹیفکیشن دکھائے جانے سے پہلے کام کرتی ہے اور عنوان، باڈی، آواز کی فائل اور منسلکات کو بدل سکتی ہے۔ Content Extension دکھائے جانے کے بعد کام کرتی ہے اور صرف تیار نوٹیفکیشن کی بصری پیشکش کا انتظام کرتی ہے۔ یہ دونوں ایکسٹینشنز مل کر کام کر سکتی ہیں: Service Extension ایک تصویر ڈاؤن لوڈ کرتی ہے، اور Content Extension اسے ایک حسب ضرورت انٹرفیس میں دکھاتی ہے۔
ایکسٹینشن aps ڈکشنری میں mutable-content:1 وصف کے ساتھ پش نوٹیفکیشن موصول ہونے پر خود بخود فعال ہو جاتی ہے۔ iOS ایکسٹینشن کو پس منظر میں شروع کرتا ہے، اسے اصل UNNotificationRequest دیتا ہے اور ڈسپلے کے لیے تبدیل شدہ ورژن کا انتظار کرتا ہے۔
UNNotificationServiceExtension اصل مواد کے ساتھ مکمل UNNotificationRequest وصول کرتی ہے۔ ایکسٹینشن UNNotificationContent کے کسی بھی فیلڈ کو تبدیل کر سکتی ہے: title, subtitle, body, userInfo, attachments اور sound۔ تبدیلیاں نوٹیفکیشن دکھائے جانے سے پہلے لاگو ہوتی ہیں۔
مواد کی ڈیکرپشن — اگر پش نوٹیفکیشن میں خفیہ کردہ پے لوڈ ہو تو ایکسٹینشن ڈسپلے سے پہلے اسے ڈیکرپٹ کرتی ہے۔ میڈیا ڈاؤن لوڈ — نوٹیفکیشن میں تصویر یا ویڈیو منسلک کرنا۔ مقامی کاری — نوٹیفکیشن کے متن کو ڈیوائس کی علاقائی ترتیبات کے مطابق ڈھالنا۔ ڈیٹا افزودگی — مقامی اسٹوریج یا کیشے سے اضافی معلومات شامل کرنا۔
Apple کے مطابق، ایپس میں سب سے عام منظرنامہ بھرپور میڈیا نوٹیفکیشنز کے لیے تصویر ڈاؤن لوڈ ہے۔ سرور پے لوڈ میں تصویر کا URL بھیجتا ہے، ایکسٹینشن اسے ایک عارضی ڈائریکٹری میں ڈاؤن لوڈ کرتی ہے اور UNNotificationAttachment بناتی ہے، جسے سسٹم معیاری یا حسب ضرورت انٹرفیس میں دکھاتا ہے۔
ایکسٹینشن نوٹیفکیشن کے متن کو مکمل طور پر دوبارہ لکھ سکتی ہے، عنوان بدل سکتی ہے یا ایک ذیلی عنوان شامل کر سکتی ہے۔ مثال کے طور پر، ایک میسنجر ایپ خفیہ کردہ نوٹیفکیشن وصول کر سکتی ہے، اسے ایکسٹینشن میں ڈیکرپٹ کر سکتی ہے اور پڑھنے کے قابل متن دکھا سکتی ہے۔ یا ایک خبروں کی ایپ ڈسپلے سے پہلے ذیلی عنوان میں خبر کا زمرہ شامل کر سکتی ہے۔
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 وراثت پاتی ہے۔ کلاس دو لائف سائیکل طریقے متعین کرتی ہے: didReceive(_:withContentHandler:) — پروسیسنگ کا بنیادی طریقہ، اور serviceExtensionTimeWillExpire() — ٹائم آؤٹ ہینڈلر۔
didReceive(_:withContentHandler:) نوٹیفکیشن موصول ہونے پر کال کیا جاتا ہے۔ ایکسٹینشن ایک UNNotificationRequest اور contentHandler کلوزر وصول کرتی ہے، جسے تبدیل شدہ UNMutableNotificationContent کے ساتھ کال کرنا ضروری ہے۔ ایکسٹینشن contentHandler کو کال کرنے کی پابند ہے — اگر ایسا نہیں کرتی تو iOS ٹائم آؤٹ ختم ہونے کے بعد اصل نوٹیفکیشن دکھائے گا۔
اہم: ایکسٹینشن ایک وقت میں صرف ایک نوٹیفکیشن پروسیس کر سکتی ہے۔ اگر ایک ساتھ متعدد نوٹیفکیشنز آئیں تو iOS ہر ایک کے لیے علیحدہ ایکسٹینشن انسٹینسز بناتا ہے۔ ترتیب وار پروسیسنگ کے لیے عالمی حالت استعمال نہیں کی جا سکتی۔
serviceExtensionTimeWillExpire() سسٹم کے ذریعے کال کیا جاتا ہے جب باقی عملدرآمد کا وقت ختم ہونے والا ہوتا ہے۔ اس طریقے میں، آپ کو فوری طور پر contentHandler کو اس وقت تیار کسی بھی مواد کے ساتھ کال کرنا چاہیے — چاہے میڈیا فائل ڈاؤن لوڈ مکمل نہ ہوئی ہو۔ اگر آپ اس طریقے میں contentHandler کو کال نہیں کرتے، iOS اصل نوٹیفکیشن دکھائے گا۔
اس طریقے میں کم سے کم قابل قبول مواد محفوظ کرنے کی سفارش کی جاتی ہے — مثال کے طور پر، متن اور عنوان والا نوٹیفکیشن لیکن تصویر کے بغیر جس کا ڈاؤن لوڈ وقت پر مکمل نہیں ہوا۔
UNNotificationAttachment ایک آبجیکٹ ہے جو نوٹیفکیشن میں میڈیا فائل منسلک کرنے کے لیے ایکسٹینشن کے ذریعے بنایا جاتا ہے۔ ایکسٹینشن فائل کو نیٹ ورک سے ڈاؤن لوڈ کرتی ہے، عارضی ڈائریکٹری میں محفوظ کرتی ہے اور مواد کی قسم بتاتے ہوئے UNNotificationAttachment بناتی ہے۔
UNNotificationAttachment init(identifier:url:options:) انیشیالائزر کا استعمال کرتے ہوئے بنایا جاتا ہے۔ URL کو ایکسٹینشن کے لیے قابل رسائی عارضی ڈائریکٹری میں مقامی فائل کی طرف اشارہ کرنا چاہیے۔ بنانے کے بعد، منسلکہ UNMutableNotificationContent کی attachments صف میں شامل کیا جاتا ہے۔
Apple ڈاؤن لوڈ کے لیے پس منظر کی ترتیب کے ساتھ URLSession استعمال کرنے کی سفارش کرتا ہے — معیاری URLSession استعمال کرنے پر، ڈاؤن لوڈ تھریڈ کو روکتا ہے اور 30 سیکنڈ کی حد سے وقت استعمال کرتا ہے۔ پس منظر URLSession ایکسٹینشن ختم ہونے کے بعد بھی ڈاؤن لوڈ جاری رکھتا ہے، اور نتیجہ اگلے آغاز پر استعمال کیا جا سکتا ہے۔
اگر سرور خفیہ کردہ نوٹیفکیشن بھیجتا ہے تو ایکسٹینشن contentHandler کال کرنے سے پہلے پے لوڈ کو ڈیکرپٹ کرے۔ ڈیکرپشن میں عام طور پر Keychain یا App Group سے کلید کی درخواست کرنا، CommonCrypto کے ذریعے ڈیکرپٹ کرنا اور نوٹیفکیشن کے body یا userInfo کو تبدیل کرنا شامل ہے۔ ڈیکرپشن کی غلطی کی صورت میں، آپ کو اصل مواد کے ساتھ contentHandler کال کرنا چاہیے — تاکہ صارف کم از کم دیکھے کہ نوٹیفکیشن آیا ہے، چاہے ناقابل مطالعہ ہو۔
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 سخت وقتی حدود میں کام کرتی ہے۔ iOS ایک مقررہ عملدرآمد کا وقت مختص کرتا ہے — فعال ہونے سے تقریباً 30 سیکنڈ۔ اگر ایکسٹینشن نے اس وقت میں contentHandler کو کال نہیں کیا، سسٹم زبردستی عمل ختم کرتا ہے اور اصل نوٹیفکیشن کو بغیر تبدیلی کے دکھاتا ہے۔
کثیر سطحی فال بیک لاگو کرنے کی سفارش کی جاتی ہے: پہلے میڈیا ڈاؤن لوڈ کرنے کی کوشش کریں، کامیابی پر مکمل مواد کے ساتھ contentHandler کال کریں؛ ناکامی پر متن کے ساتھ لیکن میڈیا کے بغیر contentHandler کال کریں؛ سنگین غلطی پر اصل مواد منتقل کریں۔ یہ نقطہ نظر اس بات کی ضمانت دیتا ہے کہ صارف ہمیشہ ایک نوٹیفکیشن دیکھے گا نہ کہ خالی اسکرین۔
Apple کے مطابق، ٹائم آؤٹ کی سب سے عام وجہ سست کنکشن پر بڑی میڈیا فائلوں کا ڈاؤن لوڈ ہے۔ خطرہ کم کرنے کے لیے، سرور پر تصویر کے سائز کو بہتر بنانے کی سفارش کی جاتی ہے — مکمل ریزولوشن کے بجائے 300 KB تک کے پیش منظر بھیجیں۔ مکمل سائز کی تصاویر ایپ کھولنے پر ڈاؤن لوڈ کی جانی چاہئیں۔
ایکسٹینشن ٹائم آؤٹ اور غلطیوں کو ٹریک کرنے کے لیے، آپ یونیفائیڈ لاگنگ سسٹم میں تشخیصی پیغامات ریکارڈ کرنے کے لیے os_log استعمال کر سکتے ہیں۔ اگرچہ ایکسٹینشن میں براہ راست فائل لاگنگ مشکل ہے، os_log ڈویلپر ڈیوائس پر Console.app کے ذریعے کارکردگی کے تجزیہ کی اجازت دیتا ہے۔ Apple ہر didReceive کال میں میٹرکس شامل کرنے کی سفارش کرتا ہے — ڈاؤن لوڈ کا وقت، فائل کا سائز، آپریشن کا نتیجہ۔
override func serviceExtensionTimeWillExpire() {
let fallback = bestEffortContent as?
UNMutableNotificationContent
?? request.content.mutableCopy()
as! UNMutableNotificationContent
contentHandler(fallback)
}
اکثر پوچھے گئے سوالات
سرور پش نوٹیفکیشن کے aps ڈکشنری میں mutable-content:1 کلید شامل کرتا ہے۔ اس پیرامیٹر کے بغیر، سسٹم ایکسٹینشن کو نظر انداز کرتا ہے اور معیاری نوٹیفکیشن دکھاتا ہے۔
نہیں۔ mutable-content:1 Service Extension کو فعال کرنے کی لازمی شرط ہے۔ اگر کلید غائب ہے یا 0 پر سیٹ ہے تو نوٹیفکیشن ایکسٹینشن کو کال کیے بغیر دکھایا جاتا ہے۔
iOS زبردستی ایکسٹینشن ختم کرتا ہے اور بغیر تبدیلی کے اصل نوٹیفکیشن دکھاتا ہے۔ اس سے بچنے کے لیے، کم سے کم قابل قبول مواد کے ساتھ serviceExtensionTimeWillExpire() لاگو کریں۔
App Group (مشترکہ UserDefaults یا فائل) یا ایپ اور ایکسٹینشن کے درمیان مشترکہ رسائی والے Keychain کے ذریعے۔ نوٹیفکیشن پے لوڈ میں براہ راست کنجیاں منتقل کرنا محفوظ نہیں ہے۔
فی نوٹیفکیشن 4 منسلکات تک، ہر ایک 50 MB تک۔ منسلکات کا کل سائز ڈاؤن لوڈ کے وقت کو متاثر کرتا ہے — جتنی زیادہ فائلیں، ٹائم آؤٹ کا خطرہ اتنا ہی زیادہ۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں