Location Permission là quyền mà ứng dụng di động yêu cầu từ người dùng để truy cập dữ liệu về vị trí địa lý của họ. Nếu không có quyền này, ứng dụng không thể xác định tọa độ thiết bị và do đó không thể cung cấp các tính năng định vị. Theo Apple Developer Documentation, 2024, tất cả các ứng dụng sử dụng dịch vụ định vị đều phải yêu cầu sự đồng ý rõ ràng của người dùng thông qua hộp thoại hệ thống.
Những điểm chính
Location Permission là cơ chế của hệ điều hành điều chỉnh quyền truy cập của ứng dụng vào dữ liệu vị trí địa lý của thiết bị. Nếu không có sự đồng ý rõ ràng của người dùng, ứng dụng không thể lấy tọa độ GPS, dữ liệu mạng Wi-Fi hoặc thông tin trạm di động.
Các nền tảng di động Android và iOS triển khai hệ thống quyền riêng của mình, nhưng logic chung là giống nhau: ứng dụng khai báo các quyền cần thiết trong tệp kê khai hoặc cấu hình, sau đó yêu cầu chúng trong thời gian chạy. Theo Android Developers, 2024, bắt đầu từ Android 10, tất cả các quyền định vị địa lý thuộc loại nguy hiểm và yêu cầu yêu cầu trong thời gian chạy.
Lý do cho cách tiếp cận này là bảo vệ quyền riêng tư của người dùng. Dữ liệu vị trí có thể được sử dụng để xây dựng lộ trình di chuyển, xác định nơi làm việc và giải trí, cũng như nhận dạng danh tính. Do đó, cả hai nền tảng đều yêu cầu giải thích minh bạch trong hộp thoại yêu cầu: ứng dụng phải nêu rõ lý do tại sao cần truy cập định vị địa lý.
Quyền định vị địa lý cần thiết cho bất kỳ ứng dụng nào có chức năng phụ thuộc vào việc biết vị trí thực tế của người dùng. Bản đồ và định vị, ứng dụng giao hàng, dịch vụ thời tiết, mạng xã hội với gắn thẻ địa lý — tất cả các loại phần mềm này đều yêu cầu Location Permission.
Nếu không có quyền này, ứng dụng không thể xác định tọa độ thiết bị bằng bất kỳ phương pháp nào có sẵn: không qua mô-đun GPS, không qua quét Wi-Fi, không qua định vị trạm di động. Người dùng có thể thu hồi quyền bất kỳ lúc nào trong cài đặt hệ thống, sau đó ứng dụng phải xử lý việc từ chối một cách chính xác.
Theo một nghiên cứu của Pew Research Center (2024), khoảng 45% người dùng thu hồi quyền truy cập định vị trong các ứng dụng không sử dụng nó cho chức năng chính. Điều này có nghĩa là nhà phát triển cần biện minh rõ ràng cho yêu cầu và cung cấp các cơ chế thay thế cho những người đã từ chối Location Permission.
GDPR ở Châu Âu và Luật Liên bang 152-FZ ở Nga yêu cầu có được sự đồng ý có thông tin để xử lý dữ liệu vị trí. Ứng dụng không chỉ phải yêu cầu quyền thông qua hộp thoại hệ thống mà còn phải cung cấp thông báo riêng về mục đích thu thập dữ liệu. Vi phạm các yêu cầu này có thể dẫn đến phạt tiền lên tới 20 triệu euro hoặc 4% doanh thu hàng năm của công ty.
Nếu ứng dụng không yêu cầu Location Permission hoặc người dùng từ chối truy cập, nhà phát triển phải cung cấp kịch bản thay thế. Đối với ứng dụng bản đồ, có thể là nhập địa chỉ thủ công; đối với ứng dụng giao hàng — chọn từ danh sách địa chỉ đã lưu; đối với dịch vụ thời tiết — xác định thành phố qua địa chỉ IP. Graceful degradation (suy giảm mượt mà) là thực hành tiêu chuẩn được Google và Apple khuyến nghị.
Các mức truy cập định vị địa lý khác nhau trên Android và iOS, mặc dù ý tưởng chung là giống nhau: truy cập càng chính xác, nền tảng càng đặt ra yêu cầu nghiêm ngặt hơn đối với ứng dụng.
| Mức truy cập | Android | iOS |
|---|---|---|
| Khi sử dụng | Chỉ khi ứng dụng đang hoạt động | When In Use — chỉ trong ứng dụng |
| Nền | Always — liên tục, ngay cả trong nền | Always — yêu cầu xem xét thêm từ App Store |
| Gần đúng | ACCESS_COARSE_LOCATION (độ chính xác lên tới 500 m) | Với tùy chọn Precision = Off (iOS 14+) |
ACCESS_FINE_LOCATION cung cấp quyền truy cập vào tọa độ GPS chính xác với sai số lên tới vài mét. Để khai báo quyền này trong tệp kê khai, hằng số android.permission.ACCESS_FINE_LOCATION được sử dụng. ACCESS_COARSE_LOCATION cung cấp vị trí gần đúng với độ chính xác lên tới 500 mét dựa trên dữ liệu Wi-Fi và trạm di động.
When In Use cho phép ứng dụng nhận tọa độ chỉ khi nó đang mở trên màn hình. Always cung cấp quyền truy cập định vị ngay cả trong nền, nhưng yêu cầu xem xét bắt buộc từ App Store. Bắt đầu từ iOS 14, người dùng có thể tắt riêng định vị chính xác cho từng ứng dụng thông qua công tắc Precision.
Yêu cầu Location Permission trên Android được thực hiện theo hai giai đoạn: khai báo quyền trong tệp kê khai và yêu cầu trong thời gian chạy. Bắt đầu từ Android 6.0 (API 23), tất cả các quyền nguy hiểm được yêu cầu trong quá trình chạy ứng dụng, không phải khi cài đặt.
Bước đầu tiên là thêm các quyền cần thiết vào tệp AndroidManifest.xml. Các hằng số khác nhau được sử dụng cho định vị chính xác và gần đúng.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Sau khi khai báo trong tệp kê khai, hộp thoại hệ thống yêu cầu quyền phải được gọi trong mã ứng dụng. Hãy xem một ví dụ bằng Kotlin sử dụng Activity Result API.
private val locationPermissionRequest =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
when {
permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
// Đã cấp quyền
getLocation()
}
permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
// Chỉ vị trí gần đúng
getCoarseLocation()
}
else -> {
// Người dùng đã từ chối
showLocationExplanation()
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
checkLocationPermission()
}
Nếu người dùng từ chối truy cập, hệ thống Android không cho phép hiển thị lại hộp thoại tự động. Nhà phát triển cần gọi shouldShowRequestPermissionRationale để hiển thị giải thích sơ bộ. Trong trường hợp từ chối nhiều lần với cờ Never Ask Again, người dùng nên được chuyển hướng đến cài đặt hệ thống.
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()
}
}
}
Yêu cầu Location Permission trên iOS yêu cầu thêm các khóa đặc biệt vào tệp Info.plist và gọi các phương thức của lớp CLLocationManager. Apple đặc biệt chú trọng đến quyền riêng tư, vì vậy văn bản giải thích trong hộp thoại yêu cầu phải cụ thể nhất có thể.
Để yêu cầu vị trí trên iOS, bạn cần thêm một hoặc cả hai khóa vào Info.plist: NSLocationWhenInUseUsageDescription cho quyền truy cập khi sử dụng và NSLocationAlwaysAndWhenInUseUsageDescription cho quyền truy cập nền. Giá trị của mỗi khóa là một chuỗi sẽ được hiển thị cho người dùng trong hộp thoại.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Ứng dụng của bạn cần vị trí của bạn để hiển thị các điểm gần đó trên bản đồ.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Ứng dụng của bạn cần quyền truy cập định vị trong nền để theo dõi lộ trình.</string>
Trong mã Swift, yêu cầu được thực hiện thông qua một thể hiện của CLLocationManager. Tùy thuộc vào mức truy cập cần thiết, requestWhenInUseAuthorization hoặc requestAlwaysAuthorization được gọi.
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
}
}
}
Không giống như Android, iOS không cung cấp cho nhà phát triển phương thức để kiểm tra shouldShowRequestPermissionRationale. Hệ thống tự quyết định khi nào hiển thị giải thích. Ngoài ra, trên iOS, người dùng chỉ có thể thay đổi quyền thông qua cài đặt hệ thống — ứng dụng không thể hiển thị lại hộp thoại hệ thống sau khi người dùng đã đưa ra lựa chọn. RequestAlwaysAuthorization yêu cầu When In Use trước, sau đó sau khi nhận được sự đồng ý đầu tiên, một hộp thoại riêng cho quyền truy cập nền.
Các thực hành tốt nhất với Location Permission giúp giảm tỷ lệ từ chối của người dùng và đáp ứng các yêu cầu của cửa hàng ứng dụng. Google và Apple đã công bố các khuyến nghị mà việc tuân thủ sẽ tăng khả năng phê duyệt ứng dụng.
Đừng hiển thị hộp thoại yêu cầu Location Permission ngay khi khởi động ứng dụng. Người dùng vừa mở ứng dụng chưa hiểu tại sao họ phải cung cấp quyền truy cập định vị. Contextual request có nghĩa là hộp thoại xuất hiện tại thời điểm người dùng thực sự cần một tính năng yêu cầu quyền. Ví dụ: khi nhấp vào nút “Tìm cửa hàng gần nhất”.
Trước hộp thoại hệ thống, hãy hiển thị màn hình giải thích của riêng bạn (pre-permission screen). Trên đó, giải thích tại sao ứng dụng cần định vị, dữ liệu nào được thu thập và cách nó sẽ được sử dụng. Sau khi người dùng nhấp “Cho phép” trên màn hình của bạn, hãy hiển thị hộp thoại hệ thống. Theo Appsflyer (2024), cách tiếp cận này tăng tỷ lệ phê duyệt lên 25-35%.
Quyền truy cập định vị nền chỉ cần thiết cho các ứng dụng hoạt động trong nền: định vị, theo dõi hoạt động, ứng dụng giao hàng. Nếu ứng dụng của bạn chỉ cần tọa độ khi màn hình đang mở, hãy yêu cầu When In Use. App Store sẽ từ chối ứng dụng nếu Always không được biện minh về mặt chức năng. Trên Android, quyền truy cập nền được điều chỉnh thêm thông qua quyền ACCESS_BACKGROUND_LOCATION.
Các câu hỏi thường gặp
Ứng dụng phải xử lý từ chối một cách chính xác và đưa ra kịch bản thay thế. Ví dụ: nhập địa chỉ thủ công hoặc xác định thành phố qua địa chỉ IP. Hộp thoại hệ thống sẽ không hiển thị lại — cần chuyển hướng người dùng đến cài đặt.
Về mặt kỹ thuật, có — hộp thoại hệ thống có thể được kích hoạt mà không cần màn hình sơ bộ. Tuy nhiên, tỷ lệ phê duyệt mà không giải thích là 30-40%, trong khi với màn hình sơ bộ là 60-75%. Apple và Google khuyến nghị luôn giải thích lý do yêu cầu.
Sử dụng ContextCompat.checkSelfPermission với hằng số Manifest.permission.ACCESS_FINE_LOCATION. Phương thức trả về PERMISSION_GRANTED hoặc PERMISSION_DENIED, cho phép xác định trạng thái hiện tại mà không cần gọi hộp thoại hệ thống.
ACCESS_FINE_LOCATION cung cấp quyền truy cập vào tọa độ GPS chính xác với sai số 3-10 mét. ACCESS_COARSE_LOCATION cung cấp vị trí gần đúng với độ chính xác lên tới 500 mét dựa trên Wi-Fi và trạm di động. Trên Android 12+, nhà phát triển có thể yêu cầu cả hai quyền cùng một lúc.
Trên Android, để quét thiết bị BLE cần ACCESS_FINE_LOCATION hoặc ACCESS_COARSE_LOCATION vì tín hiệu BLE có thể được sử dụng để đo tam giác vị trí. Trên iOS, BLE chỉ cần quyền Bluetooth — không cần Location Permission.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm