美文网首页常看项目实用后台定位
iOS 封装一个百度地图的定位类 可以持续后台定位

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

作者: 巨蟹座的程序员 | 来源:发表于2017-02-21 18:58 被阅读3472次

    此处有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

    相关文章

      网友评论

      • 二进制人类:凉了该更新咯
      • 饥人谷_张炜:楼主在么? 我也是用百度SDK遇到一个问题 可以加你的qq请教下么? 504951293 谢谢了
      • Janine_:我是接收的别人的项目,这个项目上次更新是在16年,结果拿过来各种各样的小问题。坑惨了,之前App Store上的地图定位能成功,他发过来的源码死活不行,找了好久,才发现Capibilities下的Location updates没勾上。
      • 69460a5b1394:楼主,我想让程序在前台不定位,只在后台定位,应该怎么修改
      • 知了此生:楼主,下载了你的工程发现没有.mm文件,这不是百度地图要求的吗?你为什么没有设置.mm 呢?我使用了楼主的文件,发现如果修改为.mm文件,都会报错,不知楼主是怎么处理的
        好棒大大:定位怎么会偏那么多 开车的时候
        知了此生:@巨蟹座的程序员 好的
        巨蟹座的程序员:@知了此生 具体内容参考下官方的文档
      • __西门吹雪:亲。就是我定位成功后。手机放你那儿不动。但是定位点来回跳动,放哪儿不动也跳动。如何控制?不能关闭定位,因为是显示地图图层的。关闭了。移动地图就不能定位了。
        巨蟹座的程序员:@__西门吹雪 这是手机的定位, 自己判断让它不跳
      • 走停2015_iOS开发: YZLocationManager *manager = [YZLocationManager sharedLocationManager];
        manager.isBackGroundLocation = NO;
        manager.locationInterval = 10;
        设置为不支持后台定位,就是进入后台不返回经纬度而已,为什么NSAssert会拦截到crash呢????
        还有就是如果设置为NO或者默认的话,这里直接返回了 失去了持续定位的功能 谢谢楼主
        (void)setYZBackGroundLocationHander:(void (^)(CLLocationCoordinate2D))YZBackGroundLocationHander{
        if (!self.isBackGroundLocation) { //如果 isBackGroundLocation为NO 后台定位将无效
        return;
        }
        _YZBackGroundLocationHander = [YZBackGroundLocationHander copy];
        }
      • 走停2015_iOS开发:楼主 你好,首先我看了一下代码 感觉是花了点时间 但是我有些地方的不敢苟同 希望和楼主沟通一下
      • dc480ae00a31:@import CoreLocation; 这个报错如何纠正请问
        dc480ae00a31:@巨蟹座的程序员 感谢已经解决
        巨蟹座的程序员:可以用#import的方式导入CoreLocation
      • b4067f4d3883:你好,我试了下当进入后台,启动定位,在didUpdateLocation的代理方法里就可以实现定时上传地址,你的manager类具体是干什么的,怎么判断后台任务过期的。水平有限,问的问题可能不好理解,见谅。
        b4067f4d3883:@巨蟹座的程序员 我试了,在代理方法里设了个定时器打印,退到后台打印了30分钟
        巨蟹座的程序员: @yuanyi__ 你可以试一下
        巨蟹座的程序员: @yuanyi__ 系统有三分钟的时间让你处理未处理完的事,3分钟之后就停了
      • b4067f4d3883:你好,我看你使用定时器设置后台刷新时间,我查了下有一个方法setMinimumBackgroundFetchInterval 设置,这个有区别么?
        巨蟹座的程序员:@yuanyi__ 系统的可以设置时间,百度的是封装系统的,暂时没有公开定位间隔的API
        b4067f4d3883:@巨蟹座的程序员 刚知道,这个只能规定在这段时间不刷新。我看了你的源码,你是每隔20上传一次定位信息,我想知道系统是多久定一次位,可以修改么?
        巨蟹座的程序员:对setMinimumBackgroundFetchInterval这个还没怎么研究测试过,不好说
      • b4067f4d3883:请问如何实现在isBackGroundLocation为YES时通过代码修改后台定位的配置
        巨蟹座的程序员:@yuanyi__ 你可以看下源码,里面有一个isBackGroundLocation的set方法在里面做了一些配置
        b4067f4d3883:@巨蟹座的程序员 我看你文章说在为Yes的时候才可以开启后台运行的配置(project中location update),我想知道在改为Yes以后你是怎么通过代码把Location update打开的
        巨蟹座的程序员:您想要做怎样的配置呢?
      • 二进制人类:怎样在地图上显示呢?怎样和地图联系起来呢?
        二进制人类:@巨蟹座的程序员 BMKUserLocation 里有updating location heading title subtitle属性
        二进制人类:@巨蟹座的程序员 block里反的是CLLocationCoordinate2D 这个方法是BMKUserLocation
        巨蟹座的程序员:你可以在获取定位后 更新一下地图上的位置信息
        -(void)updateLocationData:(BMKUserLocation*)userLocation;
      • 语安月月鸟:请问楼主bug是什么啊
        语安月月鸟:@巨蟹座的程序员 对了楼主,请问如果不想后台定位应该怎么使用呢?
        语安月月鸟:@巨蟹座的程序员 哈哈:smile:
        巨蟹座的程序员:不适合那些很厉害的人(大牛):stuck_out_tongue_winking_eye:
      • 清水一心:不错,值得收藏:+1:

      本文标题:iOS 封装一个百度地图的定位类 可以持续后台定位

      本文链接:https://www.haomeiwen.com/subject/vvofwttx.html