改进版Location持续后台定位
在日常应用中,经常有需要使用到定位功能,用来判断用户的位置,并且做个性化的设定,或者获取用户位置,做数据分析等其他功能。
定位功能位于iOS的CoreLocation中,无论使用原生还是第三方定位,都需要手动或者第三方自动引入该定位框架。使用原生定位功能可以参考下面的文章,这是链接。
这里我们使用github上的一个第三方定位,可以持续定位并上传用户位置信息到服务器。
1、原始Location定位github地址
2、从上面的地址中下载代码,然后使用xcode打开,运行项目,就可以看到定位的效果,项目每隔60秒会上传定位信息到服务器,每隔10秒停止定位服务,每隔60秒会重启定位服务,上面的时间都是从0开始计时,也就是第一次开启定位后,过10秒会停止定位服务,获取的定位信息会通过精度(accuracy)比较获取最佳的定位信息,如果没有获取,就选择上一次定位的,10秒后停止定位服务,再过50秒会去重启定位服务,同时将获取的最佳定位信息上传到服务器。

上面的第三方库主要有下面几个问题:
1)上传服务器的代码需要写在这个第三方库中,侵入性比较强。
2)获取到的只有经纬度和定位精度信息,(图中看到的地址信息是改进的版本)
3)可以配置的属性比较少,比如上传服务器的时间间隔,定位的时间间隔,
改进后的Location的地址:github地址
1、改进后主要使用block的方式用来上传定位信息,现在可以更加方便的定制需要上传的服务器的信息,如用户信息
2、使用方法,将文件复制在项目中,在你需要持续定位的位置使用下面的代码, 一般是appdelegate的didFinish代理方法中,也就是程序启动后开启定位。
// 获取位置信息后,隔10秒会关闭位置服务,50秒会重启定位服务(这个期间定位服务不会重启),同时会上传位置信息
self.locationTracker = [[LocationTracker alloc] init];
self.locationTracker.uploadLocationTimeInterval = 60.0; // 这个要大于50秒,不然会有失效的情况
[self.locationTracker startLocationTracking];
self.locationTracker.upLoadBlock = ^(CLPlacemark *placemark){
// 城市名称
NSString *city = placemark.locality;
// 街道名称
NSString *street = placemark.thoroughfare;
// 全称
NSString *name = placemark.name;
NSLog(@"city:%@, street:%@, name:%@", city, street, name);
};
3、除了上面的代码,还需要在项目中加入一下配置和一些注意事项
- 在项目的Capabilities中Background Modes中开启Location updates和Background fetch

- 自iOS8起,系统定位功能进行了升级,开发者在使用定位功能之前,需要在info.plist里添加(以下二选一,两个都添加默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription ,允许在前台使用时获取GPS的描述
NSLocationAlwaysUsageDescription ,允许永久使用GPS的描述

3)模拟器中的debug-->Location中选择定位的位置,可以自己定义

这个改进版还在进行中,可能会存在一些问题,持续改善中。