สิทธิ์การเข้าถึงรายชื่อในการพัฒนาแอปมือถือ — คืออะไร ทำงานอย่างไร และการขอเข้าถึง

ผู้แต่ง: 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 framework
  • Runtime permission — โมเดล Android ที่ขอสิทธิ์ READ_CONTACTS ขณะรันไทม์
  • Privacy manifest — ไฟล์ที่จำเป็นสำหรับ iOS 18+ ที่อธิบายเหตุผลในการเข้าถึงรายชื่อ
  • การเข้าถึงรายชื่อเดียว — โหมด iOS 17+ ที่ให้ผู้ใช้อนุญาตการเข้าถึงรายชื่อเดียวโดยไม่เปิดเผยสมุดโทรศัพท์ทั้งหมด

สิทธิ์การเข้าถึงรายชื่อคืออะไร?

สิทธิ์การเข้าถึงรายชื่อ เป็นกลไกของระบบปฏิบัติการที่ปกป้องสมุดโทรศัพท์ของผู้ใช้จากการอ่านโดยไม่ได้รับอนุญาตจากแอปของบุคคลที่สาม ในระบบปฏิบัติการมือถือ รายชื่อถือเป็นข้อมูลที่ละเอียดอ่อนเนื่องจากมีชื่อ หมายเลขโทรศัพท์ ที่อยู่อีเมล และรูปถ่ายของบุคคลในเครือข่ายของผู้ใช้

บน iOS สิทธิ์ถูกควบคุมโดย Contacts framework และคลาส CNContactStore ผู้ใช้จะเห็นไดอะล็อกของระบบเมื่อมีการขอเข้าถึงครั้งแรก ซึ่งพวกเขาสามารถเลือกอนุญาตหรือปฏิเสธการเข้าถึงได้ บน Android การป้องกันขึ้นอยู่กับระบบสิทธิ์ขณะรันไทม์: แอปประกาศ READ_CONTACTS ในไฟล์ manifest และขอสิทธิ์ขณะรันไทม์ผ่าน ActivityResultLauncher หรือแฟรกเมนต์ที่จัดการผลลัพธ์

ตาม Statista (2025) ผู้ใช้ iOS กว่า 68% และผู้ใช้ Android 54% ปฏิเสธการเข้าถึงรายชื่อในการขอครั้งแรก ซึ่งหมายความว่านักพัฒนาไม่เพียงต้องดำเนินการขออย่างถูกต้อง แต่ยังต้องอธิบายให้ผู้ใช้ทราบว่าเหตุใดจึงจำเป็นต้องเข้าถึง

มาตรฐานอุตสาหกรรม — ขอเข้าถึงเฉพาะเมื่อจำเป็นต้องใช้ฟังก์ชันการทำงานจริง ๆ ไม่ใช่เมื่อเปิดใช้งานครั้งแรก วิธีการนี้ช่วยลดอัตราการปฏิเสธและปรับปรุงประสบการณ์ผู้ใช้

การขอเข้าถึงรายชื่อบน iOS ทำงานอย่างไร

ในระบบนิเวศของ Apple การเข้าถึงรายชื่อถูกควบคุมโดย Contacts framework ซึ่งเปิดตัวใน iOS 9 คลาส CNContactStore มีวิธีการสำหรับขอสิทธิ์และดำเนินการอ่านและเขียน ในการเรียก requestAccess(for:) ครั้งแรก ระบบจะแสดงไดอะล็อกแบบเนทีฟที่อธิบายเหตุผลในการเข้าถึง

CNContactStore และการเข้าถึงรายชื่อเดียว

เริ่มต้นจาก iOS 17 Apple ได้แนะนำโหมด การเข้าถึงรายชื่อเดียว ผู้ใช้สามารถเลือกรายชื่อหนึ่งรายการจากสมุดโทรศัพท์และแชร์กับแอปโดยไม่เปิดเผยฐานข้อมูลทั้งหมด โหมดนี้ทำงานผ่าน CNContactPickerViewController และไม่จำเป็นต้องเรียก requestAccess(for:)

นักพัฒนาควรเข้าใจ: หากแอปขอการเข้าถึงแบบเต็มแต่ในทางปฏิบัติต้องการเพียงรายชื่อเดียว ผู้ตรวจสอบ 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 ถูกประกาศใน manifest ผ่านแท็ก 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 นักพัฒนาควรขอจำนวนคอลัมน์ขั้นต่ำและใช้ projection เพื่อกรองฟิลด์ — ซึ่งช่วยเร่งการดำเนินการสืบค้นและลดการใช้หน่วยความจำ

ตัวอย่างโค้ดสำหรับขอรายชื่อ

การดำเนินการขอเข้าถึงรายชื่อในทางปฏิบัติแตกต่างกันระหว่าง iOS และ Android ด้านล่างเป็นตัวอย่างเฉพาะใน Swift และ Kotlin พร้อมการจัดการสถานะสิทธิ์ทั้งหมดที่เป็นไปได้

การขอเข้าถึงใน Swift

บน iOS การขอทำผ่านเมธอด requestAccess ของคลาส CNContactStore ผลลัพธ์จะถูกส่งกลับใน closure พร้อมค่า boolean และข้อผิดพลาดที่เป็นทางเลือก ตัวอย่างด้านล่างแสดงรอบการขอทั้งหมดพร้อมการจัดการสถานะ

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 หรือ implicit 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 framework
  • Runtime permission — กลไก Android 6.0+ ที่ต้องการการขอ READ_CONTACTS อย่างชัดแจ้งขณะรันไทม์
  • Privacy manifest — ไฟล์ที่จำเป็นสำหรับ iOS 18+ ที่ประกาศเหตุผลในการเข้าถึงรายชื่อ
  • การเข้าถึงรายชื่อเดียว — ฟีเจอร์ iOS 17+ ที่ให้ผู้ใช้เลือกรายชื่อเดียวโดยไม่เปิดเผยฐานข้อมูลทั้งหมด
  • การลดข้อมูล — ขอเข้าถึงเฉพาะเมื่อจำเป็นจริง ๆ ไม่ใช่เมื่อเปิดครั้งแรก
  • การจัดการการปฏิเสธ — แอปควรตอบสนองต่อการปฏิเสธสิทธิ์อย่างเหมาะสมโดยไม่ขัดข้องหรือแจ้งเตือนซ้ำ ๆ

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม