संपर्क एक्सेस अनुमति मोबाइल ऑपरेटिंग सिस्टम का एक तंत्र है जो डिवाइस की फ़ोनबुक पढ़ने से पहले उपयोगकर्ता की स्पष्ट सहमति की आवश्यकता रखता है। iOS में, संपर्कों तक पहुँच CNContactStore के माध्यम से की जाती है, जबकि Android में Contacts API और रनटाइम अनुमति प्रणाली के माध्यम से। Apple Developer Documentation, 2025 के अनुसार, iOS 18 से सभी ऐप्स को एकीकृत Contacts Access API का उपयोग करना होगा। अनुमति अनुरोध का सही कार्यान्वयन ऐप स्टोर मॉडरेशन द्वारा अनुमोदन की संभावना बढ़ाता है।
मुख्य बिंदु
संपर्क एक्सेस अनुमति एक ऑपरेटिंग सिस्टम तंत्र है जो उपयोगकर्ता की फ़ोनबुक को तीसरे पक्ष के ऐप्स द्वारा अनधिकृत पढ़ने से बचाता है। मोबाइल OS में, संपर्कों को संवेदनशील डेटा माना जाता है क्योंकि इनमें उपयोगकर्ता के परिवेश के लोगों के नाम, फ़ोन नंबर, ईमेल पते और तस्वीरें होती हैं।
iOS पर, अनुमति Contacts फ्रेमवर्क और CNContactStore वर्ग द्वारा नियंत्रित होती है। उपयोगकर्ता पहले एक्सेस अनुरोध पर एक सिस्टम डायलॉग देखता है, जहाँ वह एक्सेस प्रदान या अस्वीकार कर सकता है। Android पर, सुरक्षा रनटाइम अनुमति प्रणाली पर आधारित है: ऐप मेनिफ़ेस्ट में READ_CONTACTS घोषित करता है और इसे ActivityResultLauncher या परिणाम संभालने वाले फ़्रैगमेंट के माध्यम से रनटाइम पर अनुरोध करता है।
Statista (2025) के अनुसार, 68% से अधिक iOS उपयोगकर्ता और 54% Android उपयोगकर्ता पहले अनुरोध पर संपर्क एक्सेस से इनकार करते हैं। इसका मतलब है कि डेवलपर को न केवल अनुरोध को सही ढंग से लागू करना होगा, बल्कि उपयोगकर्ता को एक्सेस की आवश्यकता का कारण भी समझाना होगा।
उद्योग मानक — पहले लॉन्च पर नहीं, बल्कि केवल तब अनुरोध करें जब कार्यक्षमता वास्तव में आवश्यक हो। यह दृष्टिकोण अस्वीकृति दर को कम करता है और उपयोगकर्ता अनुभव में सुधार करता है।
Apple पारिस्थितिकी तंत्र में, संपर्कों तक पहुँच Contacts फ्रेमवर्क द्वारा नियंत्रित होती है, जो iOS 9 में पेश किया गया था। CNContactStore वर्ग अनुमति अनुरोध करने और पढ़ने-लिखने के संचालन करने के तरीके प्रदान करता है। requestAccess(for:) के पहले कॉल पर, सिस्टम एक्सेस के कारण की व्याख्या करते हुए एक मूल डायलॉग प्रदर्शित करता है।
iOS 17 से शुरू करके, Apple ने एकल संपर्क एक्सेस मोड पेश किया। उपयोगकर्ता फ़ोनबुक से एक संपर्क चुन सकता है और पूरे डेटाबेस को प्रकट किए बिना इसे ऐप के साथ साझा कर सकता है। यह मोड CNContactPickerViewController के माध्यम से कार्यान्वित किया गया है और इसमें requestAccess(for:) कॉल करने की आवश्यकता नहीं है।
डेवलपर के लिए यह समझना महत्वपूर्ण है: यदि कोई ऐप पूर्ण एक्सेस का अनुरोध करता है लेकिन कार्यात्मक रूप से केवल एक संपर्क की आवश्यकता है, तो App Store मॉडरेटर बिल्ड को अस्वीकार कर सकते हैं। Apple App Review Guidelines (2025) के अनुसार, धारा 5.1.1 स्पष्ट रूप से न्यूनतम आवश्यक डेटा की माँग करती है।
iOS 18 की रिलीज़ के साथ, Apple ने Privacy Manifest के लिए आवश्यकताओं को कड़ा कर दिया — privacy.xcprivacy फ़ाइल जहाँ डेवलपर संरक्षित डेटा तक पहुँचने का कारण घोषित करता है। संपर्कों के लिए, NSContactsUsageDescription कुंजी का उपयोग स्थानीयकृत पाठ के साथ किया जाता है जो सिस्टम डायलॉग में प्रदर्शित होता है।
सही privacy manifest के बिना, ऐप App Store Connect मॉडरेशन पास नहीं कर सकता। विवरण पाठ विशिष्ट होना चाहिए: “प्रदर्शन में सुधार करने के लिए” नहीं, बल्कि “फ़ोन नंबर से मित्र खोजने के लिए”।
Android पर, संपर्कों तक पहुँच READ_CONTACTS अनुमति द्वारा संरक्षित है, जो खतरनाक श्रेणी में आता है — इसे स्थापना के दौरान नहीं, बल्कि रनटाइम पर अनुरोध किया जाना चाहिए। रनटाइम अनुमति तंत्र Android 6.0 (API 23) में पेश किया गया था और संवेदनशील डेटा की सुरक्षा का प्राथमिक तरीका बना हुआ है।
READ_CONTACTS अनुमति मेनिफ़ेस्ट में uses-permission टैग के माध्यम से घोषित की जाती है, और कोड में ActivityResultLauncher या onRequestPermissionsResult वाले फ़्रैगमेंट के माध्यम से अनुरोध की जाती है। उपयोगकर्ता अनुरोध को अस्वीकार कर सकता है या “फिर कभी न पूछें” चुन सकता है, जिसके बाद ऐप को अस्वीकृति को सही ढंग से संभालना चाहिए।
Android 14 (API 34) से शुरू करके, रनटाइम अनुमतियों का व्यवहार बदल गया: दो लगातार अस्वीकृतियों के बाद, OS स्वचालित रूप से neverAskAgain फ़्लैग सेट करता है। Google Developer Documentation (2024) के अनुसार, डेवलपर को पुनः अनुरोध करने से पहले shouldShowRequestPermissionRationale के माध्यम से स्थिति की जाँच करनी चाहिए।
संपर्क पढ़ने के लिए, Android ContentProvider नामक ContactsContract का उपयोग करता है। यह ContentResolver के माध्यम से सुलभ एक संरचित डेटाबेस है। डेटा कई तालिकाओं में व्यवस्थित है: Contacts (संपर्क), RawContacts (विभिन्न खातों से कच्चे रिकॉर्ड), Data (विस्तृत जानकारी: फ़ोन, ईमेल, पते)।
ContactsContract से क्वेरी URI ContactsContract.Contacts.CONTENT_URI के माध्यम से की जाती है। डेवलपर को न्यूनतम कॉलम का अनुरोध करना चाहिए और फ़ील्ड को फ़िल्टर करने के लिए प्रोजेक्शन का उपयोग करना चाहिए — इससे क्वेरी निष्पादन में तेज़ी आती है और मेमोरी खपत कम होती है।
संपर्क एक्सेस अनुरोध का व्यावहारिक कार्यान्वयन iOS और Android पर भिन्न होता है। नीचे Swift और Kotlin में सभी संभावित अनुमति स्थितियों की हैंडलिंग के साथ विशिष्ट उदाहरण दिए गए हैं।
iOS में, अनुरोध CNContactStore वर्ग की requestAccess विधि के माध्यम से किया जाता है। परिणाम बूलियन मान और वैकल्पिक त्रुटि के साथ एक क्लोजर में लौटाया जाता है। नीचे दिया गया उदाहरण स्थिति हैंडलिंग के साथ पूर्ण अनुरोध चक्र प्रदर्शित करता है।
import Contacts
let store = CNContactStore()
store.requestAccess(for: .contacts) { granted, error in
if granted {
print("संपर्क एक्सेस प्रदान की गई")
// संपर्क संचालन निष्पादित करना
let keys = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey]
let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
try? store.enumerateContacts(with: request) { contact, stop in
print("\(contact.givenName) \(contact.familyName)")
}
} else {
print("एक्सेस अस्वीकृत: \(error?.localizedDescription ?? "अज्ञात त्रुटि")")
}
}
Android में, अनुरोध RequestPermission अनुबंध के साथ ActivityResultLauncher के माध्यम से किया जाता है। नीचे दिया गया उदाहरण अनुमति प्राप्त करने के बाद ContactsContract.ContentProvider के साथ काम दिखाता है।
val requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
val uri = ContactsContract.Contacts.CONTENT_URI
val cursor = contentResolver.query(uri, null, null, null, null)
cursor?.use {
val nameIndex = it.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)
while (it.moveToNext()) {
val name = it.getString(nameIndex)
Log.d("Contacts", "संपर्क: $name")
}
}
} else {
// उपयोगकर्ता को एक्सेस की आवश्यकता का कारण समझाएं
showRationaleDialog()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissionLauncher.launch(android.Manifest.permission.READ_CONTACTS)
}
अनुभवी मोबाइल ऐप डेवलपर संपर्क अनुमति के साथ काम करते समय सिद्ध प्रथाओं के एक सेट का पालन करते हैं। ये नियम ऐप स्टोर मॉडरेशन पास करने और उपयोगकर्ताओं का विश्वास बनाए रखने में मदद करते हैं। सर्वोत्तम प्रथाओं का पालन प्रकाशन और रखरखाव प्रक्रिया को काफी सरल बनाता है।
पहले ऐप लॉन्च पर कभी भी संपर्क एक्सेस का अनुरोध न करें। पहला अनुरोध किसी विशिष्ट सुविधा के संदर्भ में होना चाहिए: मित्र खोजना, प्रतिभागियों को आमंत्रित करना, संपर्क आयात करना। जो उपयोगकर्ता अनुरोध का कारण समझता है, वह Apptentive (2024) अनुसंधान के अनुसार, 2–3 गुना अधिक बार सहमत होता है।
यदि कार्यक्षमता के लिए केवल एक संपर्क तक पहुँच की आवश्यकता है, तो iOS पर CNContactPickerViewController या Android पर एक अंतर्निहित इंटेंट ACTION_PICK का उपयोग करें। इन विधियों को पूर्व अनुमति की आवश्यकता नहीं होती है और उपयोगकर्ता को ऐप को पूरी फ़ोनबुक प्रकट किए बिना स्वयं एक रिकॉर्ड चुनने देती हैं।
ऐप को उन स्थितियों को सही ढंग से संभालना चाहिए जहाँ उपयोगकर्ता एक्सेस से इनकार करता है। iOS पर, CNContactStore.authorizationStatus(for:) के माध्यम से स्थिति की जाँच करें और आवश्यकता होने पर उपयोगकर्ता को सेटिंग्स पर निर्देशित करें। Android पर, पुनः अनुरोध करने से पहले अतिरिक्त स्पष्टीकरण दिखाने के लिए shouldShowRequestPermissionRationale का उपयोग करें।
अस्वीकृति के तुरंत बाद दूसरा डायलॉग कभी न दिखाएं — इसे आक्रामक माना जाता है और ऐप की रेटिंग कम होती है। सर्वोत्तम अभ्यास: कुछ समय बाद, स्पष्टीकरण के साथ एक स्क्रीन और “सेटिंग्स पर जाएं” बटन दिखाएं जो इंटेंट के माध्यम से सिस्टम अनुमति स्क्रीन खोलता है। वास्तविक उपकरणों पर अस्वीकृति परिदृश्य का परीक्षण करें — सिम्युलेटर हमेशा सिस्टम अनुमति डायलॉग के व्यवहार को सही ढंग से पुन: उत्पन्न नहीं करते हैं।
अक्सर पूछे जाने वाले प्रश्न
ऐप्स मित्र खोजने, प्रतिभागियों को आमंत्रित करने, फ़ॉर्म ऑटो-फ़िल करने और सर्वर के साथ सिंक करने जैसी सुविधाओं के लिए संपर्क एक्सेस का अनुरोध करते हैं। उदाहरण: मैसेंजर फ़ोन नंबर से संपर्क खोजते हैं, CRM ऐप्स क्लाइंट आयात करते हैं।
एकल संपर्क एक्सेस (iOS 17+) CNContactPickerViewController के माध्यम से उपयोगकर्ता को पूरी फ़ोनबुक प्रकट किए बिना एक संपर्क चुनने देता है। पूर्ण एक्सेस ऐप को CNContactStore के माध्यम से सभी डिवाइस संपर्क पढ़ने देता है। एकल संपर्क एक्सेस अधिक सुरक्षित है और इसे privacy manifest में NSContactsUsageDescription निर्दिष्ट करने की आवश्यकता नहीं है।
iOS पर, सेटिंग्स — गोपनीयता और सुरक्षा — संपर्क पर जाएं और विशिष्ट ऐप के लिए एक्सेस बंद करें। Android पर, सेटिंग्स — ऐप्स — ऐप चुनें — अनुमतियाँ — संपर्क खोलें और “अस्वीकार करें” चुनें।
Privacy Manifest (privacy.xcprivacy फ़ाइल) iOS 18+ के लिए एक अनिवार्य दस्तावेज़ है, जिसमें डेवलपर संरक्षित डेटा तक पहुँचने के कारणों की घोषणा करता है, जिसमें संपर्क शामिल हैं। NSContactsUsageDescription कुंजी में एक स्थानीयकृत विवरण होता है जो सिस्टम अनुमति अनुरोध डायलॉग में प्रदर्शित होता है।
Android READ_CONTACTS को खतरनाक अनुमति के रूप में वर्गीकृत करता है क्योंकि यह उपयोगकर्ता के व्यक्तिगत डेटा तक पहुँच प्रदान करता है। Android 6.0 में पेश किया गया रनटाइम अनुमति तंत्र, केवल ऐप इंस्टॉलेशन के दौरान नहीं, बल्कि रनटाइम पर स्पष्ट सहमति की आवश्यकता रखता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।