前言
前文讲到程序推到后台的运行情况iOS 对APP推到后台运行时长的探究,主要还是想做个后台定位,希望APP在按下home键退到后台时持续获取位置信息。
实现方案
本文根据位置权限做了两种状态的定位效果。
1、使用应用期间
2、始终
3、永不(就是不开启定位权限这个不用讨论)
一、使用应用期间
用户选择了使用应用期间,表明程序在前台工作时可以正常获取定位信息。一但推到后台则可能获取不到(为什么说可能:因为持续定位可以一直获取)。但是在后台一旦关闭了定位,就在后台重新开启了,以为程序处于后台获取不到定位权限!!!
处于后台:选择使用应用期间的权限需要一直保持定位状态,才可以持续获取用户位置信息,一旦关闭则开启不了
二、始终
选择始终就会一直拥有定位权限,想什么时候获取就什么时候获取。
注意:这里可以做一些骚操作
当用户选择了始终,那么我们可以设置定位的时间段,比如多久开启一次定位多久关闭一次定位,这样一来就可以节省部分电量。
三、代码实现
1、plist文件加入权限

2、设置Background Modes

3、代码
- (void)BMKLocationManager:(BMKLocationManager * _Nonnull)manager didUpdateLocation:(BMKLocation * _Nullable)location orError:(NSError * _Nullable)error {
//到设定时间自动关闭
if ([self isTimeStopLocation]) {
[self stopLocation];
return;
}
if (error) {
//如果定位失败自动到缓存里面取上次的定位信息
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"DKLOCATION"];
self.dkLocation = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if (self.updateLocationBlock) {
self.updateLocationBlock(self.dkLocation);
}
return;
}
//只在设置权限为始终的时候设置时间间隔
if (self.locationStatus == DKLocationAuthorizationStatusStatusAlways) {
if (self.isCollectLocation) {
return;
}
[self performSelector:@selector(startLocation) withObject:nil afterDelay:self.updateTime];
[self performSelector:@selector(pauseLocation) withObject:nil afterDelay:5];
self.isCollectLocation = YES;
}
self.dkLocation.latitude = location.location.coordinate.latitude;
self.dkLocation.longitude = location.location.coordinate.longitude;
if (location.rgcData) {
self.dkLocation.locationAddress = [NSString stringWithFormat:@"%@%@%@%@",location.rgcData.city,location.rgcData.district,location.rgcData.street,location.rgcData.streetNumber];
}
if (self.dkLocation) {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.dkLocation];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"DKLOCATION"];
}
if (self.updateLocationBlock) {
self.updateLocationBlock(self.dkLocation);
}
NSLog(@"定位+++++++");
}
网友评论