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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें