后台运行模式有很多种方法,合法的方法都在 ’Signing & Capabilities‘中,最近用到了 Location updates 在后台模式的运行,特做此总结。
CLLocationManager 类是处理定位更新相关的api,allowsBackgroundLocationUpdates这个属性默认是NO,代表禁用后台定位刷新。如果需要保持后台活跃,则需要给它设置成YES,前提是Background modes 中,勾选Location updates,才会有效。
requestAlwaysAuthorization 和 requestWhenInUseAuthorization。
如过想要保持后台定位活跃,以上两个方法都可以。不用担心WhenInUse代表的是前台时才会有效,因为后台活跃是由allowsBackgroundLocationUpdates决定的。
那二者的区别是什么?
Always代表不管APP有没有被用户kill掉,前台还是后台,只要是满足了位置更新条件,都会主动拉起APP。这会导致APP持续耗电。除非特殊场景,一般很不建议使用。不会有蓝色提示条。
而WhenInUse,当被用户kill掉后,是不会有主动拉起APP的操作的。而且基本能满足大部分的定位需求。会有蓝色提示条。
除此之外,要保持后台活跃,并不需要设置任何其他东西,比如Background Tasks和Downloading。
pausesLocationUpdatesAutomatically
这个属性的大致的意思就是, 如果这个属性设置成YES(默认的也是YES),那么系统会检测如果设备有一段时间没有移动,就会自动停掉位置更新服务。这里需要注意的是,一旦定位服务停止了,只有当用户再次开启App的时候定位服务才会重新启动。
这里的一段时间是系统自动判定的,可以通过设置activityTypeproperty这个属性来决定这个时间的长短。
API的意思是,类似导航类的App,系统检验的时间会稍长一点,想运动类的App,就会比导航类的短一点。但是具体时间还是由系统来决定。
所以,这个属性会带来一些后台自动停止的隐患,我的建议是,可以把它设置为NO,自己在代码里通过位置信息条件判断是否应该停止(比如判断速度几分钟内都小于某个值),一个是防止自动停止,一个是防止用户忘记关闭。
网友评论