通过翻阅了各种官方文档和资料,总结结果如下:
实现后台定位有两种方法
standard location service(调用CLLoctionManager的StartUpdateLocation)
significant-change location service(调用CLLocationManager 的startMonitoringSignificantLocationChanges)
两者区别
- startUpdatingLocation)是标准定位,想要在后台使用必须在info.plist文件中增加Required background modes属性,并选择App registers for location updates值。
- startUpdatingLocation)在后台运行时可能会因为资源问题被系统挂起(suspend)或终止(terminate),但一旦有更新会被唤起,但是当更新时系统任然资源紧张,则会被延迟调用委托。如果对于实时性要求高的可能不适合这个,很难控制用户机器性能状况。
- startUpdatingLocation)如果被用户手动关闭,就不会再被唤醒。定位基于gps/基站/wifi定位,具体使用哪一种CoreLocation框架有一套自己的规则。
- startMonitoringSignificantLocationChanges)是使用基站定位的,所以设备一定要有电话模块,在plist中可以设置xx属性来限制可被下载安装的设备。
- startMonitoringSignificantLocationChanges)不管是在后台还是用户手动关闭都会被唤醒调用委托,只有3种方法可以阻止它的更新。(1)用户关闭定位服务(2)用户关闭对该app的定位服务(3)设备处于飞行模式或者无法开启必要的硬件(猜测是定位模块的硬件)。
- startMonitoringSignificantLocationChanges)什么时候更新呢?是在更换基站的时候更新。所以更新频率与基站密度有关。市区更新频率较郊区高。所以很多同学说没有更新是因为还在同一组基站范围内。
两者共性:
两者都更新位置信息时都回调相同的委托方法:-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
上传信息
由于后台任务只分配了有限时间执行必要的操作,所以如果在超时之前未完成(比如网络请求),app将会被终止。这里有一个方法,可以申请额外的10分钟让你执行想要的操作,申请后台任务:beginBackgroundTaskWithExpirationHandler(不详细说了,使用方法可以查一下资料)。
注意事项
提交审核时一定让苹果感觉你有必要使用后台定
位,而不是偷偷地把定位点发给服务器,其他的啥界面啥功能都没有,增加轨迹(学跑步软件),增加列表显示定位数据(学红圈营销),增加导航也可以,有界面和功能让苹果感觉你真的需要使用后台定位功能,提交的时候一定要告诉苹果那个功能使用了后台定位,这样才不容易被拒绝。