إذن الوصول إلى جهات الاتصال هو آلية في أنظمة التشغيل المحمولة تتطلب موافقة صريحة من المستخدم قبل قراءة دفتر عناوين الجهاز. في 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:).
من المهم أن يفهم المطور: إذا طلب التطبيق وصولاً كاملاً لكنه functionally يحتاج فقط إلى جهة اتصال واحدة، فقد يرفض مراجعو 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)، تغير سلوك الأذونات في وقت التشغيل: بعد رفضين متتاليين، يضع نظام التشغيل تلقائيًا علامة neverAskAgain. وفقًا لـ Google Developer Documentation (2024)، يجب على المطور التحقق من الحالة عبر shouldShowRequestPermissionRationale قبل إعادة الطلب.
لقراءة جهات الاتصال، يستخدم Android ContentProvider يسمى ContactsContract. وهي قاعدة بيانات منظمة يمكن الوصول إليها عبر ContentResolver. يتم تنظيم البيانات في عدة جداول: Contacts (جهات الاتصال)، RawContacts (سجلات خام من حسابات مختلفة)، Data (معلومات مفصلة: هواتف، بريد إلكتروني، عناوين).
يتم الاستعلام عن ContactsContract عبر URI ContactsContract.Contacts.CONTENT_URI. يجب على المطور طلب الحد الأدنى من الأعمدة واستخدام الإسقاط لتصفية الحقول — مما يسرع تنفيذ الاستعلام ويقلل استهلاك الذاكرة.
يختلف التنفيذ العملي لطلب الوصول إلى جهات الاتصال بين iOS وAndroid. فيما يلي أمثلة محددة بلغتي Swift وKotlin مع معالجة جميع الحالات الممكنة للإذن.
في iOS، يتم الطلب عبر طريقة requestAccess من فئة CNContactStore. يتم إرجاع النتيجة في إغلاق بقيمة منطقية وخطأ اختياري. يوضح المثال أدناه دورة الطلب الكاملة مع معالجة الحالة.
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، يتم الطلب عبر ActivityResultLauncher مع عقد RequestPermission. يوضح المثال أدناه العمل مع 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)
}
يتبع مطورو التطبيقات المحمولة ذوو الخبرة مجموعة من الممارسات المثبتة عند العمل مع إذن الوصول إلى جهات الاتصال. تساعد هذه القواعد في اجتياز مراجعة متاجر التطبيقات والحفاظ على ثقة المستخدمين. اتباع أفضل الممارسات يبسط بشكل كبير عملية النشر والصيانة.
لا تطلب أبدًا الوصول إلى جهات الاتصال عند أول تشغيل للتطبيق. يجب أن يحدث الطلب الأول في سياق وظيفة محددة: البحث عن الأصدقاء، دعوة المشاركين، استيراد جهات الاتصال. المستخدم الذي يفهم سبب الطلب يوافق 2-3 مرات أكثر، وفقًا لأبحاث Apptentive (2024).
إذا كانت الوظيفة تحتاج فقط إلى الوصول إلى جهة اتصال واحدة، استخدم CNContactPickerViewController على iOS أو intent ضمني ACTION_PICK على Android. لا تتطلب هذه الطرق إذنًا مسبقًا وتسمح للمستخدم باختيار سجل بنفسه دون الكشف عن دفتر العناوين بالكامل للتطبيق.
يجب على التطبيق معالجة المواقف التي يرفض فيها المستخدم الوصول بشكل صحيح. على iOS، تحقق من الحالة عبر CNContactStore.authorizationStatus(for:) ووجه المستخدم إلى الإعدادات إذا لزم الأمر. على Android، استخدم shouldShowRequestPermissionRationale لإظهار شرح إضافي قبل إعادة الطلب.
لا تظهر حوارًا ثانيًا فورًا بعد الرفض — يُنظر إلى هذا على أنه عدواني ويقلل من تقييم التطبيق. أفضل ممارسة: بعد مرور بعض الوقت، اعرض شاشة مع شرح وزر «الانتقال إلى الإعدادات» الذي يفتح شاشة الأذونات في النظام عبر Intent. اختبر سيناريو الرفض على أجهزة حقيقية — لا تعيد أجهزة المحاكاة إنتاج سلوك حوارات أذونات النظام بشكل صحيح دائمًا.
الأسئلة الشائعة
تطلب التطبيقات الوصول إلى جهات الاتصال لوظائف مثل البحث عن الأصدقاء، دعوة المشاركين، الملء التلقائي للنماذج والمزامنة مع الخادم. أمثلة: تطبيقات المراسلة تبحث عن جهات الاتصال برقم الهاتف، تطبيقات CRM تستورد العملاء.
الوصول لمرة واحدة (iOS 17+) عبر CNContactPickerViewController يسمح للمستخدم باختيار جهة اتصال واحدة دون الكشف عن دفتر العناوين بأكمله. الوصول الكامل يسمح للتطبيق بقراءة جميع جهات اتصال الجهاز عبر CNContactStore. الوصول لمرة واحدة أكثر أمانًا ولا يتطلب تحديد NSContactsUsageDescription في privacy manifest.
على iOS، انتقل إلى الإعدادات — الخصوصية والأمان — جهات الاتصال وقم بتعطيل الوصول للتطبيق المحدد. على Android، افتح الإعدادات — التطبيقات — اختر التطبيق — الأذونات — جهات الاتصال واختر «رفض».
Privacy Manifest (ملف privacy.xcprivacy) هو مستند إلزامي لنظام iOS 18+، يصرح فيه المطور بأسباب الوصول إلى البيانات المحمية، بما في ذلك جهات الاتصال. يحتوي المفتاح NSContactsUsageDescription على وصف مترجم يظهر في حوار طلب الإذن للنظام.
يصنف Android READ_CONTACTS كـ إذن خطير لأنه يمنح الوصول إلى البيانات الشخصية للمستخدم. آلية الأذونات في وقت التشغيل، التي تم تقديمها في Android 6.0، تتطلب موافقة صريحة أثناء التشغيل، وليس فقط عند تثبيت التطبيق.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا