Notification Service Extension एक iOS एक्सटेंशन है जो push सूचना को उपयोगकर्ता को दिखाए जाने से पहले इंटरसेप्ट करता है और सामग्री को संशोधित करने की अनुमति देता है। एक्सटेंशन एन्क्रिप्टेड डेटा को डिक्रिप्ट कर सकता है, मीडिया अटैचमेंट डाउनलोड कर सकता है, टेक्स्ट बदल सकता है या कस्टम फ़ील्ड जोड़ सकता है। Apple Developer, 2025 के अनुसार, Notification Service Extension के पास बैकग्राउंड में कार्य पूरा करने के लिए 30 सेकंड तक का समय है।
मुख्य बिंदु
Notification Service Extension iOS में एक ऐप एक्सटेंशन है जो push सूचना प्रदर्शित होने से पहले चलता है। यह सर्वर को न्यूनतम payload भेजने की अनुमति देता है जबकि एक्सटेंशन इसे सामग्री से समृद्ध करता है: इमेज डाउनलोड करना, डेटा डिक्रिप्ट करना, टेक्स्ट बदलना। उपयोगकर्ता पहले से प्रोसेस्ड सूचना देखता है।
जब iOS को push सूचना प्राप्त होती है, सिस्टम जांचता है कि ऐप के लिए कोई एक्सटेंशन मौजूद है या नहीं। यदि एक्सटेंशन पंजीकृत है, iOS इसे बैकग्राउंड प्रक्रिया में शुरू करता है और didReceive(_:withContentHandler:) मेथड के माध्यम से सूचना सामग्री प्रेषित करता है। एक्सटेंशन सामग्री प्रोसेस करता है और संशोधित सामग्री के साथ contentHandler को कॉल करता है। यदि एक्सटेंशन 30 सेकंड के भीतर पूरा नहीं होता, सिस्टम मूल सूचना प्रदर्शित करता है।
Service Extension उन परिदृश्यों में आवश्यक है जहां सूचना सामग्री को डिवाइस पर प्रोसेसिंग की आवश्यकता होती है। सुरक्षित संचार: सर्वर एन्क्रिप्टेड payload भेजता है, एक्सटेंशन इसे स्थानीय रूप से डिक्रिप्ट करता है। रिच मीडिया सूचनाएं: सर्वर इमेज 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 के प्रमुख उपयोगों में से एक डिवाइस पर सूचना सामग्री को डिक्रिप्ट करना है। सर्वर एक एन्क्रिप्टेड payload भेजता है और एक्सटेंशन इसे Keychain या App Group में संग्रहीत कुंजी का उपयोग करके डिक्रिप्ट करता है। यह सुनिश्चित करता है कि ट्रांसमिशन के दौरान सामग्री को इंटरसेप्ट नहीं किया जा सकता।
सर्वर सममित कुंजी (AES-256) का उपयोग करके सूचना बॉडी को एन्क्रिप्ट करता है। एन्क्रिप्शन कुंजी क्लाइंट और सर्वर के बीच पूर्व-सहमत होती है। एक्सटेंशन payload के data फ़ील्ड में एन्क्रिप्टेड स्ट्रिंग प्राप्त करता है, इसे डिक्रिप्ट करता है और सूचना फ़ील्ड में प्रतिस्थापित करता है। उपयोगकर्ता कुंजी प्रमाणीकरण के बाद 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 में संग्रहीत नहीं की जानी चाहिए। iOS Keychain का उपयोग App Group के माध्यम से पहुंच के साथ करें ताकि ऐप और एक्सटेंशन दोनों कुंजी पढ़ सकें। क्लाइंट पर कुंजी जनरेशन के लिए AES-256-GCM एल्गोरिदम के साथ Security.framework का उपयोग करें।
Notification Service Extension का सबसे आम उपयोग सूचना में प्रदर्शन के लिए इमेज, GIF और वीडियो डाउनलोड करना है। सर्वर मीडिया फ़ाइल URL भेजता है और एक्सटेंशन इसे डाउनलोड करता है, अस्थायी निर्देशिका में सहेजता है और UNNotificationAttachment बनाता है।
एक्सटेंशन सूचना payload फ़ील्ड से इमेज 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 टाइमआउट का उपयोग करें ताकि पूरी सीमा एक ही ऑपरेशन पर खर्च न हो।
यदि इमेज डाउनलोड विफल होता है या payload डिक्रिप्शन त्रुटि देता है, तो एक्सटेंशन को मूल सामग्री के साथ 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 कॉल करते हैं, तो सूचना प्रदर्शित नहीं होगी। इसका उपयोग स्पैम सूचनाओं या गलत डेटा को फ़िल्टर करने के लिए किया जाता है।
टोकन को सूचना payload के userInfo में पास किया जा सकता है या App Group के माध्यम से Keychain से प्राप्त किया जा सकता है। एक्सटेंशन UserDefaults में टोकन संग्रहीत करने की अनुशंसा नहीं की जाती है।
एक्सटेंशन को उसी डेवलपर प्रमाणपत्र से हस्ताक्षरित होना चाहिए जो मुख्य ऐप के लिए उपयोग होता है। प्रोडक्शन के लिए, Push Notifications क्षमता सक्षम के साथ प्रोडक्शन प्रमाणपत्र आवश्यक है।
डिवाइस को Xcode से कनेक्ट करें, रन स्कीम में एक्सटेंशन target चुनें और Firebase Console के माध्यम से push सूचना भेजें। एक्सटेंशन में ब्रेकपॉइंट मुख्य ऐप की तरह ही काम करते हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें