Info.plist Usage Description iOS ऐप के Info.plist फ़ाइल में अनिवार्य कुंजियाँ हैं जिनमें सिस्टम सुविधाओं: कैमरा, माइक्रोफ़ोन, जियोलोकेशन, फ़ोटो एल्बम और अन्य तक पहुँच का अनुरोध करते समय उपयोगकर्ता को दिखाया जाने वाला टेक्स्ट होता है। प्रत्येक ऐसी कुंजी में NS*UsageDescription उपसर्ग होता है और पहुँच अनुरोध का कारण बताने वाली एक स्ट्रिंग प्रदान करती है। Apple Information Property List Guide के अनुसार, अनुरोधित संसाधन के लिए कुंजी की अनुपस्थिति ऐप को तुरंत क्रैश कर देती है।
मुख्य बातें
Info.plist Usage Description NS*UsageDescription उपसर्ग वाली कुंजियों के स्ट्रिंग मान हैं जो iOS के संरक्षित संसाधनों तक पहुँच का अनुरोध करते समय सिस्टम डायलॉग का टेक्स्ट परिभाषित करते हैं। जब कोई ऐप पहली बार किसी API को कॉल करता है जिसके लिए उपयोगकर्ता की अनुमति आवश्यक होती है (उदाहरण के लिए, कैमरे के लिए AVCaptureDevice), iOS इस टेक्स्ट और अनुमति/अस्वीकार बटन के साथ एक डायलॉग दिखाता है।
विवरण टेक्स्ट एकमात्र ऐसी चीज़ है जिसे डेवलपर सिस्टम डायलॉग में नियंत्रित कर सकता है। डायलॉग का शीर्षक “<ऐप नाम> [संसाधन] तक पहुँच चाहता है” iOS द्वारा अनुरोधित संसाधन प्रकार के आधार पर स्वचालित रूप से उत्पन्न होता है। डेवलपर शीर्षक, बटन या स्वरूप नहीं बदल सकता — केवल व्याख्यात्मक टेक्स्ट।
Usage Description iOS में रनटाइम अनुमतियों मॉडल से निकटता से जुड़ा है। उपयोगकर्ता एक अनुरोध के लिए अनुमति देता है, जिसे बाद में सेटिंग्स के माध्यम से रद्द किया जा सकता है। बाद के अनुरोध पर, डायलॉग फिर से नहीं दिखाया जाता — ऐप को अनुमति की स्थिति जाँचनी चाहिए और तदनुसार प्रतिक्रिया देनी चाहिए।
Apple दृढ़ता से अनुशंसा करता है कि विवरण में पहुँच अनुरोध का एक विशिष्ट कारण निर्दिष्ट किया जाए। उदाहरण के लिए, “प्रोफ़ाइल फ़ोटो लेने के लिए” “कैमरे तक पहुँचने के लिए” से बेहतर है। विशिष्ट टेक्स्ट उपयोगकर्ता का विश्वास और अनुदान दर बढ़ाते हैं। Localytics (2023) के अनुसार, कस्टम विवरण सामान्य शब्दों की तुलना में सहमति 15-25% बढ़ाते हैं।
NS*UsageDescription को ATT (App Tracking Transparency) के साथ भ्रमित न करें। Usage Description सिस्टम संसाधनों (कैमरा, जियोलोकेशन, फ़ोटो) तक पहुँच का अनुरोध है, जबकि ATT ट्रैकिंग (IDFA तक पहुँच) का अनुरोध है। ATT एक अलग फ्रेमवर्क AppTrackingTransparency और NSUserTrackingUsageDescription कुंजी का उपयोग करता है, जो NS*UsageDescription का हिस्सा नहीं है।
दोनों में समानता यह है कि दोनों सिस्टम डायलॉग का उपयोग करते हैं जिसमें टेक्स्ट होता है जिसे ऐप संशोधित नहीं कर सकता। अंतर यह है कि Usage Description संसाधन स्तर पर काम करता है, जबकि ATT डिवाइस पहचानकर्ता स्तर पर काम करता है। NS*UsageDescription कुंजियाँ iOS 6 में शुरू की गईं, ATT — iOS 14.5 में।
प्रत्येक iOS रिलीज़ के साथ, Apple ने नए संरक्षित संसाधन और संबंधित कुंजियाँ जोड़ीं। iOS 6: संपर्क, कैलेंडर, रिमाइंडर, फ़ोटो। iOS 7: माइक्रोफ़ोन। iOS 8: HomeKit, स्वास्थ्य। iOS 10: मीडिया लाइब्रेरी, Siri। iOS 11: NFC। iOS 14: ट्रैकिंग (ATT)। iOS 17: क्लिपबोर्ड एक्सेस (अतिरिक्त पुष्टि आवश्यक)।
महत्वपूर्ण: यदि ऐप किसी विशिष्ट iOS संस्करण में शुरू की गई API का उपयोग करता है लेकिन न्यूनतम समर्थित संस्करण कम है, तो कुंजी अभी भी अनिवार्य है। iOS पहले API कॉल से पहले कुंजी की उपस्थिति की जाँच करता है, भले ही ऐप किस संस्करण पर चल रहा हो।
कुंजियों की पूरी सूची इस बात पर निर्भर करती है कि ऐप किन सुविधाओं का उपयोग करता है। आइए मोबाइल ऐप्स में सबसे अधिक आवश्यक 14 मुख्य कुंजियों की समीक्षा करें।
NSCameraUsageDescription कुंजी AVCaptureDevice या .camera स्रोत के साथ UIImagePickerController के माध्यम से कैमरे तक पहुँचने पर अनिवार्य है। NSMicrophoneUsageDescription कुंजी AVAudioRecorder के माध्यम से ऑडियो रिकॉर्ड करने या ध्वनि के साथ वीडियो शूट करने पर आवश्यक है। यदि ऐप वीडियो रिकॉर्ड करता है तो अक्सर दोनों कुंजियाँ एक साथ आवश्यक होती हैं।
NSPhotoLibraryUsageDescription कुंजी PHPicker या UIImagePickerController के माध्यम से उपयोगकर्ता की मीडिया लाइब्रेरी से फ़ोटो और वीडियो पढ़ने पर उपयोग की जाती है। NSPhotoLibraryAddUsageDescription कुंजी का उपयोग तब किया जाता है जब ऐप केवल फ़ोटो सहेजता है लेकिन उन्हें पढ़ता नहीं है। पहली पढ़ने की अनुमति माँगती है, दूसरी — केवल लिखने की।
NSLocationWhenInUseUsageDescription कुंजी ऐप के सक्रिय होने पर (स्क्रीन पर) जियोलोकेशन एक्सेस प्रदान करती है। NSLocationAlwaysAndWhenInUseUsageDescription हमेशा एक्सेस प्रदान करती है (बैकग्राउंड मोड सहित)। यदि हमेशा एक्सेस आवश्यक है तो iOS को दोनों कुंजियों की आवश्यकता होती है: पहले WhenInUse, फिर Always।
NSLocationTemporaryUsageDescription और NSLocationPreciseUsageDescription कुंजियाँ अस्थायी पहुँच या सटीक जियोलोकेशन का अनुरोध करने के लिए अतिरिक्त कुंजियाँ हैं। सटीक स्थान के लिए अलग अनुमति आवश्यक है, और उपयोगकर्ता केवल अनुमानित स्थान सक्षम कर सकता है।
| कुंजी | संसाधन | iOS से उपलब्ध |
|---|---|---|
| NSCameraUsageDescription | कैमरा | 6.0 |
| NSMicrophoneUsageDescription | माइक्रोफ़ोन | 7.0 |
| NSPhotoLibraryUsageDescription | मीडिया लाइब्रेरी (पढ़ना) | 6.0 |
| NSPhotoLibraryAddUsageDescription | मीडिया लाइब्रेरी (लिखना) | 11.0 |
| NFCReaderUsageDescription | NFC | 11.0 |
NSContactsUsageDescription कुंजी CNContactStore के माध्यम से उपयोगकर्ता के संपर्कों तक पहुँच प्रदान करती है। NSCalendarsUsageDescription ईवेंट पढ़ने और बनाने के लिए कैलेंडर एक्सेस प्रदान करती है। NSRemindersUsageDescription रिमाइंडर तक पहुँच प्रदान करती है। NSBluetoothAlwaysUsageDescription बैकग्राउंड में Bluetooth एक्सेस प्रदान करती है (उदाहरण के लिए, BLE डिवाइस के लिए)।
NSHealthShareUsageDescription कुंजी HealthKit डेटा पढ़ने का एक्सेस प्रदान करती है। NSHealthUpdateUsageDescription HealthKit में डेटा लिखने का एक्सेस प्रदान करती है। यदि ऐप स्वास्थ्य डेटा के साथ काम करता है तो दोनों आवश्यक हैं। Apple HealthKit का उपयोग करने वाले ऐप्स की सावधानीपूर्वक समीक्षा करता है और यदि उपयोग विवरण कार्यक्षमता से मेल नहीं खाता है तो ऐप को अस्वीकार कर सकता है।
Usage Description में टेक्स्ट विशिष्ट, सत्य और संक्षिप्त होना चाहिए। Apple शब्दों पर सिफारिशें प्रदान करता है, और समीक्षक जाँचते हैं कि वे कार्यक्षमता से मेल खाते हैं।
एक अच्छे विवरण में तीन भाग होते हैं: ऐप संसाधन के साथ वास्तव में क्या करता है, उपयोगकर्ता को इसकी आवश्यकता क्यों है, और पहुँच प्रदान करने से उपयोगकर्ता को क्या लाभ मिलता है। उदाहरण: “प्रोफ़ाइल फ़ोटो लेने और उन्हें आपकी प्रोफ़ाइल पर अपलोड करने के लिए।” सामान्य वाक्यांशों से बचें: “ऐप प्रदर्शन सुधारने के लिए” यह नहीं बताता कि कैमरे की आवश्यकता क्यों है।
Apple भ्रामक विवरणों को प्रतिबंधित करता है। यदि यह “फ़ोटो लेने के लिए” लिखा है लेकिन ऐप वीडियो भी रिकॉर्ड करता है, तो इसे भ्रामक माना जा सकता है। समीक्षक ऐप को अस्वीकार कर सकता है या स्पष्टीकरण का अनुरोध कर सकता है। iOS 17 में, Apple ने स्वचालित सत्यापन जोड़ा: विवरण में अनुरोधित संसाधन से संबंधित कीवर्ड होने चाहिए।
स्थानीयकरण: विवरण का ऐप द्वारा समर्थित सभी भाषाओं में अनुवाद होना चाहिए। यदि ऐप 10 भाषाओं में उपलब्ध है, तो प्रत्येक Usage Description कुंजी के Localizable.strings या InfoPlist.strings फ़ाइलों में अनुवाद होने चाहिए। Apple Info.plist कुंजियों के स्थानीयकरण के लिए InfoPlist.strings का उपयोग करने की अनुशंसा करता है।
Usage Description को स्थानीयकृत करने के लिए, आपको प्रत्येक भाषा के लिए Info.plist को डुप्लिकेट करने की आवश्यकता नहीं है। प्रत्येक भाषा निर्देशिका में InfoPlist.strings फ़ाइल बनाएँ और कुंजी मान निर्दिष्ट करें। iOS डायलॉग दिखाते समय स्वचालित रूप से सही भाषा का उपयोग करेगा। Xcode संस्करण 14 से Info.plist के लिए बेस स्थानीयकरण का समर्थन करता है।
<!-- InfoPlist.strings (Russian) -->
"NSCameraUsageDescription" =
"QR कोड स्कैन करने के लिए";
"NSPhotoLibraryUsageDescription" =
"प्रोफ़ाइल में इमेज अपलोड करने के लिए";
"NSLocationWhenInUseUsageDescription" =
"मानचित्र पर निकटतम स्टोर दिखाने के लिए";
Usage Description के सही कार्यान्वयन में Info.plist में कुंजियाँ जोड़ना, कोड में अनुमति की स्थिति जाँचना और अस्वीकार को संभालना शामिल है।
Xcode में, Info.plist खोलें, एक पंक्ति पर होवर करें और “+” पर क्लिक करें। कुंजी का नाम दर्ज करें (उदाहरण के लिए, NSCameraUsageDescription) और विवरण स्ट्रिंग निर्दिष्ट करें। Xcode कुंजी नामों को ऑटो-कम्पलीट करता है, जिससे टाइपो का जोखिम कम होता है। जोड़ने के बाद, प्रोजेक्ट को पुनर्निर्माण करें और सत्यापित करें कि कुंजी अंतिम बाइनरी में दिखाई देती है।
महत्वपूर्ण: कुंजियाँ केस-सेंसिटिव हैं। NSCameraUsageDescription सही है, NSCamerausagedescription गलती है। गलत कुंजी को अनदेखा किया जाता है, और API कॉल करने पर ऐप क्रैश हो जाएगा। Apple दस्तावेज़ीकरण से कॉपी करें या टाइपो से बचने के लिए Xcode ऑटो-कम्पलीट का उपयोग करें।
import AVFoundation
import Photos
final class PermissionManager {
static func checkCameraPermission() {
let status = AVCaptureDevice.authorizationStatus(for: .video)
switch status {
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { granted in
print("Camera access: \(granted)")
}
case .denied:
print("Camera access denied")
case .authorized:
print("Camera access authorized")
@unknown default:
break
}
}
static func requestPhotoLibraryAccess() {
PHPhotoLibrary.requestAuthorization { status in
print("Photo library status: \(status.rawValue)")
}
}
}
यदि उपयोगकर्ता पहुँच अस्वीकार करता है, तो ऐप को सिस्टम डायलॉग फिर से कॉल नहीं करना चाहिए — यह संभव नहीं है। इसके बजाय, यह समझाने वाली एक सूचना स्क्रीन दिखाएँ कि सेटिंग्स के माध्यम से एक्सेस कैसे सक्षम करें, “सेटिंग्स खोलें” बटन (UIApplicationOpenSettingsURLString) के साथ। यह अभ्यास उपयोगकर्ता अनुभव और उपयोगकर्ता द्वारा एक्सेस सक्षम करने की संभावना में सुधार करता है।
अस्वीकार के तुरंत बाद एक्सेस सक्षम करने के लिए कहने वाला अलर्ट न दिखाएँ — उपयोगकर्ता को यह समझने का समय दें कि उन्हें इस सुविधा की आवश्यकता क्यों हो सकती है। इस कार्यक्षमता का उपयोग करने का प्रयास करते समय स्पष्टीकरण दिखाना बेहतर है जिसके लिए इस अनुमति की आवश्यकता है। UX Movement (2023) अस्वीकार के 2-3 सत्रों के बाद स्पष्टीकरण स्क्रीन दिखाने की अनुशंसा करता है।
func showSettingsAlert(for feature: String) {
let alert = UIAlertController(
title: "तक पहुंच \(feature)",
message: "Allow access in Settings, "
+ "to use this feature",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(
title: "Open Settings",
style: .default
) { _ in
if let url = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(url)
}
})
alert.addAction(UIAlertAction(
title: "Not now", style: .cancel
))
UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true)
}
अनिवार्य Usage Description कुंजी की अनुपस्थिति संबंधित API की पहली कॉल पर ऐप को तुरंत क्रैश कर देती है। यह Xcode की चेतावनी नहीं है, बल्कि NSInvalidArgumentException और कंसोल में संदेश के साथ एक रनटाइम क्रैश है: “यह ऐप क्रैश हो गया क्योंकि इसने उपयोग विवरण के बिना गोपनीयता-संवेदनशील डेटा तक पहुँचने का प्रयास किया।”
iOS एक संरक्षित संसाधन के लिए पहली API कॉल पर Info.plist में NS*UsageDescription कुंजी की जाँच करता है। यदि कुंजी गायब है, तो OS SIGABRT सिग्नल के साथ ऐप को तुरंत समाप्त कर देता है। यह डिबग डिवाइस पर भी होता है — Xcode लॉग में अपवाद दिखाता है, लेकिन डिबगर इसे ब्रेकपॉइंट के रूप में नहीं पकड़ता।
क्रैश वास्तविक डिवाइस और सिम्युलेटर पर होता है। इसे टालने का एकमात्र तरीका API कॉल करने से पहले कुंजी जोड़ना है। Xcode का स्थैतिक विश्लेषक हमेशा गायब कुंजी के बारे में चेतावनी नहीं देता, खासकर यदि API तीसरे पक्ष के SDK के माध्यम से कॉल की जाती है। TestFlight परीक्षक भी क्रैश देखेंगे, जिससे नकारात्मक समीक्षाएँ हो सकती हैं।
iOS 17+ के साथ विशेष स्थिति: Apple ने क्लिपबोर्ड एक्सेस (UIPasteboard) के लिए अतिरिक्त जाँच शुरू की। यदि ऐप उपयोगकर्ता की स्पष्ट कार्रवाई के बिना क्लिपबोर्ड पढ़ता है, तो iOS एक चेतावनी बैनर दिखाता है, भले ही Usage Description कुंजी मौजूद हो। क्लिपबोर्ड के लिए अलग कुंजी की आवश्यकता नहीं है, लेकिन Apple स्वचालित पढ़ने को कम करने की अनुशंसा करता है।
रनटाइम क्रैश के अलावा, कुंजी की अनुपस्थिति समीक्षा के दौरान ऐप अस्वीकार का कारण बन सकती है। Apple समीक्षा चरण में Info.plist की जाँच करता है और यदि संबंधित कुंजियों के बिना API कॉल का पता लगाता है तो बिल्ड को अस्वीकार कर सकता है। Xcode आर्काइविंग को ब्लॉक नहीं करता, लेकिन App Store Connect बाइनरी प्रोसेस करते समय त्रुटि लौटा सकता है।
यदि ऐप संसाधन का सीधे उपयोग नहीं करता लेकिन कोई तीसरे पक्ष का SDK करता है (उदाहरण के लिए, एक एनालिटिक्स SDK IDFA का अनुरोध करता है), तो डेवलपर को अभी भी संबंधित कुंजी जोड़नी होगी। Apple बाइनरी में सभी API कॉल की जाँच करता है, जिसमें स्थैतिक और गतिशील लाइब्रेरी का कोड शामिल है। त्रुटि “Info.plist कुंजी गायब” अपडेट अस्वीकार के सबसे सामान्य कारणों में से एक है।
अक्सर पूछे जाने वाले प्रश्न
हाँ, यदि कोई तीसरे पक्ष का SDK संसाधन एक्सेस API (कैमरा, जियोलोकेशन, फ़ोटो) को कॉल करता है, तो कुंजी अनिवार्य है। iOS पूरे बाइनरी की जाँच करता है, जिसमें निर्भरताएँ शामिल हैं, और यदि कुंजी गायब है तो ऐप क्रैश हो जाता है।
नहीं, प्रत्येक संरक्षित संसाधन के लिए अलग कुंजी आवश्यक है। उदाहरण के लिए, NSCameraUsageDescription NSMicrophoneUsageDescription को प्रतिस्थापित नहीं करता है। सिस्टम प्रत्येक API को कॉल करते समय नाम से विशिष्ट कुंजी खोजता है।
एक स्क्रीन दिखाएँ जो बताती है कि सेटिंग्स → ऐप के माध्यम से एक्सेस कैसे सक्षम करें, और ऐप सेटिंग्स खोलने के लिए एक बटन प्रदान करें। सिस्टम डायलॉग को प्रोग्रामेटिक रूप से फिर से ट्रिगर नहीं किया जा सकता।
प्रत्येक भाषा के लिए InfoPlist.strings फ़ाइल बनाएँ और अनुवाद निर्दिष्ट करें। iOS डायलॉग दिखाते समय स्वचालित रूप से डिवाइस की भाषा का उपयोग करता है। Xcode Info.plist के लिए बेस स्थानीयकरण का भी समर्थन करता है।
iOS सिम्युलेटर Usage Description जाँच सहित डिवाइस के व्यवहार को पूरी तरह से दोहराता है। यदि कुंजी गायब है, तो सिम्युलेटर भी अपवाद के साथ ऐप को समाप्त कर देगा। यह अपेक्षित डिबगिंग व्यवहार है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें