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 सेकंड के भीतर रहने की अनुशंसा की जाती है।
हाँ, SwiftUI iOS 16 से Content Extension में समर्थित है। View को UIHostingController में लपेटा जाता है और storyboard में जोड़ा जाता है। हालाँकि, मेमोरी सीमाओं के कारण, SwiftUI का उपयोग केवल न्यूनतम तत्वों वाले सरल इंटरफ़ेस के लिए करने की अनुशंसा की जाती है।
डाउनलोड त्रुटि या समय समाप्ति की स्थिति में, बिना अटैचमेंट के मूल सामग्री के साथ completion handler को कॉल करें। सिस्टम नोटिफिकेशन प्रदर्शित करेगा बिना मीडिया के मानक रूप में। निदान के लिए OSLog के माध्यम से त्रुटियों को लॉग करें, लेकिन नोटिफिकेशन प्रदर्शन को अवरुद्ध न करें।
एक्सटेंशन लगभग 50 MB की सीमा के साथ एक अलग प्रक्रिया में काम करता है। इससे अधिक होने पर, सिस्टम वॉचडॉग के माध्यम से प्रक्रिया को समाप्त कर देता है। बड़ी फ़ाइलें लोड करने, मेमोरी में छवियाँ संग्रहीत करने और URLSession के साथ काम करते समय लीक से बचें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें