GPS và dịch vụ định vị trong ứng dụng di động là các API để xác định vị trí vật lý của thiết bị bằng cách sử dụng vệ tinh, Wi-Fi và mạng di động. Theo Google Android Location Guide (2025), hơn 60% ứng dụng di động sử dụng dữ liệu vị trí để cá nhân hóa nội dung. Fused Location Provider trên Android kết hợp nhiều nguồn để cải thiện độ chính xác và giảm mức tiêu thụ điện.
Các điểm chính
GPS (Hệ thống định vị toàn cầu) là hệ thống định vị vệ tinh gồm 31 vệ tinh đang hoạt động trên quỹy đạo ở độ cao khoảng 20.200 km. Trên thiết bị di động, chip GPS nhận tín hiệu từ vệ tinh và tính toán tọa độ dựa trên phép đo tam giác — đo thời gian truyền tín hiệu từ nhiều vệ tinh. Dịch vụ định vị trong hệ điều hành di động thêm dữ liệu từ các điểm truy cập Wi-Fi và trạm BTS vào GPS để định vị nhanh hơn (A-GPS) và cải thiện độ chính xác trong nhà. Theo GPS.gov (2024), độ chính xác của GPS dân sự là 3-5 mét trong điều kiện trời quang đãng và lên đến 15 mét ở khu vực đô thị dày đặc.
Các thiết bị di động hiện đại không chỉ hỗ trợ hệ thống GPS của Mỹ mà còn các hệ thống định vị vệ tinh toàn cầu khác: GLONASS của Nga (24 vệ tinh), Galileo của Châu Âu (28 vệ tinh) và BeiDou của Trung Quốc. Hỗ trợ nhiều hệ thống cùng lúc cải thiện độ chính xác và tốc độ định vị — thiết bị có thể sử dụng tới 40 vệ tinh từ các hệ thống khác nhau để tính toán vị trí. Trên iOS và Android, việc chọn hệ thống vệ tinh được thực hiện tự động ở cấp độ chip phần cứng, nhà phát triển không cần quản lý điều này.
Quá trình xác định vị trí trên thiết bị di động bao gồm nhiều bước: thu thập dữ liệu từ các nguồn (vệ tinh, Wi-Fi, trạm BTS), lọc và hiệu chỉnh lỗi, tính toán tọa độ và chuyển kết quả đến ứng dụng. Hệ điều hành quản lý quá trình này thông qua một dịch vụ định vị thống nhất giúp tối ưu hóa tất cả các nguồn để tiết kiệm pin. Dưới đây là ba nguồn dữ liệu vị trí chính.
Định vị vệ tinh cung cấp độ chính xác tối đa (3-5 mét) nhưng cần có tầm nhìn rõ bầu trời. Trong nhà hoặc khu vực đô thị dày đặc, tín hiệu GPS có thể bị yếu hoặc mất hoàn toàn. Thời gian xác định vị trí đầu tiên (TTFF) là 30-60 giây khi khởi động nguội và 5-10 giây khi khởi động nóng. A-GPS (GPS hỗ trợ) tăng tốc khởi động bằng cách tải dữ liệu lịch vệ tinh qua internet thay vì chờ dữ liệu từ vệ tinh.
Wi-Fi định vị sử dụng cơ sở dữ liệu địa chỉ MAC của các điểm truy cập có tọa độ đã biết. Độ chính xác là 10-50 mét trong phạm vi phủ sóng Wi-Fi. Trạm BTS cung cấp độ chính xác từ 100 mét đến vài km tùy theo mật độ trạm. Kết hợp tất cả các nguồn (Fused Location) cho phép lấy tọa độ với độ chính xác hợp lý ở mức tiêu thụ điện tối thiểu — đặc biệt khi chip GPS tắt hoặc không có tín hiệu vệ tinh.
Trên cả hai nền tảng, dịch vụ định vị được triển khai thông qua API hệ thống với các mức độ trừu tượng khác nhau. Android sử dụng FusedLocationProviderClient từ Google Play Services, iOS sử dụng CLLocationManager từ Core Location. Cả hai API đều cho phép yêu cầu vị trí một lần hoặc đăng ký nhận cập nhật định kỳ. Dưới đây là ví dụ về cách lấy tọa độ trên Android bằng Fused Location Provider trong Kotlin.
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("Vị trí", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
Trong ví dụ, LocationRequest được cấu hình với PRIORITY_HIGH_ACCURACY — điều này bật GPS để có độ chính xác tối đa. setIntervalMillis đặt khoảng thời gian cập nhật mong muốn (5 giây), setMinUpdateIntervalMillis đặt khoảng thời gian tối thiểu (2 giây). Callback onLocationResult được gọi mỗi khi hệ thống nhận được tọa độ mới. Điều quan trọng là phải kiểm tra quyền trước khi gọi requestLocationUpdates — nếu không, ứng dụng sẽ bị lỗi SecurityException.
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// NHÃN: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
Trên iOS, desiredAccuracy xác định độ chính xác của yêu cầu: kCLLocationAccuracyBest sử dụng tất cả các nguồn khả dụng (GPS + Wi-Fi + trạm BTS). Sau khi yêu cầu quyền qua requestWhenInUseAuthorization, hệ thống sẽ hiển thị hộp thoại cho người dùng. Delegate didUpdateLocations nhận một mảng các đối tượng CLLocation với tọa độ, độ cao, tốc độ và hướng. Để dừng cập nhật, hãy gọi stopUpdatingLocation để tiết kiệm pin.
Quyền truy cập định vị yêu cầu sự cho phép rõ ràng từ người dùng trên cả hai nền tảng. Trên Android, các quyền ACCESS_FINE_LOCATION (GPS) và ACCESS_COARSE_LOCATION (Wi-Fi/trạm BTS) được sử dụng. Từ Android 10, quyền truy cập nền yêu cầu quyền riêng ACCESS_BACKGROUND_LOCATION. Trên iOS, ba cấp độ có sẵn: requestWhenInUseAuthorization (chỉ khi ứng dụng đang hoạt động), requestAlwaysAuthorization (trong nền) và dấu thời gian tạm thời cho định vị chính xác. Apple yêu cầu mô tả bắt buộc trong Info.plist: NSLocationWhenInUseUsageDescription hoặc NSLocationAlwaysAndWhenInUseUsageDescription. Nếu không có các khóa này, yêu cầu quyền sẽ bị bỏ qua.
Việc sử dụng liên tục GPS làm hao pin đáng kể — lên tới 30% mỗi giờ hoạt động liên tục ở độ chính xác tối đa. Để tối ưu hóa mức tiêu thụ điện, bạn nên chỉ sử dụng định vị khi cần thiết và dừng cập nhật khi ứng dụng chuyển sang nền. Trên Android, FusedLocationProviderClient tự động chuyển đổi giữa GPS và các nguồn mạng tùy theo tính khả dụng và mức ưu tiên của yêu cầu. Trên iOS, hãy sử dụng dịch vụ thay đổi vị trí đáng kể (startMonitoringSignificantLocationChanges) để cập nhật với mức tiêu thụ điện tối thiểu — độ chính xác thấp hơn (tới 500 mét) nhưng pin hầu như không bị hao. Ngoài ra, hãy thực hành xử lý theo lô: thu thập tọa độ cách nhau 5-10 phút và gửi đến máy chủ trong một yêu cầu duy nhất qua WorkManager trên Android hoặc BGTaskScheduler trên iOS. Giảm tần suất yêu cầu từ 1 giây xuống 30 giây giúp giảm mức tiêu thụ điện của định vị xuống 85%.
Định vị được sử dụng trong nhiều loại ứng dụng di động: từ ứng dụng dẫn đường đến dịch vụ giao hàng. Các tình huống phổ biến nhất bao gồm hiển thị người dùng trên bản đồ, quảng cáo theo vị trí, theo dõi người giao hàng, hàng rào địa lý cho thông báo push và theo dõi hoạt động thể dục. Mỗi tình huống yêu cầu cách tiếp cận riêng về độ chính xác và tần suất cập nhật. Dưới đây là bảng khuyến nghị cấu hình cho các loại ứng dụng khác nhau.
| Loại ứng dụng | Độ chính xác | Khoảng thời gian | Chế độ nền |
|---|---|---|---|
| Dẫn đường | HIGH (GPS) | 1-2 giây | Có |
| Giao hàng | BALANCED (GPS+Wi-Fi) | 10-30 giây | Có |
| Thời tiết | LOW (Wi-Fi/trạm BTS) | Một lần | Không |
| Mạng xã hội | BALANCED | Khi mở | Không |
| Thể dục | HIGH (GPS) | 5-10 giây | Có |
Khi thiết kế chức năng định vị, điều quan trọng là phải xem xét rằng người dùng có thể thu hồi quyền bất cứ lúc nào thông qua cài đặt hệ thống. Ứng dụng phải xử lý đúng các tình huống khi không có quyền định vị và hiển thị giải thích rõ ràng về lý do chức năng bị hạn chế.
Geofencing là công nghệ tạo các ranh giới ảo trên bản đồ. Khi vượt qua các ranh giới này, ứng dụng sẽ nhận được thông báo. Trên Android, hàng rào địa lý được triển khai qua GeofencingClient từ Google Play Services, trên iOS — qua CLCircularRegion từ Core Location. Khi vào hoặc ra khỏi một khu vực, hệ thống đánh thức ứng dụng và gửi sự kiện ngay cả khi ứng dụng đang đóng hoặc thu nhỏ. Điều này được sử dụng cho thông báo push khi đến gần cửa hàng, lời nhắc nhiệm vụ dựa trên vị trí và tự động hóa thiết bị IoT. Số lượng hàng rào địa lý tối đa bị giới hạn: 100 trên Android, 20 trên iOS cùng lúc. Bán kính khu vực tối thiểu là 50 mét trên cả hai nền tảng — nếu nhỏ hơn, hệ thống có thể không kích hoạt do sai số xác định vị trí. Khi vào khu vực, hệ thống khởi chạy Intent trên Android hoặc gọi delegate locationManager:didEnterRegion trên iOS.
Câu hỏi thường gặp
GPS trong điện thoại thông minh là bộ thu tín hiệu tích hợp của hệ thống định vị vệ tinh, xác định tọa độ với độ chính xác 3-5 mét. Thiết bị cũng hỗ trợ GLONASS, Galileo và BeiDou để cải thiện độ chính xác và tốc độ định vị.
GPS chỉ là một phương pháp vệ tinh để xác định tọa độ. Dịch vụ định vị kết hợp GPS, định vị Wi-Fi và dữ liệu trạm BTS để xác định vị trí nhanh hơn và tiết kiệm năng lượng hơn, đặc biệt là trong nhà.
Gọi requestWhenInUseAuthorization() hoặc requestAlwaysAuthorization() trên một thể hiện CLLocationManager. Trước tiên, thêm NSLocationWhenInUseUsageDescription vào Info.plist với giải thích rõ ràng về lý do cần định vị.
Sử dụng FusedLocationProviderClient trên Android và dịch vụ thay đổi vị trí đáng kể trên iOS. Tăng khoảng thời gian giữa các yêu cầu lên 10-30 giây, tắt cập nhật khi màn hình tắt và áp dụng gửi tọa độ theo lô đến máy chủ.
Có, không cần GPS bạn vẫn có thể xác định vị trí gần đúng bằng cách sử dụng điểm truy cập Wi-Fi (độ chính xác 10-50 mét) hoặc trạm BTS (độ chính xác 100-5000 mét). Trên Android, ACCESS_COARSE_LOCATION được sử dụng cho mục đích này.
Tóm tắ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