ক্যালেন্ডার অ্যাক্সেস অনুমতি একটি মোবাইল 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন