Location Permission คือสิทธิ์อนุญาตที่แอปพลิเคชันมือถือขอจากผู้ใช้เพื่อเข้าถึงข้อมูลตำแหน่งทางภูมิศาสตร์ของพวกเขา หากไม่มีสิทธิ์นี้ แอปพลิเคชันจะไม่สามารถระบุพิกัดของอุปกรณ์ได้ และดังนั้นจะไม่สามารถให้บริการระบุตำแหน่งที่ตั้งได้ ตาม Apple Developer Documentation, 2024 แอปพลิเคชันทั้งหมดที่ใช้บริการระบุตำแหน่งที่ตั้งมีหน้าที่ต้องขอความยินยอมอย่างชัดแจ้งจากผู้ใช้ผ่านกล่องโต้ตอบของระบบ
ประเด็นสำคัญ
Location Permission คือกลไกของระบบปฏิบัติการที่ควบคุมการเข้าถึงของแอปพลิเคชันไปยังข้อมูลตำแหน่งทางภูมิศาสตร์ของอุปกรณ์ หากไม่ได้รับความยินยอมอย่างชัดแจ้งจากผู้ใช้ แอปพลิเคชันจะไม่สามารถรับพิกัด GPS ข้อมูลเครือข่าย Wi-Fi หรือข้อมูลเสาสัญญาณโทรศัพท์มือถือได้
แพลตฟอร์มมือถือ Android และ iOS มีระบบสิทธิ์อนุญาตของตนเอง แต่ตรรกะทั่วไปเหมือนกัน: แอปพลิเคชันประกาศสิทธิ์อนุญาตที่จำเป็นในไฟล์แสดงรายการหรือการกำหนดค่า จากนั้นขอสิทธิ์เหล่านั้นในขณะรันไทม์ ตาม Android Developers, 2024 ตั้งแต่ Android 10 เป็นต้นไป สิทธิ์ระบุตำแหน่งที่ตั้งทั้งหมดจัดอยู่ในหมวดหมู่ที่เป็นอันตรายและต้องมีการขอขณะรันไทม์
เหตุผลของแนวทางนี้คือการปกป้องความเป็นส่วนตัวของผู้ใช้ ข้อมูลตำแหน่งที่ตั้งสามารถใช้สร้างเส้นทางการเดินทาง ระบุสถานที่ทำงานและพักผ่อน รวมถึงระบุตัวตนบุคคลได้ ดังนั้น ทั้งสองแพลตฟอร์มจึงต้องการ คำอธิบายที่โปร่งใส ในกล่องโต้ตอบการขอสิทธิ์: แอปพลิเคชันต้องระบุเหตุผลว่าทำไมจึงต้องการเข้าถึงตำแหน่งทางภูมิศาสตร์
สิทธิ์ระบุตำแหน่งที่ตั้ง จำเป็นสำหรับแอปพลิเคชันใด ๆ ที่ฟังก์ชันการทำงานขึ้นอยู่กับการรู้ตำแหน่งจริงของผู้ใช้ แผนที่และระบบนำทาง แอปจัดส่ง บริการสภาพอากาศ เครือข่ายสังคมที่มีการแท็กตำแหน่ง — ซอฟต์แวร์ทุกประเภทเหล่านี้ล้วนต้องการ Location Permission
หากไม่มีสิทธิ์นี้ แอปพลิเคชันจะไม่สามารถระบุพิกัดของอุปกรณ์ด้วยวิธีการใด ๆ ที่มีอยู่: ไม่ว่าจะผ่านโมดูล GPS การสแกน Wi-Fi หรือการระบุตำแหน่งผ่านเสาสัญญาณโทรศัพท์มือถือ ผู้ใช้สามารถเพิกถอนสิทธิ์ได้ตลอดเวลาในการตั้งค่าระบบ หลังจากนั้นแอปพลิเคชันต้องจัดการกับการปฏิเสธอย่างถูกต้อง
จากการศึกษาของ Pew Research Center (2024) พบว่าประมาณ 45% ของผู้ใช้เพิกถอนการเข้าถึงตำแหน่งที่ตั้งในแอปพลิเคชันที่ไม่ได้ใช้เพื่อฟังก์ชันหลัก ซึ่งหมายความว่านักพัฒนาต้องชี้แจงเหตุผลของการขอสิทธิ์อย่างชัดเจนและเสนอกลไกทางเลือกสำหรับผู้ที่ปฏิเสธ Location Permission
GDPR ในยุโรปและกฎหมายของรัฐบาลกลาง 152-FZ ในรัสเซียกำหนดให้ต้องได้รับ ความยินยอมโดยได้รับข้อมูล สำหรับการประมวลผลข้อมูลตำแหน่งที่ตั้ง แอปพลิเคชันไม่เพียงต้องขอสิทธิ์ผ่านกล่องโต้ตอบของระบบเท่านั้น แต่ยังต้องให้การแจ้งเตือนแยกต่างหากเกี่ยวกับวัตถุประสงค์ของการเก็บรวบรวมข้อมูลด้วย การละเมิดข้อกำหนดเหล่านี้อาจมีค่าปรับสูงถึง 20 ล้านยูโรหรือ 4% ของรายได้ต่อปีของบริษัท
หากแอปพลิเคชันไม่ขอ Location Permission หรือผู้ใช้ปฏิเสธการเข้าถึง นักพัฒนาต้องเตรียมสถานการณ์สำรองไว้ สำหรับแอปแผนที่ อาจเป็นการป้อนที่อยู่ด้วยตนเอง สำหรับแอปจัดส่ง — การเลือกจากรายการที่อยู่ที่บันทึกไว้ สำหรับบริการสภาพอากาศ — การระบุเมืองผ่านที่อยู่ IP Graceful degradation (การลดประสิทธิภาพอย่างค่อยเป็นค่อยไป) เป็นแนวปฏิบัติมาตรฐานที่ Google และ Apple แนะนำ
ระดับการเข้าถึงตำแหน่งทางภูมิศาสตร์ แตกต่างกันบน Android และ iOS แม้ว่าแนวคิดทั่วไปจะเหมือนกัน: ยิ่งการเข้าถึงแม่นยำมากเท่าใด แพลตฟอร์มก็ยิ่งกำหนดข้อกำหนดที่เข้มงวดมากขึ้นต่อแอปพลิเคชัน
| ระดับการเข้าถึง | Android | iOS |
|---|---|---|
| ขณะใช้งาน | เฉพาะเมื่อแอปพลิเคชันทำงานอยู่ | When In Use — เฉพาะในแอป |
| พื้นหลัง | Always — ตลอดเวลา แม้ในพื้นหลัง | Always — ต้องมีการตรวจสอบ App Store เพิ่มเติม |
| โดยประมาณ | ACCESS_COARSE_LOCATION (ความแม่นยำสูงสุด 500 ม.) | ด้วยตัวเลือก Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION ให้เข้าถึงพิกัด GPS ที่แม่นยำโดยมีค่าคลาดเคลื่อนสูงสุดหลายเมตร ในการประกาศสิทธิ์นี้ในไฟล์แสดงรายการ ใช้ค่าคงที่ android.permission.ACCESS_FINE_LOCATION ACCESS_COARSE_LOCATION ให้ตำแหน่งโดยประมาณที่มีความแม่นยำสูงสุด 500 เมตรโดยอ้างอิงจากข้อมูล Wi-Fi และเสาสัญญาณโทรศัพท์มือถือ
When In Use อนุญาตให้แอปพลิเคชันรับพิกัดเฉพาะเมื่อเปิดอยู่บนหน้าจอเท่านั้น Always ให้การเข้าถึงตำแหน่งทางภูมิศาสตร์แม้ในพื้นหลัง แต่ต้องผ่านการตรวจสอบจาก App Store ตั้งแต่ iOS 14 เป็นต้นไป ผู้ใช้สามารถปิดการระบุตำแหน่งที่แม่นยำสำหรับแต่ละแอปพลิเคชันแยกกันผ่านสวิตช์ Precision
การขอ Location Permission บน Android ดำเนินการสองขั้นตอน: การประกาศสิทธิ์ในไฟล์แสดงรายการและการขอขณะรันไทม์ในโค้ด ตั้งแต่ Android 6.0 (API 23) เป็นต้นไป สิทธิ์ที่เป็นอันตรายทั้งหมดจะถูกขอระหว่างการทำงานของแอปพลิเคชัน ไม่ใช่ขณะติดตั้ง
ขั้นตอนแรกคือเพิ่มสิทธิ์ที่จำเป็นลงในไฟล์ AndroidManifest.xml มีการใช้ค่าคงที่ต่างกันสำหรับการระบุตำแหน่งที่แม่นยำและโดยประมาณ
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
หลังจากประกาศในไฟล์แสดงรายการแล้ว ต้องเรียกกล่องโต้ตอบของระบบสำหรับขอสิทธิ์ในโค้ดของแอปพลิเคชัน มาดูตัวอย่างใน Kotlin ที่ใช้ Activity Result API
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// ได้รับสิทธิ์แล้ว
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// เฉพาะตำแหน่งโดยประมาณ
getCoarseLocation()
}
else -> {
// ผู้ใช้ปฏิเสธ
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
หากผู้ใช้ปฏิเสธการเข้าถึง ระบบ Android ไม่อนุญาตให้แสดงกล่องโต้ตอบอีกครั้งโดยอัตโนมัติ นักพัฒนาต้องเรียก shouldShowRequestPermissionRationale เพื่อแสดงคำอธิบายเบื้องต้น ในกรณีที่ถูกปฏิเสธซ้ำพร้อมกับแฟล็ก Never Ask Again ควรเปลี่ยนเส้นทางผู้ใช้ไปยังการตั้งค่าระบบ
private fun checkLocationPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED -> {
getLocation()
}
ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.ACCESS_FINE_LOCATION) -> {
showRationaleDialog {
requestLocationPermission()
}
}
else -> {
openAppSettings()
}
}
}
การขอ Location Permission บน iOS ต้องเพิ่มคีย์พิเศษลงในไฟล์ Info.plist และเรียกเมธอดของคลาส CLLocationManager Apple ให้ความสำคัญกับความเป็นส่วนตัวเป็นพิเศษ ดังนั้นข้อความอธิบายในกล่องโต้ตอบการขอสิทธิ์ต้องเฉพาะเจาะจงมากที่สุดเท่าที่จะเป็นไปได้
ในการขอตำแหน่งบน iOS ต้องเพิ่มคีย์หนึ่งหรือทั้งสองคีย์ลงใน Info.plist: NSLocationWhenInUseUsageDescription สำหรับการเข้าถึงขณะใช้งาน และ NSLocationAlwaysAndWhenInUseUsageDescription สำหรับการเข้าถึงพื้นหลัง ค่าของแต่ละคีย์คือสตริงที่จะแสดงต่อผู้ใช้ในกล่องโต้ตอบ
<key>NSLocationWhenInUseUsageDescription</key>
<string>แอปของคุณต้องการตำแหน่งของคุณเพื่อแสดงจุดใกล้เคียงบนแผนที่</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>แอปของคุณต้องการการเข้าถึงตำแหน่งทางภูมิศาสตร์ในพื้นหลังเพื่อติดตามเส้นทาง</string>
ในโค้ด Swift การขอจะดำเนินการผ่านอินสแตนซ์ของ CLLocationManager ขึ้นอยู่กับระดับการเข้าถึงที่ต้องการ จะเรียก requestWhenInUseAuthorization หรือ requestAlwaysAuthorization
import CoreLocation
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
func requestLocationAccess() {
manager.delegate = self
manager.requestWhenInUseAuthorization()
}
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
switch manager.authorizationStatus {
case .authorizedWhenInUse, .authorizedAlways:
startLocationUpdates()
case .denied, .restricted:
showSettingsAlert()
case .notDetermined:
break
}
}
}
ต่างจาก Android ตรงที่ iOS ไม่มีเมธอดสำหรับนักพัฒนาในการตรวจสอบ shouldShowRequestPermissionRationale ระบบจะตัดสินใจเองเมื่อจะแสดงคำอธิบาย นอกจากนี้ บน iOS ผู้ใช้สามารถเปลี่ยนสิทธิ์ได้ผ่านการตั้งค่าระบบเท่านั้น — แอปพลิเคชันไม่สามารถแสดงกล่องโต้ตอบของระบบอีกครั้งหลังจากที่ผู้ใช้ตัดสินใจแล้ว RequestAlwaysAuthorization จะขอ When In Use ก่อน จากนั้นหลังจากได้รับความยินยอมครั้งแรก จึงจะแสดงกล่องโต้ตอบแยกต่างหากสำหรับการเข้าถึงพื้นหลัง
แนวทางปฏิบัติที่ดีที่สุดกับ Location Permission ช่วยลดการปฏิเสธจากผู้ใช้และปฏิบัติตามข้อกำหนดของร้านค้าแอป Google และ Apple ได้เผยแพร่คำแนะนำที่การปฏิบัติตามจะเพิ่มโอกาสในการอนุมัติแอปพลิเคชัน
อย่าแสดงกล่องโต้ตอบขอ Location Permission ทันทีเมื่อเริ่มแอปพลิเคชัน ผู้ใช้ที่เพิ่งเปิดแอปยังไม่เข้าใจว่าทำไมต้องให้การเข้าถึงตำแหน่งทางภูมิศาสตร์ Contextual request หมายถึงกล่องโต้ตอบจะปรากฏในขณะที่ผู้ใช้ต้องการฟังก์ชันที่ต้องใช้สิทธิ์จริง ๆ ตัวอย่างเช่น เมื่อคลิกปุ่ม “ค้นหาร้านค้าใกล้ที่สุด”
ก่อนกล่องโต้ตอบของระบบ ให้แสดงหน้าจอคำอธิบายของคุณเอง (pre-permission screen) บนหน้าจอนั้น อธิบายว่าเหตุใดแอปจึงต้องการตำแหน่งทางภูมิศาสตร์ ข้อมูลใดบ้างที่ถูกเก็บรวบรวม และจะใช้ข้อมูลนั้นอย่างไร หลังจากที่ผู้ใช้คลิก “อนุญาต” บนหน้าจอของคุณ ให้แสดงกล่องโต้ตอบของระบบ ตาม Appsflyer (2024) แนวทางนี้เพิ่มอัตราการอนุมัติ 25-35%
การเข้าถึงตำแหน่งทางภูมิศาสตร์ในพื้นหลังจำเป็นเฉพาะแอปที่ทำงานในพื้นหลังเท่านั้น: ระบบนำทาง ตัวติดตามกิจกรรม แอปจัดส่ง หากแอปของคุณต้องการพิกัดเฉพาะเมื่อหน้าจอเปิดอยู่ ให้ขอ When In Use App Store จะปฏิเสธแอปหาก Always ไม่ได้มีเหตุผลรองรับในเชิงฟังก์ชัน บน Android การเข้าถึงพื้นหลังถูกควบคุมเพิ่มเติมผ่านสิทธิ์ ACCESS_BACKGROUND_LOCATION
คำถามที่พบบ่อย
แอปพลิเคชันต้องจัดการกับการปฏิเสธอย่างถูกต้องและเสนอสถานการณ์ทางเลือก ตัวอย่างเช่น การป้อนที่อยู่ด้วยตนเองหรือการระบุเมืองผ่าน ที่อยู่ IP กล่องโต้ตอบของระบบจะไม่แสดงอีกครั้ง — ต้องเปลี่ยนเส้นทางผู้ใช้ไปยังการตั้งค่า
ในทางเทคนิค สามารถทำได้ — กล่องโต้ตอบของระบบสามารถเรียกได้โดยไม่มีหน้าจอเบื้องต้น อย่างไรก็ตาม อัตราการอนุมัติ ที่ไม่มีคำอธิบายคือ 30-40% ในขณะที่มีหน้าจอเบื้องต้นคือ 60-75% Apple และ Google แนะนำให้อธิบายเหตุผลของการขอเสมอ
ใช้ ContextCompat.checkSelfPermission กับค่าคงที่ Manifest.permission.ACCESS_FINE_LOCATION เมธอดจะคืนค่า PERMISSION_GRANTED หรือ PERMISSION_DENIED ซึ่งช่วยให้ระบุสถานะปัจจุบันได้โดยไม่ต้องเรียกกล่องโต้ตอบของระบบ
ACCESS_FINE_LOCATION ให้เข้าถึงพิกัด GPS ที่แม่นยำโดยมีค่าคลาดเคลื่อน 3-10 เมตร ACCESS_COARSE_LOCATION ให้ตำแหน่งโดยประมาณที่มีความแม่นยำสูงสุด 500 เมตรโดยอ้างอิงจาก Wi-Fi และเสาสัญญาณโทรศัพท์มือถือ บน Android 12+ นักพัฒนาสามารถขอสิทธิ์ทั้งสองพร้อมกันได้
บน Android การสแกนอุปกรณ์ BLE ต้องใช้ ACCESS_FINE_LOCATION หรือ ACCESS_COARSE_LOCATION เนื่องจากสัญญาณ BLE สามารถใช้สำหรับการหาตำแหน่งแบบสามเหลี่ยมได้ บน iOS BLE ต้องการเพียงสิทธิ์บลูทูธเท่านั้น — ไม่จำเป็นต้องมี Location Permission
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม