高德地图持续定位与单次定位简谈(持续更新)

概述

高德 iOS 定位 SDK 提供了不依赖于地图定位的定位功能,开发者可以无地图显示的场景中便捷地为应用程序添加定位功能。iOS定位SDK提供了单次定位、连续定位、逆地理信息、地理围栏等功能
关于定位的一些环境配置自行参考高德定位 这篇文章就不多讨论了,只奔主题


单次定位与持续定位

1.单次定位,顾名思义,就是只执行一次的定位.高德的API并不会持续更新您的位置信息,只有在您调用的时候查询您此时位置的经纬度信息和逆地理编码信息

1.头文件引入
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
2.高德地图key配置
[AMapServices sharedServices].apiKey =@"您的key"; //需要您在appDelegate中配置
3.定位配置
 #pragma - mark 高德地图单次定位
- (void)configLocationManager{
    self.locationManager = [[AMapLocationManager alloc] init];
    [self.locationManager setDelegate:self];
    //设置期望定位精度
    注意:高德提供了 kCLLocationAccuracyBest 参数,设置该参数可以获取到精度在10m左右的定位结果,但是相应的需要付出比较长的时间(10s左右),越高的精度需要持续定位时间越长
    [self.locationManager setDesiredAccuracy:kCLLocationAccuracyHundredMeters];
    //设置不允许系统暂停定位
    [self.locationManager setPausesLocationUpdatesAutomatically:NO];
    //设置定位超时时间
    [self.locationManager setLocationTimeout:DefaultLocationTimeout];
    //设置逆地理超时时间
    [self.locationManager setReGeocodeTimeout:DefaultReGeocodeTimeout];
}
4.在下面方法中请求
注意:若您配置了持续定位,单次定位的方法就不会再调用了
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {        
        if (error)
        {
            NSLog(@"locError:{%ld - %@};", (long)error.code, error.localizedDescription);            
            if (error.code == AMapLocationErrorLocateFailed)
            {
                return;
            }
        }        
        NSLog(@"location:%@", location);        
        if (regeocode)
        {
            NSLog(@"reGeocode:%@", regeocode);
        }
    }];
细节说明:您在WIFI下的定位的位置会和您在移动网络下定位的位置信息有偏差!!!,这点很重要
  
1)我的手机定位为什么有时候会不准确? 
一方面,网络定位依赖于周边监测到的基站和wifi信息,而这些信息有受各种因素的影响发生变化或者采集有误,导致定位的偏差。
另一方面,定位本身也有一定精度范围随机误差,从几十米到上公里都是正常的情况,所以有时候看到定位结果有一定偏差,这也是为什么有时候您会看到您的位置并没有变化,但是定位位置却总在小范围的跳动的原因。
如果使用GPS定位,相对来说是定位比较精确的方式,但受限制一般只能在室外使用,且卫星信号容易受气象,遮挡等因素影响,而且手机自身GPS芯片的质量,也会对最终定位的的精准度有直接的影响。
        

2.持续定位,你可以在app启动期间不断的监控此刻使用者的位置,那么如何使用呢?
参考如下

1.头文件引入
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <AMapLocationKit/AMapLocationKit.h>
2.高德地图key配置
[AMapServices sharedServices].apiKey =@"您的key"; //需要您在appDelegate中配置
3.持续定位配置
- (void)configLocationManager{
    self.locationManager = [[AMapLocationManager alloc] init];
    [self.locationManager setDelegate:self];
    //设置不允许系统暂停定位--------这些话加上就会后台定位,就会出现您将程序进入后台,但是会在屏幕顶部出现小蓝条的现象
//    [self.locationManager setPausesLocationUpdatesAutomatically:NO];
    //iOS 9(不包含iOS 9) 之前设置允许后台定位参数,保持不会被系统挂起
//    [self.locationManager setPausesLocationUpdatesAutomatically:NO];
//    //iOS 9(包含iOS 9)之后新特性:将允许出现这种场景,同一app中多个locationmanager:一些只能在前台定位,另一些可在后台定位,并可随时禁止其后台定位。
//    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
//        self.locationManager.allowsBackgroundLocationUpdates = YES;
//    }
    //设置定位超时时间
    [self.locationManager setLocationTimeout:DefaultLocationTimeout];
    //设置逆地理超时时间
    [self.locationManager setReGeocodeTimeout:DefaultReGeocodeTimeout];
    self.locationManager.distanceFilter = 200;//设置定位精度200米 200米去查询一次
    self.locationManager.locatingWithReGeocode = YES;//   
}
//仅供参考
- (void)amapLocationManager:(AMapLocationManager *)manager didUpdateLocation:(CLLocation *)location reGeocode:(AMapLocationReGeocode *)reGeocode{
    GSNSLog(@"0000000000-------------------reGeocode:%@", reGeocode);
    GSNSLog(@"0000000000-------------------location:%@", location);
    if (location) {//当定位成功的情况
        self.errorView.hidden = YES;
        if (reGeocode) {//当逆地理编码查询到的时候
            CGFloat longitude = location.coordinate.longitude;
            CGFloat latitude = location.coordinate.latitude;
            NSString *province = reGeocode.province;
            NSString *citycode = reGeocode.citycode;
            NSString *adcode = reGeocode.adcode;
            NSString *city = reGeocode.city;
            NSString *district = reGeocode.district;
            NSString *address = reGeocode.formattedAddress;
            
            //放在模型里 存储经纬度和逆地理编码
            self.currentLocationModel.longitude = longitude;
            self.currentLocationModel.latitude = latitude;
            self.currentLocationModel.province = province;
            self.currentLocationModel.citycode = citycode;
            self.currentLocationModel.adcode = adcode;
            self.currentLocationModel.city = city;
            self.currentLocationModel.district = district;
            self.currentLocationModel.detailAddress = address;
            if (self.firstLocationFlag == YES) {//当是第一次加载的情况
                //记录首次加载
                [self.locationBtn setTitle:city forState:UIControlStateNormal];
                [self.listTableView.mj_header beginRefreshing];
                self.firstLocationFlag = NO;
            }else{//若非首次加载的话 需要判断上次加载的城市是否发生了改变
                GSNSLog(@"上次加载的城市self.regecode.city%@",self.regecode.city);
                GSNSLog(@"此次定位的城市reGeocode.city%@",reGeocode.city);
                 if (![reGeocode.city isEqualToString:self.regecode.city]) {//当城市发生改变的时候 弹窗提示
                        [self createAlertViewWithReGeocode:reGeocode andLocation:location];
                  }

            }
             self.regecode = reGeocode;
            
        }else{//没查到不做任何事情
            
        }
    }else{
        [CSToast showWithText:@"定位失败"];
        [self.locationBtn setTitle:@"定位失败" forState:UIControlStateNormal];
    }
   
}
//选择性添加,是否监听进入后台或者从后台进入前台是否重新开启或者关闭持续定位
- (void)addNotifacations{
    //MARK:监听进入前后台
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationBecomeActive) name:UIApplicationWillEnterForegroundNotification object:nil];//监听进入前台
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil];//从活动状态过度到不活动状态
}
- (void)applicationBecomeActive{//后台到前台要开启持续定位
    [self.locationManager startUpdatingLocation];
    }
- (void)applicationWillResignActive{//变成不活跃状态关闭定位 省电
    [self.locationManager stopUpdatingLocation];
}


注意:
1.持续定位后单次定位方法不生效
2.持续定位开启后,push到其他页面持续定位是不关闭的,需要你手动关闭
3.手动关闭持续定位后,单次定位依旧可以使用
            
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,103评论 4 62
  • 共享单车的火爆为地图类应用带来了崭新的使用场景,百度地图抓住时机地增加了共享单车的功能入口,同时新增了“地铁+共享...
    baolvlv阅读 21,739评论 4 118
  • 中午睡觉醒来,浑身酸疼,身体不适,便无比想念亲人。翻开手机给妈妈拨通了电话……想着要和妈妈说的话,酝酿着自己的语...
    Emma宁阅读 249评论 0 0
  • 曲:苏一 《今生情可鉴》 词:深海的记忆 春雨润青山,君临城郊南。 溪水潺潺逗江船 繁花落 游人恋 此处应是武陵源...
    向史而新阅读 262评论 0 4
  • 现在学校里都实行积分奖罚制,小家伙对每天领积分也是兴致勃勃的!但是到我这,每天的奖章换大奖好像并没有那么诱人...
    感恩_bcaa阅读 300评论 0 0