需求
- 用户位置持续在发生变化,则隔一段时间上报一次
- 如果用户移动很慢,则隔一段距离上报一次
- 如果用户的位置在到达某处后没有变化 则不继续上报
- 切换到后台也要能定位上报
- APP因各种原因终止运行后(用户主动关闭, 系统杀掉) 也要能定位上报
实现
项目配置
在target的Capabilities选项中打开Background Modes 并勾选Location updates
然后在plist中添加NSLocationAlawaysUsageDescription的键 在value中随便键入任何内容
完成这两步 我们的前期工作就完成了 Background Modes是iOS7带入的新功能 而NSLocationAlawaysUsageDescription为了增强权限机制引入的提示描述 不添加这个的话定位功能可是使用不了的
代码实现
我们先定义一个CLLocationManager的子类 并根据需求中的几点定义三个变量
以下是部分代码
接下来是初始化函数
demo链接https://github.com/leapCoding/LPLocation.git喜欢的朋友给个星吧,非常感谢
遇到的问题总结
* 应用需要在杀掉的情况下也能定位的话,要用startMonitoringSignificantLocationChanges定位方法。
* 只是在后台定位,用startUpdatingLocation就行,长时间位置不变的话,定位会停止,所以就需要做一些处理,
[startMonitoringSignificantLocationChanges和startUpdatingLocation的区别可看这篇文章](https://leapcoding.github.io/2017/04/01/%E5%90%8E%E5%8F%B0%E5%AE%9A%E4%BD%8D%E5%AE%9E%E7%8E%B0%E6%96%B9%E6%A1%88/)
以下是自己能想到的一些解决方案,可能还有我没想到的
1. 使用静默推送,服务定时向APP端发送通知开启定位。
2. 网上很多神人说用 VoIP + 播放无声音频的方式让app常驻后台
3. 使用定时器不停的请求后台任务
注意事项
后台定位开启有被拒的风险,当然你要有足够的理由让苹果通过你的应用,功能上也要尽量体现出你的APP是 需要用到后台定位的,描述时也要说明后台定位的问题
尽量给用户也要说明
例如滴滴
【温馨提示】
滴滴出行产品在使用过程中会持续使用GPS定位服务,切换至后台时,部分情况下仍会继续,例如共享位置时,相比其他操作会消耗更多电量,并影响电池续航时间。
Continued use of GPS running in the background can dramatically decrease battery life。