首先贴出 官方文档:https://developer.apple.com/documentation/corelocation/choosing_the_location_services_authorization_to_request 详细介绍了如何确定你需要申请的Location权限。
定位的权限申请
在iOS14中,使用用户Gps信息,需要申请权限。申请的权限分为2种。
When In Use
Always
When In Use提示界面如下:
Always 的申请方式有2种,提示界面也稍有不同,
第一种是先成功申请到了 When In Use,之后使用requestAlwaysAuthorization申请always,弹出如下界面:
第二种是直接使用requestAlwaysAuthorization,但是程序弹出的界面还是When In Use的界面,如果用户允许了,当系统第一次在后台向app发送gps信息时,会自动弹出第二个授权界面:
这2种权限的最大不同在于,当app被kill掉后,Always权限能够让系统在后台自动启动被kill掉的程序,运行相应的代码。对于个人隐私来说,这是一个十分危险的选项!为了应对这个隐私安全问题,iOS会定期弹出通知,提醒你这个程序又在后台使用了你的位置,起到了一定的安全作用,如下图:
在background模式下获取location
无论是 When In Use 还是 Always 权限,只要不kill掉app,app都可以在后台持续收集gps信息。
要开启后台模式,首先开启Location update的 backgroud mode ,如图:
再设置 allowsBackgroundLocationUpdates = true,就能在程序进入backend后,继续跟踪用户的坐标信息。
如果想更加明确地告知用户正在使用后台定位,可以设置
locationManager.showsBackgroundLocationIndicator = true
这样在status bar左上会显示蓝色定位图标,表示正在后台使用导航定位。如图:
如需要关闭后台定位,只需要设置 allowsBackgroundLocationUpdates = false
,这样程序进入后台,也不会取定位信息了。
定位精确度和耗电
location的精确度和耗电息息相关,越精确越耗电。通过 locationManager.desiredAccuracy
可以设定精确度。
精确度从高到低依次为:
public let kCLLocationAccuracyBestForNavigation: CLLocationAccuracy //导航应用使用
public let kCLLocationAccuracyBest: CLLocationAccuracy //iOS 默认值
public let kCLLocationAccuracyNearestTenMeters: CLLocationAccuracy
public let kCLLocationAccuracyHundredMeters: CLLocationAccuracy
public let kCLLocationAccuracyKilometer: CLLocationAccuracy
public let kCLLocationAccuracyThreeKilometers: CLLocationAccuracy
public let kCLLocationAccuracyReduced: CLLocationAccuracy // 最不精确,不精确范围在1-20km之间
选择合适的精确度,可以大幅降低电池的消耗。