iOS大咖说

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

2019-03-06  本文已影响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进行了一个区分。

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

上一篇下一篇

猜你喜欢

热点阅读