কন্টাক্ট অ্যাক্সেস অনুমতি হল মোবাইল অপারেটিং সিস্টেমের একটি প্রক্রিয়া যা ডিভাইসের ঠিকানা বই পড়ার আগে ব্যবহারকারীর স্পষ্ট সম্মতি প্রয়োজন। iOS-এ, কন্টাক্টগুলিতে অ্যাক্সেস CNContactStore-এর মাধ্যমে করা হয়, যখন Android-এ Contacts API এবং রানটাইম অনুমতি সিস্টেমের মাধ্যমে করা হয়। Apple Developer Documentation, 2025 অনুসারে, iOS 18 থেকে সমস্ত অ্যাপকে ইউনিফাইড Contacts Access API ব্যবহার করতে হবে। অনুমতি অনুরোধের সঠিক বাস্তবায়ন অ্যাপ স্টোর মডারেশনের মাধ্যমে অনুমোদনের সম্ভাবনা বাড়ায়।
মূল বিষয়
কন্টাক্ট অ্যাক্সেস অনুমতি হল একটি অপারেটিং সিস্টেম প্রক্রিয়া যা ব্যবহারকারীর ঠিকানা বইকে তৃতীয় পক্ষের অ্যাপ দ্বারা অননুমোদিত পড়া থেকে রক্ষা করে। মোবাইল অপারেটিং সিস্টেমে, কন্টাক্টগুলিকে সংবেদনশীল ডেটা হিসাবে বিবেচনা করা হয় কারণ এগুলিতে ব্যবহারকারীর পরিচিত মানুষের নাম, ফোন নম্বর, ইমেল ঠিকানা এবং ছবি থাকে।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।