美文网首页iOS大咖说
iOS开发中通过定位获取用户所在省、市、区、街道、地址、具体位置

iOS开发中通过定位获取用户所在省、市、区、街道、地址、具体位置

作者: 梁森的简书 | 来源:发表于2019-03-06 14:02 被阅读117次

    这里以百度地图代码为例来进行说明
    首先是进行定位,代码:

      [self.locService startUserLocationService];
    

    self.locService是BMKLocationService类对象,调用该对象的startUserLocationService方法即可进行定位。

    注意:无网络情况下是无法实现定位的。

    定位成功之后会有一个回调的代理方法:

      #pragma mark - BMKLocationServiceDelegate
      //处理位置坐标更新
      - (void)didUpdateBMKUserLocation:(BMKUserLocation *)userLocation{
    
    }
    

    在定位成功的回调方法里我们使用CLGeocoder实例对象去获取用户定位信息,代码:

    CLGeocoder *geocoder = [[CLGeocoder alloc] init];
    [geocoder reverseGeocodeLocation: userLocation.location completionHandler:^(NSArray *array, NSError *error) {
        if (array.count > 0) {
            CLPlacemark *placemark = [array objectAtIndex:0];
            if (placemark != nil) {
                NSDictionary *addressDictionary = placemark.addressDictionary;
                NSString *state=[addressDictionary objectForKey:@"State"];  //省。直辖市  江西省
                NSString *city=[addressDictionary objectForKey:@"City"];    //市  丰城市
                NSString *subLocality=[addressDictionary objectForKey:@"SubLocality"];    //区
                NSString *street=[addressDictionary objectForKey:@"Street"];//街道
                NSLog(@"省:%@---市:%@---区:%@---街道:%@",state, city, subLocality, street);
                //发起反向地理编码检索
                BMKReverseGeoCodeSearchOption *reverseGeoCodeSearchOption = [[BMKReverseGeoCodeSearchOption alloc]init];
                reverseGeoCodeSearchOption.location = userLocation.location.coordinate; // 用户的具体位置
                if (self.completedBlock) {
                    if (state == nil || state.length == 0) {
                        self.completedBlock(city);
                    }else{
                        self.completedBlock(state);
                    }
                }
                BOOL flag = [self.searcher reverseGeoCode:reverseGeoCodeSearchOption];
                if(flag){
                    LGJLog(@"反geo检索发送成功");
                }else{
                    LGJLog(@"反geo检索发送失败");
                }
            }else{
                if (self.faildBlock) {
                    self.faildBlock(error);
                }
            }
        }
        //找到了当前位置城市后就关闭服务
        [self.locService stopUserLocationService];
    }];
    

    我们从placemark的addressDictionary属性里可以获取用户所在的省、市、区以及街道。

    注意:如果我们获取的省为空,那么这个城市极有可能就是直辖市,这是我们使用字典中的@"City"所对应的市就可以了。

    我们如果想获取用户的具体地址就需要我们进行反地理编码了,我们需要使用BMKGeoCodeSearch类对象调用reverseGeoCode方法进行反geo检索。反检索成功会回调一个代理方法:

      #pragma mark - BMKGeoCodeSearchDelegate
      //接收反向地理编码结果
    -(void) onGetReverseGeoCodeResult:(BMKGeoCodeSearch *)searcher result:(BMKReverseGeoCodeSearchResult *)result errorCode:(BMKSearchErrorCode)error{
    if (error == BMK_SEARCH_NO_ERROR) {
        //在此处理正常结果
        NSArray * dataList = result.poiList;
        self.selectInfo = dataList[0];
        NSLog(@"POI名称:%@", self.selectInfo.name);
        NSLog(@"POI地址:%@---省:%@---城市:%@---行政区域:%@", self.selectInfo.address, self.selectInfo.province, self.selectInfo.city,self.selectInfo.area);
    }
    else {
        LGJLog(@"抱歉,未找到结果");
    }
    }
    

    从selectInfo(BMKPoiInfo对象)中我们通过name能获取到用户所在具体位置能精确到用户所有的几号楼几座,通过address我们能获取用户所在的位置能精确到哪个院。
    打印地址:


    0.省市县.png
    0.juti.png

    之前遇到过一种情况,在自测的时候是没问题的,可发给测试人员去测的时候却发现无法进行反地理编码。这是因为自测和发包给测试人员测试的时候bundleid不一样,而百度地图Key使用的是同一个Key,从而导致无法进行反地理编码。最后对bundleid进行了一个判断,对使用的百度地图key进行了一个区分。

    本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊

    相关文章

      网友评论

        本文标题:iOS开发中通过定位获取用户所在省、市、区、街道、地址、具体位置

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