iOS 封装一个百度地图的定位类 可以持续后台定位

此处有BUG

适合新手,大牛路过请无视。

开始了

如果你是新手,对定位类不是很懂,或者公司要求接百度地图API。
哎呀!还是不做废话了。首先我们集成通过CocoaPods集成百度地图如果对CocoaPods还不了解推荐看一遍就会的CocoaPods的安装和使用教程或者你想直接看iOS百度地图配置

进行中

那么我开始简单的介绍一下吧
首先你要简单配置一下
如果要使用在前台定位 添加Privacy - Location When In Use Usage Description
如果要在后台使用 添加Privacy - Location Always Usage Description
建议两个都添加在plist文件里面


plist文件配置.png
#import <Foundation/Foundation.h>

@import CoreLocation;
@interface YZLocationManager : NSObject

//是否开启后台定位 默认为NO
@property (nonatomic, assign) BOOL isBackGroundLocation;

//isBackGroudLocation为YES时,设置LocationInterval默认为1分钟
@property (nonatomic, assign) NSTimeInterval locationInterval;

//后台定位开启时 返回定位经纬度
@property (nonatomic, copy) void (^YZBackGroundLocationHander) (CLLocationCoordinate2D coordinate);

//后台定位开启时 返回反编码地理位置
@property (nonatomic, copy) void (^YZBackGroundGeocderAddressHander) (NSString *address);

//获取经纬度
@property (nonatomic, copy) void (^YZLocationCoordinate) (CLLocationCoordinate2D coordinate, NSError *error);

//获取反编码地理位置
@property (nonatomic, copy) void (^YZLocationGeocderAddress) (NSString *address, NSUInteger error);

//最近一次定位的经纬度
@property (nonatomic, readonly) CLLocationCoordinate2D lastCoordinate;

//最近一次反编码地理位置
@property (nonatomic, copy, readonly) NSString *lastGeocoderAddress;
//通过单例创建
+ (YZLocationManager *)sharedLocationManager;

//获取经纬度和反编码地理位置
- (void)receiveCoorinate:(void (^)(CLLocationCoordinate2D coordinate, NSError *error))coordinateHander geocderAddress:(void (^)(NSString *address, NSUInteger error))addressHander;

//传入经纬度获取反编码地理位置
- (void)geoCodeSearchWithCoorinate:(CLLocationCoordinate2D)coordinate address:(void (^)(NSString *address, NSUInteger error))address;

//开始定位
- (void)startLocationService;

//停止定位
- (void)stopLocationService;

@end

这是.h文件 定义了几个block
如果你创建是一个单例类 那么要注意在多个页面使用到时这些属性已最后一次赋值为准,如果同一个页面多处要求同时定位,本类或许将不适用。
如果你要使用持续后台定位,我们还要进一步配置

持续后台定位配置.png

在配置完之后使用的时候要注意,关于一些后台定位的配置都需要

isBackGroundLocation为YES的时候才能设置

iOS8进入后台的时候需要配置requestAlwaysAuthorization否则在顶部将会显示一个蓝条以上都配置好了就可以使用了 由于使用的百度地图,百度地图定位间隔的API没有公开经过测试大概是30秒,这30秒正常可以满足大多数需求 如果这里有想要
系统自带的持续定位的那么你可以看看这个

注意

如果你想审核的时候不被拒,在App介绍里面的加上一句话让用户看到(例句):

使用“打卡”应用点击上班签到后将开启轨迹定位功能,会持续使用GPS定位服务,切换到后台仍会保存GPS连接,相比其他操作会消耗更多的电量。
GPS在后台持续运行会影响电池续航时间

简单的例子来一个,其它用法你们可以自己看下源码的注释

    YZLocationManager *manager = [YZLocationManager sharedLocationManager];
    manager.isBackGroundLocation = YES;
    manager.locationInterval = 10;
//    @weakify(manager)
    [manager setYZBackGroundLocationHander:^(CLLocationCoordinate2D coordinate) {
        _plc(coordinate);
        YZLMLOG(@">>>>>>>>>>>>>%f,,%f",coordinate.latitude,coordinate.longitude);
//        @strongify(manager) //注意别造成循环引用
//        [manager geoCodeSearchWithCoorinate:coordinate address:^(NSString *address, NSUInteger error) {
//            YZLMLOG(@">>>>>>>>>>address:%@",address);
//        }];
        NSDictionary *dic = @{
                              @"time":self.dateString,
                              @"coordinate":[NSString stringWithFormat:@"%f,%f",coordinate.latitude,coordinate.longitude]
                              };
        [self.dataSouce addObject:dic];
        [self.tableView reloadData];
    }];
    
    [manager setYZBackGroundGeocderAddressHander:^(NSString *address) {
        YZLMLOG(@">>>>>>>>>>address:%@",address);
    }];
    [manager startLocationService];

结束了

多的不说了,例子什么的都在源码里面了,哪里写的有问题的地方可以提出来以便楼主进行修改。觉得楼主写的好的请给颗star。
源码地址:GitHub

推荐阅读更多精彩内容