需求:要求APP定时向服务器上传自己的位置
1.配置
1.1 将Capablities中的BackgroundMode勾选未ON 并且勾选其中的Location updates选项
1.2 权限设置
Privacy - Location When In Use Usage Description
Privacy - Location Always Usage Description
2. 初始化
导入 #import <CoreLocation/CoreLocation.h>
_lcManager = [[CLLocationManager alloc] init];
_lcManager.delegate = self;
_lcManager.desiredAccuracy = kCLLocationAccuracyBest;
_lcManager.pausesLocationUpdatesAutomatically = NO;
这里后台保持持续定位有两种方式
第一种
if ([_lcManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[_lcManager setAllowsBackgroundLocationUpdates:YES];
}
直接设置这个就可以实现后台定位 但是有个缺点 app进入后台后会有一个蓝色状态条
第二种
判断权限
if ([_lcManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[_lcManager requestAlwaysAuthorization];
[_lcManager requestWhenInUseAuthorization];
}
- (void)requestAlwaysAuthorization // 总是给予授权
- (void)requestWhenInUseAuthorization; // 在前台才定位
这个在iOS11之后要求添加Privacy - Location Always and When In Use Usage Description权限
否则进入后台后就不定位了
3. 代理方法
默认每秒定位一次
也就是每秒调用一次
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
定位成功
@param manager <#manager description#>
@param locations <#locations description#>
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
CLLocation *location = [locations lastObject];
double lat = location.coordinate.latitude;
double lng = location.coordinate.longitude;
NSLog(@"------lat:%f, ------lng:%f", lat, lng);
if (!self.deferringUpdates) {
[_lcManager allowDeferredLocationUpdatesUntilTraveled:500 timeout:10];
self.deferringUpdates = YES;
}
}
/**
定位失败
@param manager <#manager description#>
@param error <#error description#>
*/
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
self.deferringUpdates = NO;
}