iOS 后台持续定位

2019-05-15  本文已影响0人  青年别来无恙

前言

前文讲到程序推到后台的运行情况iOS 对APP推到后台运行时长的探究,主要还是想做个后台定位,希望APP在按下home键退到后台时持续获取位置信息。

实现方案

本文根据位置权限做了两种状态的定位效果。
1、使用应用期间
2、始终
3、永不(就是不开启定位权限这个不用讨论)

一、使用应用期间

用户选择了使用应用期间,表明程序在前台工作时可以正常获取定位信息。一但推到后台则可能获取不到(为什么说可能:因为持续定位可以一直获取)。但是在后台一旦关闭了定位,就在后台重新开启了,以为程序处于后台获取不到定位权限!!!
处于后台:选择使用应用期间的权限需要一直保持定位状态,才可以持续获取用户位置信息,一旦关闭则开启不了

二、始终

选择始终就会一直拥有定位权限,想什么时候获取就什么时候获取。
注意:这里可以做一些骚操作
当用户选择了始终,那么我们可以设置定位的时间段,比如多久开启一次定位多久关闭一次定位,这样一来就可以节省部分电量。

三、代码实现

1、plist文件加入权限


屏幕快照 2019-05-15 下午5.54.52.png

2、设置Background Modes


屏幕快照 2019-05-15 下午5.56.13.png

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(@"定位+++++++");
}
上一篇 下一篇

猜你喜欢

热点阅读