后台定位实现步骤:(涉及类CLLocationManager)
1.使用API:-requestAlwaysAuthorization(支持iOS8.0以上)发起申请后台定位权限
2.设置属性allowsBackgroundLocationUpdates=YES(支持iOS9.0以上)(没设置的话,app进入后台后定位功能就停止了!)
3.使用API:-startUpdatingLocation发起定位更新,在定位成功后在回调- locationManager:didUpdateLocations(支持iOS6.0以上)的参数locations中获取定位信息(包裹在CLLocation的对象中,如精确的经纬度),如果需要详细的经纬度信息需要使用CLGeocoder的对象做一次翻译就可以得到详细的城市街道等定位信息了,相对应的使用API:-stopUpdatingLocation就可以停止定位更新了。
注意:系统会根据属性distanceFilter的值多次触发回调,可以理解为移动多少距离触发一次回调,系统提供的一个值kCLDistanceFilterNone表示即使不移动也会隔几秒触发一次回调,如果想至此发一次定位回调可以使用-requestLocation(支持iOS9.0以上)发起一次定位
4.在info.plist中添加以NSLocationAlwaysUsageDescription为key的申请权限的文案说明,这个文案会在第一次安装app时会弹出,也可以在设置->app->位置中查看到
注意:iOS11中还需要分别添加以NSLocationAlwaysUsageDescription和NSLocationAlwaysAndWhenInUseUsageDescription为key的申请权限文案说明,不添加的话无法向用户申请定位权限,貌似在iOS11中API:-requestAlwaysAuthorization是申请所有类型定位的统一接口
5.在target->capabilities中打开Background Modes,并勾选上Location updates
A8AFA04B-48E1-46AB-86B5-529F5BB132A6.png
后台定位是app在进入后台后仍然可以更新用户定位信息,甚至可以通过接口做定位信息的上报,但是在以下情况下更新定位信息的功能就会停止:
1.iOS系统因为资源问题导致APP terminated
2.用户主动去杀进程导致APP terminated
风险:
1.这种定位使用的是GPS定位,定位精度比较准备,相对于的对电池的消耗会比较大,推荐在app进入后台后通过设置属性desiredAccuracy来降低定位精度,
2.苹果对使用了后台定位的app审核比较严格,因为涉及到用户隐私,所以在需要在下面两个地方详细描述后台定位目的,
2.1 app审核资料中app的描述说明
2.2 申请定位权限的文案说明
注意:即使定位目的写的很详细,被拒的可能性还是很大。
demo见:LYLocation
参考文章:
网友评论
{
self.locationManger.showsBackgroundLocationIndicator = YES;
}
YES改为NO还好用吗?我项目需要几十天几十天的运行。你这个方法有这样测试过吗?