แนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับสิทธิ์ของแอป

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

ดูภาพรวมทั่วไปเกี่ยวกับสิทธิ์ของ Android ได้ที่ภาพรวมสิทธิ์ ดูรายละเอียดเกี่ยวกับวิธีใช้งานสิทธิ์ในโค้ดได้ที่การขอสิทธิ์ของแอป

สิทธิ์ใน Android 6.0 ขึ้นไป

ใน Android 6.0 (API ระดับ 23) ขึ้นไป แอปจะขอสิทธิ์จากผู้ใช้ขณะรันไทม์ได้ แทนที่จะขอก่อนการติดตั้ง ซึ่งจะช่วยให้แอปขอสิทธิ์ได้เมื่อแอปต้องใช้บริการหรือข้อมูลที่บริการดังกล่าวคุ้มครอง แม้ว่าการดำเนินการนี้จะไม่เปลี่ยนลักษณะการทำงานโดยรวมของแอป (เสมอไป) แต่จะสร้างการเปลี่ยนแปลงบางอย่างที่เกี่ยวข้องกับวิธีจัดการข้อมูลผู้ใช้ที่ละเอียดอ่อน ดังนี้

บริบทตามสถานการณ์ที่เพิ่มขึ้น

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

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

เพิ่มความยืดหยุ่นในการให้สิทธิ์

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

เพิ่มภาระในการทำธุรกรรม

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

สิทธิ์ที่ต้องกำหนดเป็นเครื่องจัดการเริ่มต้น

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแฮนเดิลเริ่มต้น รวมถึงคําแนะนําในการแสดงข้อความแจ้งของตัวแฮนเดิลเริ่มต้นต่อผู้ใช้ได้ที่ดูคู่มือเกี่ยวกับสิทธิ์ที่ใช้เฉพาะในตัวแฮนเดิลเริ่มต้น

ทำความรู้จักกับไลบรารีที่คุณใช้

บางครั้งไลบรารีที่คุณใช้ในแอปอาจต้องใช้สิทธิ์ เช่น ไลบรารีโฆษณาและข้อมูลวิเคราะห์อาจต้องเข้าถึงกลุ่มสิทธิ์ LOCATION เพื่อใช้ฟังก์ชันการทำงานที่จำเป็น แต่จากมุมมองของผู้ใช้ คำขอสิทธิ์จะมาจากแอปของคุณ ไม่ใช่คลัง

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

จำกัดการเข้าถึงตำแหน่งในเบื้องหลัง

เมื่อแอปทำงานอยู่เบื้องหลัง การเข้าถึงตำแหน่งควรมีความสําคัญต่อฟังก์ชันการทํางานหลักของแอปและแสดงประโยชน์ที่ชัดเจนต่อผู้ใช้

ทดสอบรูปแบบสิทธิ์ทั้ง 2 แบบ

ใน Android 6.0 (API ระดับ 23) ขึ้นไป ผู้ใช้จะให้สิทธิ์และเพิกถอนสิทธิ์ของแอปขณะรันไทม์แทนที่จะดำเนินการเมื่อติดตั้งแอป คุณจึงต้องทดสอบแอปภายใต้เงื่อนไขที่หลากหลายมากขึ้น ก่อนที่จะมี Android 6.0 คุณสามารถสันนิษฐานได้อย่างสมเหตุสมผลว่าหากแอปทำงานอยู่ แสดงว่าแอปมีสิทธิ์ทั้งหมดที่ประกาศไว้ในไฟล์ Manifest ของแอป ตอนนี้ผู้ใช้สามารถเปิดหรือปิดสิทธิ์สําหรับแอปใดก็ได้ โดยไม่คำนึงถึงระดับ API คุณควรทดสอบเพื่อให้แน่ใจว่าแอปทำงานได้อย่างถูกต้องในสถานการณ์ต่างๆ เกี่ยวกับสิทธิ์

เคล็ดลับต่อไปนี้จะช่วยคุณค้นหาปัญหาเกี่ยวกับโค้ดที่เกี่ยวข้องกับสิทธิ์ในอุปกรณ์ที่ใช้ API ระดับ 23 ขึ้นไป

  • ระบุสิทธิ์ปัจจุบันของแอปและเส้นทางโค้ดที่เกี่ยวข้อง
  • ทดสอบขั้นตอนของผู้ใช้ในบริการและข้อมูลที่ได้รับการปกป้องด้วยสิทธิ์
  • ทดสอบด้วยชุดค่าผสมต่างๆ ของสิทธิ์ที่อนุญาตหรือเพิกถอน เช่น แอปกล้องอาจแสดง CAMERA, READ_CONTACTS และ ACCESS_FINE_LOCATION ในไฟล์ Manifest คุณควรทดสอบแอปโดยเปิดและปิดสิทธิ์แต่ละรายการเหล่านี้ เพื่อให้แน่ใจว่าแอปสามารถจัดการการกำหนดค่าสิทธิ์ทั้งหมดได้อย่างราบรื่น
  • ใช้เครื่องมือ adb เพื่อจัดการสิทธิ์จากบรรทัดคำสั่ง ดังนี้
    • แสดงรายการสิทธิ์และสถานะตามกลุ่ม
      $ adb shell pm list permissions -d -g
    • ให้สิทธิ์หรือเพิกถอนสิทธิ์อย่างน้อย 1 รายการ
      $ adb shell pm [grant|revoke] <permission-name> ...
  • วิเคราะห์แอปเพื่อหาบริการที่ใช้สิทธิ์

แหล่งข้อมูลเพิ่มเติม