GPS与移动应用中的地理定位服务——是通过卫星、Wi-Fi和移动网络确定设备物理位置的API。根据Google Android Location Guide (2025)的数据,超过60%的移动应用使用位置数据来个性化内容。Android上的Fused Location Provider整合多个来源以提高精度并降低能耗。
要点
GPS(全球定位系统)——是一个由31颗活跃卫星组成的卫星导航系统,轨道高度约20,200公里。在移动设备上,GPS芯片接收来自卫星的信号,并基于三边测量——测量来自多颗卫星的信号传播时间——计算坐标。移动操作系统中的地理定位服务将Wi-Fi接入点和蜂窝基站的数据添加到GPS中,以加速坐标确定(A-GPS)并提高室内精度。根据GPS.gov(2024)的数据,民用GPS在晴朗天空下精度为3-5米,在密集建筑条件下可达15米。
现代移动设备不仅支持美国的GPS系统,还支持其他全球导航系统:俄罗斯的GLONASS(24颗卫星)、欧洲的Galileo(28颗卫星)和中国的北斗。同时支持多个系统可提高坐标确定的精度和速度——设备可使用来自不同系统的多达40颗卫星来计算位置。在iOS和Android上,卫星系统的选择在硬件芯片级别自动完成,开发者无需管理。
在移动设备上确定位置的过程包括几个阶段:从来源(卫星、Wi-Fi、移动网络)收集数据、过滤和纠正错误、计算坐标以及将结果传递给应用程序。操作系统通过统一的地理定位服务管理此过程,优化所有来源的工作以节省电池电量。下面描述了位置数据的三个主要来源。
卫星导航提供最高精度(3-5米),但需要直接看到天空。在室内或密集城市建筑中,GPS信号可能减弱或完全丢失。首次定位时间(TTFF)冷启动为30-60秒,热启动为5-10秒。A-GPS(辅助GPS)通过互联网下载卫星星历数据而非等待卫星数据来加快启动速度。
Wi-Fi定位使用已知坐标的接入点MAC地址数据库。在Wi-Fi覆盖范围内精度为10-50米。蜂窝基站根据基站密度提供100米到数公里的精度。所有来源的组合(Fused Location)可以在能耗最低的情况下以合理精度获取坐标——特别是当GPS芯片关闭或卫星信号不可用时。
在两个平台上,地理定位服务都通过具有不同抽象级别的系统API实现。Android使用Google Play Services中的FusedLocationProviderClient,iOS使用Core Location中的CLLocationManager。两个API都允许请求单次位置或订阅定期更新。下面是在Android上使用Fused Location Provider以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("位置", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
在示例中,LocationRequest以HIGH_ACCURACY优先级配置——这会启用GPS以获得最高精度。setIntervalMillis设置所需的更新间隔(5秒),setMinUpdateIntervalMillis设置最小间隔(2秒)。onLocationResult回调在系统每次收到新坐标时被调用。在调用requestLocationUpdates之前检查权限很重要——否则应用程序将因SecurityException崩溃。
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// MARK: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
在iOS上,desiredAccuracy决定请求的精度:kCLLocationAccuracyBest使用所有可用来源(GPS + Wi-Fi + 移动网络)。通过requestWhenUseAuthorization请求权限后,系统会向用户显示对话框。委托didUpdateLocations接收包含坐标、海拔、速度和方向的CLLocation对象数组。为停止更新,调用stopUpdatingLocation以节省电池电量。
在两个平台上访问地理定位都需要用户的明确许可。在Android上,使用ACCESS_FINE_LOCATION(GPS)和ACCESS_COARSE_LOCATION(Wi-Fi/移动网络)权限。从Android 10开始,后台访问需要单独的ACCESS_BACKGROUND_LOCATION权限。在iOS上,有三个级别:requestWhenInUseAuthorization(仅在应用程序活动时)、requestAlwaysAuthorization(后台)和精确定位的时间戳。Apple要求在Info.plist中进行强制描述:NSLocationWhenInUseUsageDescription或NSLocationAlwaysAndWhenInUseUsageDescription。没有这些键,权限请求将被忽略。
持续使用GPS会显著降低电池续航——在最高精度下连续工作一小时可降低高达30%。为优化能耗,建议仅在必要时使用地理定位,并在应用程序进入后台时停止更新。在Android上,FusedLocationProviderClient会根据可用性和请求优先级在GPS和网络来源之间自动切换。在iOS上,使用显著位置变化服务(startMonitoringSignificantLocationChanges)以最低能耗进行更新——精度较低(高达500米),但电池几乎不消耗。同时采用批处理:以5-10分钟为间隔收集坐标,并通过Android上的WorkManager或iOS上的BGTaskScheduler通过单个请求发送到服务器。将请求频率从1秒减少到30秒可将地理定位能耗降低85%。
地理定位广泛应用于从导航到配送服务的各类移动应用。最常见的场景包括在地图上显示用户位置、广告地理定向、跟踪快递员、用于推送通知的地理围栏以及健身活动跟踪。每个场景对精度和更新频率有不同的要求。下表针对不同类型的应用提供了配置建议。
| 应用类型 | 精度 | 间隔 | 后台模式 |
|---|---|---|---|
| 导航 | HIGH (GPS) | 1-2秒 | 是 |
| 配送 | BALANCED (GPS+Wi-Fi) | 10-30秒 | 是 |
| 天气 | LOW (Wi-Fi/移动网络) | 单次 | 否 |
| 社交网络 | BALANCED | 打开时 | 否 |
| 健身 | HIGH (GPS) | 5-10秒 | 是 |
在设计地理定位功能时,重要的是要考虑用户可以随时通过系统设置撤销权限。应用程序应正确处理地理定位不可用的情况,并清晰解释功能受限的原因。
Geofencing——一种在地图上创建虚拟边界的技术,当跨越边界时应用程序会收到通知。在Android上,地理围栏通过Google Play Services中的GeofencingClient实现,在iOS上通过Core Location中的CLCircularRegion实现。进入或离开区域时,系统会唤醒应用程序并发送事件,即使应用程序已关闭或最小化。这用于接近商店时的推送通知、基于位置的任务提醒以及物联网设备自动化。地理围栏的最大数量有限:Android上为100,iOS上同时为20。两个平台的最小区域半径为50米,否则系统可能因位置确定误差而无法触发。进入区域时,系统在Android上启动Intent,或在iOS上调用委托locationManager:didEnterRegion。
常见问题
智能手机中的GPS是一个内置的卫星导航系统信号接收器,以3-5米的精度确定坐标。设备上还可使用GLONASS、Galileo和北斗以提高定位精度和速度。
GPS只是确定坐标的卫星方法。地理定位服务结合GPS、Wi-Fi定位和蜂窝基站数据,实现更快、更节能的位置确定,尤其是在室内。
在CLLocationManager实例上调用requestWhenInUseAuthorization()或requestAlwaysAuthorization()。之前需要在Info.plist中添加NSLocationWhenInUseUsageDescription,并附上使用地理定位的原因说明。
在Android上使用FusedLocationProviderClient,在iOS上使用显著位置变化服务。将请求间隔增加到10-30秒,屏幕关闭时禁用更新,并采用批量发送坐标到服务器的方式。
可以,没有GPS时可通过Wi-Fi接入点确定大致位置(精度10-50米)或通过蜂窝基站(精度100-5000米)。在Android上,使用ACCESS_COARSE_LOCATION。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。