Notification Service Extension ایک iOS ایکسٹینشن ہے جو صارف کو دکھائے جانے سے پہلے push اطلاع کو روکتی ہے اور مواد میں ترمیم کرنے کی اجازت دیتی ہے۔ ایکسٹینشن خفیہ کردہ ڈیٹا کو ڈیکرپٹ کر سکتی ہے، میڈیا منسلکات ڈاؤن لوڈ کر سکتی ہے، متن تبدیل کر سکتی ہے یا حسب ضرورت فیلڈز شامل کر سکتی ہے۔ Apple Developer, 2025 کے مطابق، Notification Service Extension کے پاس پس منظر میں کام مکمل کرنے کے لیے 30 سیکنڈ تک کا وقت ہے۔
اہم نکات
Notification Service Extension iOS میں ایک ایپ ایکسٹینشن ہے جو push اطلاع ظاہر ہونے سے پہلے چلتی ہے۔ یہ سرور کو کم سے کم پے لوڈ بھیجنے کی اجازت دیتی ہے جبکہ ایکسٹینشن اسے مواد سے بھرپور کرتی ہے: تصاویر ڈاؤن لوڈ کرنا، ڈیٹا ڈیکرپٹ کرنا، متن تبدیل کرنا۔ صارف پہلے سے پروسیس شدہ اطلاع دیکھتا ہے۔
جب iOS کو push اطلاع ملتی ہے، نظام چیک کرتا ہے کہ آیا ایپ کے لیے کوئی ایکسٹینشن موجود ہے۔ اگر ایکسٹینشن رجسٹرڈ ہے، iOS اسے پس منظر کے عمل میں شروع کرتا ہے اور didReceive(_:withContentHandler:) طریقہ کے ذریعے اطلاع کا مواد منتقل کرتا ہے۔ ایکسٹینشن مواد پر کارروائی کرتی ہے اور تبدیل شدہ مواد کے ساتھ contentHandler کو کال کرتی ہے۔ اگر ایکسٹینشن 30 سیکنڈ کے اندر مکمل نہیں ہوتی، نظام اصل اطلاع ظاہر کرتا ہے۔
Service Extension ان منظرناموں میں ضروری ہے جہاں اطلاع کے مواد کو ڈیوائس پر پروسیسنگ کی ضرورت ہوتی ہے۔ محفوظ مواصلات: سرور خفیہ کردہ پے لوڈ بھیجتا ہے، ایکسٹینشن اسے مقامی طور پر ڈیکرپٹ کرتی ہے۔ بھرپور میڈیا اطلاعات: سرور تصویر کا URL بھیجتا ہے، ایکسٹینشن اسے ڈاؤن لوڈ اور منسلک کرتی ہے۔ متحرک مقامی کاری: ایکسٹینشن ڈیوائس کی زبان میں متن تبدیل کرتی ہے۔
| منظرنامہ | ایکسٹینشن کے بغیر | ایکسٹینشن کے ساتھ |
|---|---|---|
| تصویر | تعاون یافتہ نہیں | ڈاؤن لوڈ اور ظاہر کی جاتی ہے |
| خفیہ کاری | سرور کلید رکھتا ہے | ڈیوائس پر ڈیکرپشن |
| متن | سرور پر مقرر | متحرک تبدیلی |
| توثیق | جانچ نہیں کی جاتی | نقصان دہ اطلاعات منسوخ |
Notification Service Extension محدود ماحول میں کام کرتی ہے۔ زیادہ سے زیادہ عملدرآمد کا وقت 30 سیکنڈ ہے۔ ایکسٹینشن کی مرکزی ایپ اسٹوریج (App Group کے علاوہ) تک رسائی نہیں ہے۔ ایکسٹینشن کا سائز 50 MB تک محدود ہے۔ وقت ختم ہونے پر، نظام اصل مواد کے ساتھ contentHandler کو کال کرتا ہے اور تمام تبدیلیاں ضائع ہو جاتی ہیں۔
Xcode میں، Notification Service Extension کو Notification Service Extension قسم کا نیا target بنا کر شامل کیا جاتا ہے۔ Xcode ایک ٹیمپلیٹ NotificationService کلاس تیار کرتا ہے جو UNNotificationServiceExtension سے وراثت حاصل کرتی ہے، دو طریقوں کے ساتھ: didReceive اور serviceExtensionTimeWillExpire۔
Xcode میں، File → New → Target → Notification Service Extension منتخب کریں۔ ایک نام درج کریں (مثال کے طور پر، PushNotificationService) اور Swift زبان منتخب کریں۔ یقینی بنائیں کہ target مرکزی ایپ میں شامل ہے اور اس کے پاس درست دستخط ہے۔ تخلیق کے بعد، NotificationService.swift کلاس بنیادی نفاذ کے ساتھ تیار ہوگی۔
ایکسٹینشن کے Info.plist میں NSExtension کلید ہوتی ہے جس میں ذیلی کلیاں NSExtensionPointIdentifier (com.apple.usernotifications.service) اور NSExtensionPrincipalClass (آپ کے کنٹرولر کا نام) ہوتی ہیں۔ اضافی طور پر، ایکسٹینشن ایکٹیویشن قواعد کے ساتھ NSExtensionAttributes متعین کیے جا سکتے ہیں۔ Xcode یہ ترتیبات خودکار طور پر تیار کرتا ہے۔
بنیادی نفاذ didReceive کو اوور رائڈ کرتا ہے، اطلاع کے مواد میں ترمیم کرتا ہے اور contentHandler کو کال کرتا ہے۔ اگر پروسیسنگ میں بہت زیادہ وقت لگتا ہے، serviceExtensionTimeWillExpire کو کال کیا جاتا ہے، جہاں آپ کو موجودہ حالت کے ساتھ کام مکمل کرنا ہوتا ہے۔
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 = "[کارروائی ہوگئی] \(bestAttemptContent.title)"
contentHandler?(bestAttemptContent)
}
}
override func serviceExtensionTimeWillExpire() {
if let contentHandler = contentHandler,
let bestAttemptContent = bestAttemptContent {
contentHandler(bestAttemptContent)
}
}
}
Service Extension کے اہم استعمالوں میں سے ایک ڈیوائس پر اطلاع کے مواد کو ڈیکرپٹ کرنا ہے۔ سرور ایک خفیہ کردہ پے لوڈ بھیجتا ہے اور ایکسٹینشن Keychain یا App Group میں ذخیرہ شدہ کلید کا استعمال کرتے ہوئے اسے ڈیکرپٹ کرتی ہے۔ یہ یقینی بناتا ہے کہ منتقلی کے دوران مواد کو روکا نہیں جا سکتا۔
سرور ہم آہنگ کلید (AES-256) کا استعمال کرتے ہوئے اطلاع کے باڈی کو خفیہ کرتا ہے۔ خفیہ کاری کی کلید کلائنٹ اور سرور کے درمیان پہلے سے طے پاتی ہے۔ ایکسٹینشن پے لوڈ کے ڈیٹا فیلڈ میں خفیہ کردہ سٹرنگ وصول کرتی ہے، اسے ڈیکرپٹ کرتی ہے اور اطلاع کے فیلڈز میں داخل کرتی ہے۔ صارف کی کلید تصدیق کے بعد Keychain سے حاصل کی جا سکتی ہے۔
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)
}
ڈیکرپشن کلید کو ایکسٹینشن کوڈ یا NSUserDefaults میں ذخیرہ نہیں کرنا چاہیے۔ App Group کے ذریعے رسائی کے ساتھ iOS Keychain استعمال کریں تاکہ ایپ اور ایکسٹینشن دونوں کلید پڑھ سکیں۔ کلائنٹ پر کلید کی تخلیق کے لیے AES-256-GCM الگورتھم کے ساتھ Security.framework استعمال کریں۔
Notification Service Extension کا سب سے عام استعمال اطلاع میں ظاہر کرنے کے لیے تصاویر، GIF اور ویڈیوز ڈاؤن لوڈ کرنا ہے۔ سرور میڈیا فائل کا URL بھیجتا ہے اور ایکسٹینشن اسے ڈاؤن لوڈ کرتی ہے، عارضی ڈائریکٹری میں محفوظ کرتی ہے اور UNNotificationAttachment بناتی ہے۔
ایکسٹینشن اطلاع کے پے لوڈ فیلڈ سے تصویر کا URL وصول کرتی ہے۔ URLSession کا استعمال کرتے ہوئے، ایکسٹینشن فائل کو عارضی ڈائریکٹری میں ڈاؤن لوڈ کرتی ہے۔ ڈاؤن لوڈ مکمل ہونے کے بعد، مقامی URL کے ساتھ UNNotificationAttachment بنایا جاتا ہے۔ منسلکہ تبدیل شدہ مواد میں منتقل کیا جاتا ہے۔ iOS خود بخود معیاری انٹرفیس یا Notification Content Extension میں تصویر ظاہر کرتا ہے۔
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 اطلاعات میں ظاہر کرنے کے لیے درج ذیل فارمیٹس کی حمایت کرتا ہے: JPEG، PNG، GIF (جامد)، 50 MB تک MPEG-4 ویڈیو۔ آڈیو فائلوں کے لیے، MP3، AAC اور ALAC تعاون یافتہ ہیں۔ اہم: تمام میڈیا فائلیں 30 سیکنڈ کی حد کے اندر ڈاؤن لوڈ کی جانی چاہئیں۔ بڑی فائلوں کے لیے، سرور سائیڈ کراپنگ یا تدریجی لوڈنگ کی سفارش کی جاتی ہے۔
30 سیکنڈ کی حد کا انتظام Notification Service Extension تیار کرتے وقت ایک اہم کام ہے۔ اگر ایکسٹینشن وقت پر پروسیسنگ مکمل نہیں کرتی، نظام serviceExtensionTimeWillExpire کو کال کرتا ہے اور اصل مواد ظاہر کرتا ہے۔ ہر قسم کی پروسیسنگ کے لیے فال بیک منظرنامے فراہم کیے جانے چاہئیں۔
کاموں کو ترجیح کے مطابق تقسیم کریں۔ پہلے اہم تبدیلیاں (ڈیکرپشن، بنیادی مقامی کاری) انجام دیں۔ اختیاری بہتری (تصویر ڈاؤن لوڈ، متن کی افزودگی) بعد میں کریں۔ نیٹ ورک کی درخواستوں کے لیے ٹائم آؤٹ کے ساتھ URLSession استعمال کریں تاکہ پوری حد ایک ہی آپریشن پر خرچ نہ ہو۔
اگر تصویر ڈاؤن لوڈ ناکام ہوتی ہے یا پے لوڈ ڈیکرپشن غلطی لوٹاتا ہے، ایکسٹینشن کو اصل مواد کے ساتھ contentHandler کال کرنا چاہیے۔ contentHandler کو کال کیے بغیر ایکسٹینشن کو کبھی ختم نہ کریں — اس سے اطلاع ضائع ہوتی ہے۔ محفوظ فال بیک ہمیشہ ایکسٹینشن کوڈ میں فراہم کیا جانا چاہیے۔
override func didReceive(
request: UNNotificationRequest,
withContentHandler handler: @escaping (UNNotificationContent) -> Void
) {
let content = (request.content.mutableCopy()
as? UNMutableNotificationContent) ?? request.content
// اہم کام: ڈیکرپشن
var decryptedContent = tryDecryptPayload(content)
// اختیاری کام: میڈیا
guard let mediaUrl = decryptedContent.userInfo["media_url"]
as? String else {
handler(decryptedContent)
return
}
downloadAndAttachMedia(
content: decryptedContent,
mediaUrl: mediaUrl,
handler: handler
)
}
Notification Service Extension کی جانچ کرنے کے لیے، Xcode استعمال کریں: ایکسٹینشن target منتخب کریں، سمیلیٹر پر چلائیں اور ٹرمینل یا Firebase Console کے ذریعے push اطلاع بھیجیں۔ os_log کے ذریعے پروسیسنگ کے ہر مرحلے کو لاگ کریں — اس سے ٹائمنگ اور ڈاؤن لوڈ کے مسائل کی تشخیص میں مدد ملتی ہے۔
اکثر پوچھے گئے سوالات
سسٹم serviceExtensionTimeWillExpire کو کال کرتا ہے، پھر اصل اطلاع بغیر تبدیلی کے ظاہر کرتا ہے۔ تمام ڈاؤن لوڈ کردہ فائلیں اور تبدیلیاں ضائع کر دی جاتی ہیں۔
ہاں، اگر آپ خالی مواد (خالی فیلڈز کے ساتھ UNNotificationContent) کے ساتھ contentHandler کو کال کرتے ہیں، تو اطلاع ظاہر نہیں ہوگی۔ یہ سپیم اطلاعات یا غلط ڈیٹا کو فلٹر کرنے کے لیے استعمال ہوتا ہے۔
ٹوکن اطلاع کے پے لوڈ کے userInfo میں منتقل کیا جا سکتا ہے یا App Group کے ذریعے Keychain سے حاصل کیا جا سکتا ہے۔ ایکسٹینشن UserDefaults میں ٹوکن ذخیرہ کرنے کی سفارش نہیں کی جاتی۔
ایکسٹینشن پر اسی ڈویلپر سرٹیفکیٹ سے دستخط ہونے چاہئیں جو مرکزی ایپ کے لیے استعمال ہوتا ہے۔ پروڈکشن کے لیے، Push Notifications کی صلاحیت کے ساتھ ایک پروڈکشن سرٹیفکیٹ درکار ہے۔
ڈیوائس کو Xcode سے منسلک کریں، رن اسکیم میں ایکسٹینشن target منتخب کریں اور Firebase Console کے ذریعے push اطلاع بھیجیں۔ ایکسٹینشن میں بریک پوائنٹس مرکزی ایپ کی طرح کام کرتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں