最近看了一下iOS系统提供的定位机制。我们现在产品里用的是高德的定位SDK,我们不必接触Core Location的细节,但是高德的SDK毕竟是对Core Location的封装,它势必继承了Core Location的特点和局限,多一些对Core Location机制的了解,能让我们在后续理解处理定位相关功能的时候多一些把握。
Core Location framework提供了两种定位机制,它们各有利弊,我们要根据实际的业务场景,考虑电量消耗和精度等情况,选择合适的实现方案。
下面是对两种机制的简要说明和代码示例:
Standard Location Service
Standard Location Service是苹果提供的最常用的定位获取和位置变化追踪的机制。大部分情况下,我们要获取用户的位置信息都是基于此。它的特点如下:
- 应用能及时的得到位置的更新,定位精度可以控制,特别适合对定位强依赖的应用,比如运动类和导航类功能。
- 可以根据不同的业务场景设置
activityType
属性,系统会以此判断在合适的情况下暂停位置更新。 - 耗电!!!无论参数是怎么配置的,只要Standard Location Service开启,系统就会让定位模块保持供电获取新数据,这会导致应用一直处在高功耗的情况下。
- 可以通过设置
pausesLocationUpdatesAutomatically
标记让应用在后台获取位置,如果应用被杀或者被系统terminated就再也不能获得位置了。 - 提供了一种叫做Deferring Location Updates的延迟处理位置信息的机制,可是被吐槽的比较多,要使用的话得再研究一下。
代码示例
使用Standard Location Service需要创建一个CLLocationManager
对象,根据需要初始化参数desiredAccuracy
和distanceFilter
,同时把要接收位置变化的对象设置为CLLocationManager
的delegate
。
以下是一段开启定位的代码示例:
- (void)startStandardUpdates {
// Create the location manager if this object does not
// already have one.
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
// Set a movement threshold for new events.
locationManager.distanceFilter = 500; // meters
[locationManager startUpdatingLocation];
}
Significant-Change Location Service
Significant-Change Location Service是苹果提供的在位置发生较大变化(500m或者更多)的时候通知应用的机制。该机制的特点如下:
- Significant-Change Location Service会持续运行,至少每隔15分钟会发送一次位置更新的数据,就算用户位置没有发生变化。
- 在应用被终止后,Significant-Change Location Service仍然会在位置变化的时候后台唤起应用通知位置变化。应用在被唤起时只会被分配到10秒钟时间。
- 精度无法选择,可能达不到GPS的精度。
- Background App Refresh关闭时无论在前台还是后台都收不到更新通知。
- (void)startSignificantChangeUpdates {
// Create the location manager if this object does not
// already have one.
if (nil == locationManager)
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
[locationManager startMonitoringSignificantLocationChanges];
}
参考文档
Location and Maps Programming Guide
后台定位上传的代码实践
iOS后台持续定位并定时上传
网友评论