कैलेंडर एक्सेस अनुमति एक मोबाइल OS तंत्र है जो उपयोगकर्ता के कैलेंडर डेटा को अनधिकृत पढ़ने और संशोधन से बचाता है। iOS में, कैलेंडर एक्सेस EventKit फ्रेमवर्क के माध्यम से EKEventStore और EKCalendar क्लासेस के साथ लागू किया जाता है, जबकि Android पर — READ_CALENDAR और WRITE_CALENDAR अनुमतियों के माध्यम से CalendarContract API के साथ। Apple Developer Documentation, 2025 के अनुसार, iOS 18+ पर कैलेंडर तक पहुँचने के लिए सिस्टम डायलॉग के माध्यम से स्पष्ट अनुरोध आवश्यक है। EventKit सभी कनेक्टेड कैलेंडर पर ईवेंट पढ़ने और बनाने के लिए एक एकीकृत इंटरफ़ेस प्रदान करता है।
मुख्य बिंदु
कैलेंडर एक्सेस अनुमति एक व्यक्तिगत डेटा सुरक्षा तंत्र है जो डिवाइस के कैलेंडर ऐप्लिकेशन में ईवेंट को पढ़ने और लिखने को नियंत्रित करता है। कैलेंडर में संवेदनशील जानकारी होती है: मीटिंग्स, डेडलाइन, रिमाइंडर और व्यक्तिगत योजनाएँ — इसलिए मोबाइल OS इसे महत्वपूर्ण के रूप में वर्गीकृत करते हैं।
iOS पर, कैलेंडर एक्सेस EventKit फ्रेमवर्क द्वारा नियंत्रित किया जाता है। एक ऐप ईवेंट के लिए पढ़ने और लिखने की पहुँच का अनुरोध कर सकता है, और उपयोगकर्ता सिस्टम डायलॉग के माध्यम से अनुरोध को स्वीकार या अस्वीकार कर सकता है। Android पर, सुरक्षा दो रनटाइम अनुमतियों पर आधारित है: READ_CALENDAR और WRITE_CALENDAR।
Pew Research Center (2024) के एक अध्ययन के अनुसार, लगभग 45% मोबाइल डिवाइस उपयोगकर्ता नियमित रूप से कैलेंडर का उपयोग करते हैं, और उनमें से 62% उन ऐप्स को एक्सेस देने से मना कर देते हैं जो कैलेंडर डेटा का अनुरोध करने का कारण नहीं बताते हैं।
मुख्य सिद्धांत — एक ऐप को केवल उन सुविधाओं के लिए एक्सेस का अनुरोध करना चाहिए जो सीधे कैलेंडर से संबंधित हों: रिमाइंडर बनाना, ईवेंट सिंक करना, शेड्यूल आयात करना।
iOS पर, कैलेंडर और रिमाइंडर तक पहुँच एक ही फ्रेमवर्क — EventKit के माध्यम से प्रदान की जाती है। केंद्रीय EKEventStore क्लास सभी संचालन प्रबंधित करता है: अनुमति का अनुरोध, ईवेंट पढ़ना, कैलेंडर प्रविष्टियाँ बनाना और संपादित करना। requestAccess(to:entityType:) की पहली कॉल पर, सिस्टम स्पष्टीकरण के साथ एक मूल डायलॉग प्रदर्शित करता है।
EKEventStore क्लास iOS कैलेंडर उपप्रणाली का प्रवेश बिंदु है। एक्सेस का अनुरोध करने के लिए, आपको requestAccess(to: .event) विधि को कॉल करना होगा, जिसमें एंटिटी प्रकार (ईवेंट या रिमाइंडर) पास करना होगा। अनुमति प्राप्त करने के बाद, EKEventStore iCloud, Google, Exchange और अन्य प्रदाताओं से जुड़े सभी कैलेंडर तक पहुँच प्रदान करता है।
एक महत्वपूर्ण विशेषता: EKEventStore एक भारी ऑब्जेक्ट है — इसका निर्माण समय लेता है और संसाधनों का उपभोग करता है। इसे एक बार आरंभ करने और ऐप्लिकेशन जीवनचक्र में पुनः उपयोग करने की अनुशंसा की जाती है। WWDC Session 10117 (2024) के अनुसार, Apple प्रदर्शन अनुकूलन के लिए EventStore इंस्टेंस को कैश करने की अनुशंसा करता है।
iOS कैलेंडर की पढ़ने और लिखने की अनुमतियों को अलग नहीं करता है — उपयोगकर्ता या तो पूर्ण एक्सेस प्रदान करता है या अस्वीकार करता है। हालाँकि, ऐप कोड स्तर पर संचालन को नियंत्रित कर सकता है: EKEventStore.event के माध्यम से ईवेंट पढ़ना, EKEventStore.save के माध्यम से बनाना और EKEventStore.remove के माध्यम से हटाना। iOS 18 से, केवल एक विशिष्ट एंटिटी प्रकार — .event या .reminder — तक पहुँच का अनुरोध करना संभव है।
iOS 17+ में, Apple ने अस्थायी एक्सेस तंत्र पेश किया: कुछ ऐप उपयोगकर्ता की एक बार की पुष्टि के बाद 24 घंटे के लिए एक्सेस प्राप्त कर सकते हैं। यह सुविधा उन ऐप्स के लिए विशेष रूप से उपयोगी है जिन्हें एक बार के आधार पर कैलेंडर एक्सेस की आवश्यकता होती है — उदाहरण के लिए, कॉन्फ़्रेंस शेड्यूल आयात करने के लिए।
Android पर, कैलेंडर एक्सेस दो अलग-अलग अनुमतियों द्वारा संरक्षित है: READ_CALENDAR और WRITE_CALENDAR। दोनों खतरनाक श्रेणी से संबंधित हैं और रनटाइम अनुरोध की आवश्यकता होती है। पढ़ने और लिखने का पृथक्करण उपयोगकर्ता को ऐप के एक्सेस स्तर को बारीकी से समायोजित करने की अनुमति देता है।
READ_CALENDAR अनुमति ऐप को उपयोगकर्ता के सभी कैलेंडर से ईवेंट पढ़ने की अनुमति देती है, जिसमें नाम, समय, प्रतिभागी और विवरण शामिल हैं। WRITE_CALENDAR अनुमति ईवेंट बनाने, संशोधित करने और हटाने की अनुमति देती है। दोनों को मेनिफ़ेस्ट में uses-permission टैग के माध्यम से निर्दिष्ट किया जाता है और ActivityResultLauncher के माध्यम से रनटाइम पर अनुरोध किया जाता है।
Android 14 (API 34) से शुरू होकर, सिस्टम उपयोगकर्ता को चेतावनी देता है यदि कोई ऐप एक साथ दोनों अनुमतियों का अनुरोध करता है। उन्हें अलग-अलग अनुरोध करने की अनुशंसा की जाती है: पहले पढ़ने के लिए READ_CALENDAR, फिर ईवेंट बनाने के पहले प्रयास पर WRITE_CALENDAR। Google I/O 2024 के अनुसार, यह दृष्टिकोण अस्वीकृति दर को 23% तक कम करता है।
CalendarContract एक Android ContentProvider है जो कैलेंडर डेटा को संबंधपरक तालिकाओं में संरचित करता है। मुख्य तालिकाओं में शामिल हैं: Calendars (कैलेंडर की सूची), Events (ईवेंट), Attendees (प्रतिभागी), Reminders (सूचनाएँ)। डेटा तक पहुँच निर्दिष्ट URI और प्रोजेक्शन के साथ ContentResolver.query() के माध्यम से की जाती है।
एक नया ईवेंट सम्मिलित करने के लिए, आपको ContentValues का उपयोग करना होगा जिसमें कैलेंडर, प्रारंभ और समाप्ति समय, शीर्षक और विवरण निर्दिष्ट हो। CalendarContract समय क्षेत्र, आवर्ती ईवेंट और अनुकूलन योग्य सूचना अंतराल वाले रिमाइंडर का समर्थन करता है।
कैलेंडर एक्सेस अनुरोधों को लागू करने के लिए प्लेटफ़ॉर्म-विशिष्ट सुविधाओं पर विचार करने की आवश्यकता होती है। नीचे Swift और Kotlin में उदाहरण दिए गए हैं जो EventKit और CalendarContract के साथ सही काम को प्रदर्शित करते हैं।
iOS कैलेंडर एक्सेस का अनुरोध EKEventStore क्लास की requestAccess विधि के माध्यम से किया जाता है। नीचे दिया गया उदाहरण अनुमति प्राप्त करने के बाद ईवेंट बनाना दिखाता है।
import EventKit
let eventStore = EKEventStore()
eventStore.requestAccess(to: .event) { granted, error in
guard granted else {
print("कैलेंडर एक्सेस अस्वीकृत")
return
}
let event = EKEvent(eventStore: eventStore)
event.title = "टीम मीटिंग"
event.startDate = Date()
event.endDate = Date(timeIntervalSinceNow: 3600)
event.calendar = eventStore.defaultCalendarForNewEvents
do {
try eventStore.save(event, span: .thisEvent)
print("ईवेंट बनाया गया: \(event.eventIdentifier)")
} catch {
print("सहेजने में त्रुटि: \(error.localizedDescription)")
}
}
Android पर, READ_CALENDAR और WRITE_CALENDAR अनुमतियों का अनुरोध ActivityResultLauncher के माध्यम से किया जाता है। उदाहरण एक्सेस प्राप्त करने के बाद उपयोगकर्ता के कैलेंडर से ईवेंट पढ़ना दिखाता है।
val calendarPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
if (permissions[Manifest.permission.READ_CALENDAR] == true) {
val uri = CalendarContract.Events.CONTENT_URI
val projection = arrayOf(
CalendarContract.Events.TITLE,
CalendarContract.Events.DTSTART,
CalendarContract.Events.DTEND
)
val cursor = contentResolver.query(uri, projection, null, null, null)
cursor?.use {
val titleIndex = it.getColumnIndex(CalendarContract.Events.TITLE)
while (it.moveToNext()) {
Log.d("कैलेंडर", "ईवेंट: ${it.getString(titleIndex)}")
}
}
} else {
// स्पष्टीकरण दिखाएँ और सेटिंग्स पर जाने का सुझाव दें
requestPermissionSettingsRedirect()
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
calendarPermissionLauncher.launch(
arrayOf(Manifest.permission.READ_CALENDAR, Manifest.permission.WRITE_CALENDAR)
)
}
कैलेंडर अनुमतियों के साथ काम करने के लिए एक सुविचारित रणनीति की आवश्यकता होती है जो दोनों प्लेटफ़ॉर्म की आवश्यकताओं और उपयोगकर्ता की अपेक्षाओं पर विचार करती है। नीचे दी गई अनुशंसाओं का पालन करने से मॉडरेशन पास करने और अनुमति प्रदान दर बढ़ाने में मदद मिलती है।
कैलेंडर एक्सेस का अनुरोध केवल तभी करें जब उपयोगकर्ता कोई ऐसी कार्रवाई करे जिसके लिए कैलेंडर डेटा की आवश्यकता हो: “कैलेंडर में जोड़ें”, “शेड्यूल सिंक करें”, “ईवेंट आयात करें”। पूर्व-अनुमति डायलॉग (सिस्टम डायलॉग से पहले एक कस्टम डायलॉग) सहमति दर को 35% तक बढ़ाता है, Localytics (2024) के अनुसार।
iOS पर, गोपनीयता मेनिफ़ेस्ट में विशिष्ट टेक्स्ट के साथ NSCalendarsUsageDescription कुंजी का उपयोग करें। “ईवेंट बनाने के लिए” के बजाय, “आपके कैलेंडर में वर्कआउट जोड़ने के लिए” लिखें। विशिष्ट शब्दांकन अनुरोध रूपांतरण दर को 20–30% तक बढ़ाता है।
यदि उपयोगकर्ता अनुरोध अस्वीकार करता है, तो सिस्टम डायलॉग दोबारा न दिखाएँ — यह Android पर neverAskAgain को ट्रिगर करेगा या iOS पर डायलॉग को अनुपलब्ध बना देगा। इसके बजाय, Android पर Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) या iOS पर UIApplication.openSettingsURLString के माध्यम से सेटिंग्स पर जाने का सुझाव दें।
स्क्रीन पर पुनः प्रवेश करते समय, अनुमति की स्थिति जाँचें। iOS पर, EKEventStore.authorizationStatus(for: .event) कॉल करें और वर्तमान स्थिति के अनुसार UI अपडेट करें। Android पर, वर्तमान स्थिति जाँचने और सेटिंग्स रीडायरेक्ट बटन दिखाने का निर्णय लेने के लिए ContextCompat.checkSelfPermission() का उपयोग करें।
अक्सर पूछे जाने वाले प्रश्न
ऐप ईवेंट बनाने, शेड्यूल सिंक करने, डेडलाइन आयात करने और रिमाइंडर के साथ एकीकृत करने के लिए कैलेंडर एक्सेस का अनुरोध करते हैं। उदाहरण: फ़िटनेस ट्रैकर वर्कआउट जोड़ते हैं, शेड्यूलर कार्य बनाते हैं, और यात्रा ऐप उपयोगकर्ता के कैलेंडर में फ़्लाइट आयात करते हैं।
READ_CALENDAR उपयोगकर्ता के सभी ईवेंट और कैलेंडर को पढ़ने की पहुँच प्रदान करता है। WRITE_CALENDAR ईवेंट बनाने, संशोधित करने और हटाने की अनुमति देता है। उपयोगकर्ता एक अनुमति बिना दूसरे के प्रदान कर सकता है, जो कैलेंडर डेटा तक ऐप की पहुँच के स्तर पर लचीला नियंत्रण प्रदान करता है।
सेटिंग्स खोलें — गोपनीयता और सुरक्षा — कैलेंडर। ऐप चुनें और एक्सेस टॉगल बंद करें। ऐप अगले स्पष्ट अनुरोध और उपयोगकर्ता पुष्टि तक ईवेंट पढ़ने और बनाने की क्षमता खो देगा।
ऐप ईवेंट पढ़ या बना नहीं पाएगा। requestAccess विधि iOS पर granted = false लौटाएगी, या checkSelfPermission Android पर PERMISSION_DENIED लौटाएगी। डेवलपर्स को सुंदर गिरावट लागू करनी चाहिए — ऐप बिना क्रैश या त्रुटि दिखाए कैलेंडर सुविधाओं के बिना काम करना जारी रखता है।
iOS पर, यह संभव नहीं है — EventKit को ईवेंट के साथ किसी भी संचालन के लिए पूर्ण एक्सेस की आवश्यकता होती है। Android पर, आप सिस्टम कैलेंडर ऐप के माध्यम से ईवेंट बनाने के लिए Intent.ACTION_INSERT का उपयोग कर सकते हैं, जिसके लिए रनटाइम अनुमतियों की आवश्यकता नहीं होती है, लेकिन मौजूदा ईवेंट पढ़ने की भी अनुमति नहीं देता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें