إذن الوصول إلى جهات الاتصال في تطوير التطبيقات المحمولة — ما هو، كيف يعمل وطلب الوصول

المؤلف: IT Sectr نُشر: 2026-05-22 وقت القراءة: 8 دق

إذن الوصول إلى جهات الاتصال هو آلية في أنظمة التشغيل المحمولة تتطلب موافقة صريحة من المستخدم قبل قراءة دفتر عناوين الجهاز. في iOS، يتم الوصول إلى جهات الاتصال من خلال CNContactStore، بينما في Android يتم استخدام Contacts API ونظام الأذونات في وقت التشغيل. وفقًا لـ Apple Developer Documentation، 2025، اعتبارًا من iOS 18، يجب على جميع التطبيقات استخدام واجهة Contacts Access API الموحدة. التنفيذ الصحيح لطلب الإذن يزيد من فرص الموافقة من قبل مراجعة متاجر التطبيقات.

النقاط الرئيسية

  • Contacts Permission — إذن إلزامي لقراءة جهات اتصال المستخدم على iOS وAndroid.
  • CNContactStore — الفئة الرئيسية في iOS للوصول إلى دفتر العناوين عبر إطار Contacts.
  • Runtime permission — نموذج Android حيث يتم طلب إذن READ_CONTACTS أثناء التشغيل.
  • Privacy manifest — ملف إلزامي لنظام iOS 18+ يصف سبب الوصول إلى جهات الاتصال.
  • الوصول لمرة واحدة — وضع iOS 17+ الذي يسمح للمستخدم بمنح الوصول إلى جهة اتصال واحدة دون الكشف الكامل عن دفتر العناوين.

ما هو إذن الوصول إلى جهات الاتصال؟

إذن الوصول إلى جهات الاتصال هو آلية نظام تشغيل تحمي دفتر عناوين المستخدم من القراءة غير المصرح بها بواسطة تطبيقات الطرف الثالث. في أنظمة التشغيل المحمولة، تُعتبر جهات الاتصال بيانات حساسة لأنها تحتوي على أسماء وأرقام هواتف وعناوين بريد إلكتروني وصور لأشخاص من محيط المستخدم.

على iOS، يتم تنظيم الإذن بواسطة إطار Contacts وفئة CNContactStore. يرى المستخدم حوار نظام عند أول طلب وصول، حيث يمكنه اختيار منح الوصول أو رفضه. على Android، تعتمد الحماية على نظام الأذونات في وقت التشغيل: يعلن التطبيق عن READ_CONTACTS في البيان ويطلبه أثناء التشغيل عبر ActivityResultLauncher أو جزء يعالج النتيجة.

وفقًا لـ Statista (2025)، يرفض أكثر من 68% من مستخدمي iOS و54% من مستخدمي Android الوصول إلى جهات الاتصال عند الطلب الأول. وهذا يعني أن المطور لا يحتاج فقط إلى تنفيذ الطلب بشكل صحيح، بل也需要 شرح سبب الحاجة إلى الوصول للمستخدم.

المعيار الصناعي — طلب الوصول فقط عندما تكون الوظيفة مطلوبة فعليًا، وليس عند التشغيل الأول. هذا النهج يقلل من معدل الرفض ويحسن تجربة المستخدم.

كيف يعمل طلب الوصول إلى جهات الاتصال على iOS

في نظام Apple البيئي، يتم تنظيم الوصول إلى جهات الاتصال بواسطة إطار Contacts، الذي تم تقديمه في iOS 9. توفر فئة CNContactStore طرقًا لطلب الإذن وإجراء عمليات القراءة والكتابة. عند أول استدعاء لـ requestAccess(for:)، يعرض النظام حوارًا أصليًا يوضح سبب الوصول.

CNContactStore والوصول لمرة واحدة

بدءًا من iOS 17، قدمت Apple وضع الوصول لمرة واحدة. يمكن للمستخدم تحديد جهة اتصال واحدة من دفتر العناوين ومشاركتها مع التطبيق دون الكشف عن قاعدة البيانات بأكملها. يتم تنفيذ هذا الوضع عبر CNContactPickerViewController ولا يتطلب استدعاء requestAccess(for:).

من المهم أن يفهم المطور: إذا طلب التطبيق وصولاً كاملاً لكنه functionally يحتاج فقط إلى جهة اتصال واحدة، فقد يرفض مراجعو App Store البناء. وفقًا لـ Apple App Review Guidelines (2025)، يطلب القسم 5.1.1 صراحةً الحد الأدنى الضروري من البيانات.

Privacy Manifest في iOS 18

مع إصدار iOS 18، شددت Apple المتطلبات الخاصة بـ Privacy Manifest — ملف privacy.xcprivacy حيث يصرح المطور بسبب الوصول إلى البيانات المحمية. لجهات الاتصال، يتم استخدام المفتاح NSContactsUsageDescription مع نص مترجم يظهر في حوار النظام.

بدون privacy manifest صحيح، لا يجتاز التطبيق مراجعة App Store Connect. يجب أن يكون نص الوصف محددًا: ليس «لتحسين الأداء»، بل «للبحث عن الأصدقاء بواسطة رقم الهاتف».

كيف يعمل طلب الوصول إلى جهات الاتصال على Android

على Android، الوصول إلى جهات الاتصال محمي بإذن READ_CONTACTS، الذي ينتمي إلى الفئة الخطيرة — يجب طلبه أثناء التشغيل، وليس فقط عند التثبيت. تم تقديم آلية الأذونات في وقت التشغيل في Android 6.0 (API 23) ولا تزال الطريقة الرئيسية لحماية البيانات الحساسة.

READ_CONTACTS والإذن في وقت التشغيل

يتم الإعلان عن إذن READ_CONTACTS في البيان عبر علامة uses-permission، ويتم طلبه في الكود عبر ActivityResultLauncher أو جزء مع onRequestPermissionsResult. يمكن للمستخدم رفض الطلب أو اختيار «عدم السؤال مرة أخرى»، وبعد ذلك يجب على التطبيق معالجة الرفض بشكل صحيح.

بدءًا من Android 14 (API 34)، تغير سلوك الأذونات في وقت التشغيل: بعد رفضين متتاليين، يضع نظام التشغيل تلقائيًا علامة neverAskAgain. وفقًا لـ Google Developer Documentation (2024)، يجب على المطور التحقق من الحالة عبر shouldShowRequestPermissionRationale قبل إعادة الطلب.

ContactsContract وContentProvider

لقراءة جهات الاتصال، يستخدم Android ContentProvider يسمى ContactsContract. وهي قاعدة بيانات منظمة يمكن الوصول إليها عبر ContentResolver. يتم تنظيم البيانات في عدة جداول: Contacts (جهات الاتصال)، RawContacts (سجلات خام من حسابات مختلفة)، Data (معلومات مفصلة: هواتف، بريد إلكتروني، عناوين).

يتم الاستعلام عن ContactsContract عبر URI ContactsContract.Contacts.CONTENT_URI. يجب على المطور طلب الحد الأدنى من الأعمدة واستخدام الإسقاط لتصفية الحقول — مما يسرع تنفيذ الاستعلام ويقلل استهلاك الذاكرة.

أمثلة برمجية لطلب جهات الاتصال

يختلف التنفيذ العملي لطلب الوصول إلى جهات الاتصال بين iOS وAndroid. فيما يلي أمثلة محددة بلغتي Swift وKotlin مع معالجة جميع الحالات الممكنة للإذن.

طلب الوصول في Swift

في iOS، يتم الطلب عبر طريقة requestAccess من فئة CNContactStore. يتم إرجاع النتيجة في إغلاق بقيمة منطقية وخطأ اختياري. يوضح المثال أدناه دورة الطلب الكاملة مع معالجة الحالة.

swift
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 ?? "خطأ غير معروف")")
    }
}

طلب الوصول في Kotlin

في Android، يتم الطلب عبر ActivityResultLauncher مع عقد RequestPermission. يوضح المثال أدناه العمل مع ContactsContract.ContentProvider بعد الحصول على الإذن.

kotlin
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؟

الوصول لمرة واحدة (iOS 17+) عبر CNContactPickerViewController يسمح للمستخدم باختيار جهة اتصال واحدة دون الكشف عن دفتر العناوين بأكمله. الوصول الكامل يسمح للتطبيق بقراءة جميع جهات اتصال الجهاز عبر CNContactStore. الوصول لمرة واحدة أكثر أمانًا ولا يتطلب تحديد NSContactsUsageDescription في privacy manifest.

كيفية إلغاء إذن جهات الاتصال؟

على iOS، انتقل إلى الإعدادات — الخصوصية والأمان — جهات الاتصال وقم بتعطيل الوصول للتطبيق المحدد. على Android، افتح الإعدادات — التطبيقات — اختر التطبيق — الأذونات — جهات الاتصال واختر «رفض».

ما هو privacy manifest في iOS 18؟

Privacy Manifest (ملف privacy.xcprivacy) هو مستند إلزامي لنظام iOS 18+، يصرح فيه المطور بأسباب الوصول إلى البيانات المحمية، بما في ذلك جهات الاتصال. يحتوي المفتاح NSContactsUsageDescription على وصف مترجم يظهر في حوار طلب الإذن للنظام.

لماذا يتطلب Android طلبًا صريحًا لـ READ_CONTACTS؟

يصنف Android READ_CONTACTS كـ إذن خطير لأنه يمنح الوصول إلى البيانات الشخصية للمستخدم. آلية الأذونات في وقت التشغيل، التي تم تقديمها في Android 6.0، تتطلب موافقة صريحة أثناء التشغيل، وليس فقط عند تثبيت التطبيق.

الملخص

  • Contacts Permission — إذن إلزامي لقراءة دفتر عناوين المستخدم على iOS وAndroid.
  • CNContactStore — الفئة الرئيسية في iOS لطلب الوصول وإجراء عمليات جهات الاتصال عبر إطار Contacts.
  • Runtime permission — آلية Android 6.0+ التي تتطلب طلبًا صريحًا لـ READ_CONTACTS أثناء التشغيل.
  • Privacy manifest — ملف إلزامي لنظام iOS 18+ يصرح بأسباب الوصول إلى جهات الاتصال.
  • الوصول لمرة واحدة — ميزة iOS 17+ تسمح للمستخدم باختيار جهة اتصال واحدة دون الكشف الكامل عن قاعدة البيانات.
  • تقليل البيانات — طلب الوصول فقط عند الحاجة الفعلية، وليس عند التشغيل الأول.
  • معالجة الرفض — يجب على التطبيق الاستجابة بشكل مناسب لرفض الإذن دون تعطل أو تكرار الطلب.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا