Notification Extension ایک iOS میکانزم ہے جو پش اطلاعات کو صارف کو دکھانے سے پہلے ان کے مواد اور ظاہری شکل میں تبدیلی کی اجازت دیتا ہے۔ ایکسٹینشنز آپریٹنگ سسٹم کی جانب ایک علیحدہ عمل میں کام کرتی ہیں: UNNotificationServiceExtension آنے والے مواد کو پروسیس کرتی ہے، جبکہ UNNotificationContentExtension انٹرفیس کا انتظام کرتی ہے۔ Apple Developer Documentation, 2026 کے مطابق، Service Extension کو اطلاع دکھانے سے پہلے کاموں کی انجام دہی کے لیے 30 سیکنڈ تک ملتے ہیں۔ یہ حد منسلکات ڈاؤن لوڈ کرنے یا ڈیٹا ڈیکرپٹ کرتے وقت اہم ہے۔
اہم نکات
Notification Extension ایک iOS سافٹ ویئر جزو ہے جو پش اطلاعات کے معیاری رویے کو مواد میں تبدیلی اور انٹرفیس حسب ضرورت بنانے کی صلاحیت شامل کرکے وسعت دیتا ہے۔ عام اطلاعات کے برعکس جو سسٹم کے ذریعے معیاری فارمیٹ میں دکھائی جاتی ہیں، ایکسٹینشنز ڈویلپر کو دکھانے سے پہلے مواد کو متاثر کرنے اور ایک منفرد یوزر انٹرفیس بنانے کی اجازت دیتی ہیں۔
Apple مختلف مقاصد کے لیے دو اقسام کی Notification Extension فراہم کرتا ہے: UNNotificationServiceExtension آنے والے پے لوڈ پروسیسنگ کا ذمہ دار ہے، جبکہ UNNotificationContentExtension ڈسپلے کا انتظام کرتی ہے۔ Service Extension اطلاع دکھائے جانے سے پہلے چلتی ہے اور Apple Developer Documentation کے مطابق 30 سیکنڈ تک محدود عملدرآمد کا وقت رکھتی ہے۔ Content Extension صارف کے اطلاع کے ساتھ تعامل کرنے کے بعد فعال ہوتی ہے اور ایک حسب ضرورت ویو دکھاتی ہے۔
ایک معیاری iOS پش اطلاع JSON پے لوڈ کے alert، title اور subtitle فیلڈز کی بنیاد پر سسٹم کے ذریعے خودکار طور پر دکھائی جاتی ہے۔ Notification Extension کنٹرول روک لیتی ہے: Service Extension خام پے لوڈ وصول کرتی ہے، اسے تبدیل کرتی ہے اور ڈسپلے کے لیے سسٹم کو بھیجتی ہے۔ Content Extension معیاری بینر کو کسی بھی کنٹرول عنصر کے ساتھ حسب ضرورت انٹرفیس سے بدل دیتی ہے۔
جب ڈیوائس mutable-content: 1 کلید کے ساتھ پش اطلاع وصول کرتی ہے، سسٹم ایک علیحدہ عمل میں Service Extension شروع کرتا ہے۔ ایکسٹینشن کا عمل مرکزی ایپلیکیشن سے الگ تھلگ ہوتا ہے اور 50 MB میموری کی حد کے ساتھ اپنا سینڈ باکس رکھتا ہے۔ پروسیسنگ مکمل ہونے کے بعد، ایکسٹینشن completion handler کو کال کرتی ہے، تبدیل شدہ UNNotificationContent کو ڈسپلے کے لیے سسٹم کو بھیجتی ہے۔
UNNotificationServiceExtension پش اطلاعات کو صارف کو دکھانے سے پہلے پروگرامی طور پر تبدیل کرنے کا بنیادی ٹول ہے۔ ایکسٹینشن خودکار طور پر اس وقت فعال ہوتی ہے جب ایسی اطلاع موصول ہوتی ہے جس کے پے لوڈ میں mutable-content: 1 فلیگ سیٹ ہو۔ 30 سیکنڈ کے اندر، ایکسٹینشن میڈیا منسلک ڈاؤن لوڈ کر سکتی ہے، متن تبدیل کر سکتی ہے، خفیہ کردہ ڈیٹا ڈیکرپٹ کر سکتی ہے یا مواد کو افزودہ کر سکتی ہے۔
ایکسٹینشن UNNotificationServiceExtension پروٹوکول سے دو اہم طریقوں کو نافذ کرتی ہے۔ didReceive طریقہ خام UNNotificationRequest کے ساتھ آنے والی درخواست وصول کرتا ہے اور نئے UNNotificationContent کے ساتھ completion handler کے ذریعے تبدیلی کی اجازت دیتا ہے۔ serviceExtensionTimeWillExpire طریقہ ٹائم آؤٹ سے ایک سیکنڈ پہلے سسٹم کے ذریعے کال کیا جاتا ہے — اس میں پروسیسنگ مکمل کرنی ہوتی ہے اور موجودہ (ممکنہ طور پر جزوی) نتیجہ بھیجنا ہوتا ہے۔
ایک منظر نامے پر غور کریں جہاں سرور حسب ضرورت فیلڈ میں تصویر کے URL کے ساتھ پش بھیجتا ہے۔ Service Extension اس تصویر کو نیٹ ورک پر ڈاؤن لوڈ کرتی ہے، UNNotificationAttachment بناتی ہے اور مواد میں شامل کرتی ہے۔ UNNotificationAttachment مقامی تصویر، ویڈیو یا آڈیو فائل قبول کرتا ہے اور خودکار طور پر اسے ایکسٹینشن کے سینڈ باکس میں کاپی کرتا ہے۔ منسلک بنانے کے بعد، ایکسٹینشن اپ ڈیٹ شدہ مواد سسٹم کو بھیجتی ہے۔
class NotificationService: UNNotificationServiceExtension {
override func didReceive(_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void) {
let userInfo = request.content.userInfo
guard let imageURL = URL(string: userInfo["image-url"] as! String)
else { contentHandler(request.content); return }
let attachment = try! UNNotificationAttachment(
identifier: "image", url: imageURL,
options: [UNNotificationAttachmentOptionsTypeHintKey: "jpg"])
let modifiedContent = request.content.mutableCopy()
as! UNMutableNotificationContent
modifiedContent.attachments = [attachment]
contentHandler(modifiedContent)
}
override func serviceExtensionTimeWillExpire() {
contentHandler?(bestAttemptContent ?? request.content)
}
}
جب ایک ہی منسلکات والی اطلاعات بار بار بھیجی جاتی ہیں، تو ڈاؤن لوڈ کردہ فائلوں کو ڈیوائس پر کیش کرنے کی سفارش کی جاتی ہے۔ FileManager ایکسٹینشن کی کیش ڈائریکٹری تک رسائی فراہم کرتا ہے، جو لانچ کے درمیان برقرار رہتی ہے۔ اس سے بعد کی اطلاعات کا پروسیسنگ وقت کم ہوتا ہے اور نیٹ ورک لوڈ گھٹتا ہے۔ Apple کے مطابق، کیشنگ پروسیسنگ وقت کو مکمل ڈاؤن لوڈ کے بجائے 2–5 سیکنڈ تک کم کر سکتی ہے۔
UNNotificationContentExtension معیاری اطلاع بینر کو Interface Builder یا SwiftUI میں بنائے گئے حسب ضرورت انٹرفیس سے تبدیل کرنے کی اجازت دیتی ہے۔ ایکسٹینشن اس وقت فعال ہوتی ہے جب صارف اطلاع پر کوئی عمل کرتا ہے: ٹیپ کرنا، نیچے سوائپ کرنا یا 3D Touch۔ Content Extension وہ مواد وصول کرتی ہے جو پہلے ہی Service Extension کے ذریعے پروسیس ہو چکا ہوتا ہے اور اسے حسب ضرورت ویو میں دکھاتی ہے۔
ہر Content Extension Info.plist کے ذریعے ایک یا زیادہ اطلاع کے زمروں سے منسلک ہوتی ہے۔ زمرہ سرور پر APNS پے لوڈ میں category فیلڈ کے ذریعے متعین کیا جاتا ہے۔ سسٹم موصولہ اطلاع کے زمرے کی بنیاد پر خودکار طور پر مناسب ایکسٹینشن منتخب کرتا ہے۔ انٹرفیس معیاری UIKit اجزاء یا SwiftUI View استعمال کرتے ہوئے storyboard کے ذریعے بنایا جاتا ہے۔
Content Extension UNNotificationAction میں متعین کردہ حسب ضرورت بٹن اور ٹیپ ہینڈلرز کو سپورٹ کرتی ہے۔ UNNotificationAction زمرہ رجسٹریشن کے مرحلے پر بنایا جاتا ہے اور UNTextInputNotificationAction کے ذریعے ٹیکسٹ ان پٹ کو سپورٹ کر سکتا ہے۔ جب صارف بٹن دباتا ہے، ایکسٹینشن عمل شناخت کنندہ کے ساتھ didReceive کال بیک وصول کرتی ہے اور متعلقہ منطق انجام دے سکتی ہے — URL کھولنا، سرور کو درخواست بھیجنا یا انٹرفیس اپ ڈیٹ کرنا۔
Content Extension اپنے رن لوپ اور تقریباً 50 MB میموری کی حد کے ساتھ الگ تھلگ عمل میں چلتی ہے۔ ایکسٹینشن کی کارکردگی اہم ہے کیونکہ سسٹم واچ ڈاگ حد سے تجاوز کرنے پر عمل ختم کر دیتا ہے۔ Content Extension کے اندر بھاری حسابات، بڑی تصاویر لوڈ کرنے اور طویل نیٹ ورک درخواستوں سے بچنے کی سفارش کی جاتی ہے۔
UNNotificationAttachment ایک آبجیکٹ ہے جو پش اطلاع میں میڈیا فائل (تصویر، ویڈیو، آڈیو یا GIF) شامل کرتا ہے۔ منسلک ایک مقامی فائل URL سے بنایا جاتا ہے جو ایکسٹینشن کے سینڈ باکس میں ہونا چاہیے۔ منسلک کا زیادہ سے زیادہ سائز 10 MB سے تجاوز نہیں کرنا چاہیے، ورنہ سسٹم اسے بناتے وقت مسترد کر دے گا۔
Apple میڈیا منسلکات کے لیے محدود فارمیٹس کے سیٹ کو سپورٹ کرتا ہے۔ تصاویر — JPEG، PNG، GIF (متحرک سمیت)، TIFF۔ ویڈیو — MPEG، MP4، MOV زیادہ سے زیادہ 30 سیکنڈ کی مدت کے ساتھ۔ آڈیو — MP3، AAC، WAV، CAF۔ ہر فارمیٹ کے لیے UNNotificationAttachmentOptionsTypeHintKey کے ذریعے قسم متعین کی جا سکتی ہے، جو سسٹم کو فائل کو صحیح طریقے سے پروسیس کرنے میں مدد دیتی ہے۔
چونکہ پش پے لوڈ میں صرف URL ہوتا ہے، فائل خود نہیں، منسلک ڈاؤن لوڈ Service Extension کے اندر کیا جانا چاہیے۔ زیادہ سے زیادہ ڈاؤن لوڈ وقت 30 سیکنڈ تک محدود ہے، لہٰذا کم سے کم ترتیبات کے ساتھ URLSession استعمال کرنے اور کمزور سگنل پر ڈاؤن لوڈ غیر فعال کرنے کی سفارش کی جاتی ہے۔ اگر منسلک وقت پر لوڈ نہیں ہوتا، اطلاع میڈیا کے بغیر دکھائی جاتی ہے — یہ ڈیفالٹ سسٹم رویہ ہے۔
آئیے ایک مکمل Notification Extension مثال دیکھیں جو تصویر ڈاؤن لوڈ کرتی ہے، محفوظ کرتی ہے اور اطلاع میں شامل کرتی ہے۔ NotificationService UNNotificationServiceExtension سے وراثت پاتی ہے اور didReceive طریقہ کو اوور رائیڈ کرتی ہے۔ مثال اختیاری فیلڈز کو ہینڈل کرنے، منسلک بنانے اور تبدیل شدہ مواد کے ساتھ completion handler کو کال کرنے کو ظاہر کرتی ہے۔
import UserNotifications
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler:
@escaping (UNNotificationContent) -> Void
) {
self.contentHandler = contentHandler
self.bestAttemptContent =
(request.content.mutableCopy()
as! UNMutableNotificationContent)
guard let attachmentURLString =
bestAttemptContent?.userInfo["attachment-url"] as? String,
let url = URL(string: attachmentURLString)
else {
contentHandler(request.content)
return
}
URLSession.shared.downloadTask(with: url) {
[weak self] localURL, _, error in
guard let localURL = localURL, error == nil
else {
contentHandler(request.content)
return
}
let attachment = try! UNNotificationAttachment(
identifier: "media", url: localURL)
self?.bestAttemptContent?.attachments = [attachment]
contentHandler(self?.bestAttemptContent
?? request.content)
}.resume()
}
override func serviceExtensionTimeWillExpire() {
if let content = bestAttemptContent {
contentHandler?(content)
}
}
}
ایکسٹینشن کے صحیح طریقے سے کام کرنے کے لیے، Info.plist میں اطلاع کے زمرے رجسٹر کرنا ضروری ہے۔ NSExtensionPointIdentifier کلید Service Extension کے لیے com.apple.usernotifications.service یا Content Extension کے لیے com.apple.usernotifications.content پر سیٹ کی جاتی ہے۔ زمرے AppDelegate میں UNUserNotificationCenter کے ذریعے ایپلیکیشن لانچ کے وقت متعین کیے جاتے ہیں، اور ایکسٹینشن صرف پے لوڈ میں مماثل زمرے والی اطلاعات کے لیے فعال ہوتی ہے۔
اکثر پوچھے گئے سوالات
Service Extension اطلاع دکھانے سے پہلے مواد میں تبدیلی کرتی ہے — میڈیا شامل کرتی ہے، متن تبدیل کرتی ہے، ڈیٹا ڈیکرپٹ کرتی ہے۔ Content Extension صارف کے تعامل کے بعد اطلاع کے انٹرفیس کو حسب ضرورت انٹرفیس سے بدل دیتی ہے۔ Service Extension دکھانے سے پہلے کام کرتی ہے، Content Extension بعد میں۔
سسٹم didReceive میں کوڈ پر عملدرآمد کے لیے 30 سیکنڈ مختص کرتا ہے۔ اگر پروسیسنگ اس وقت میں مکمل نہیں ہوتی، serviceExtensionTimeWillExpire کال کیا جاتا ہے جہاں موجودہ نتیجہ بھیجنا ہوتا ہے۔ منسلکات ڈاؤن لوڈ کو مدنظر رکھتے ہوئے 10–15 سیکنڈ کے اندر رہنے کی سفارش کی جاتی ہے۔
ہاں، iOS 16 سے Content Extension میں SwiftUI معاون ہے۔ View کو UIHostingController میں لپیٹ کر storyboard میں شامل کیا جاتا ہے۔ تاہم، میموری کی حدود کی وجہ سے، SwiftUI صرف کم سے کم عناصر والے سادہ انٹرفیس کے لیے استعمال کرنے کی سفارش کی جاتی ہے۔
ڈاؤن لوڈ کی غلطی یا وقت ختم ہونے کی صورت میں، منسلک کے بغیر اصل مواد کے ساتھ completion handler کو کال کریں۔ سسٹم اطلاع دکھائے گا میڈیا کے بغیر معیاری شکل میں۔ تشخیص کے لیے OSLog کے ذریعے غلطیاں لاگ کریں، لیکن اطلاع کے ڈسپلے کو مسدود نہ کریں۔
ایکسٹینشن تقریباً 50 MB کی حد کے ساتھ الگ تھلگ عمل میں چلتی ہے۔ حد سے تجاوز کرنے پر، سسٹم واچ ڈاگ کے ذریعے عمل ختم کر دیتا ہے۔ بڑی فائلیں لوڈ کرنے، میموری میں تصاویر ذخیرہ کرنے اور URLSession کے ساتھ کام کرتے وقت لیک سے بچیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں