地图定位获取当前经纬度, 及各种位置信息

需要在Info.plist文件中设置一下,加入一个NSLocationWhenInUseUsageDescription(前台获取GPS定位),NSLocationAlwaysUsageDescription(前后台获取GPS定位),Value可以为空;

引头文件
#import <CoreLocation/CoreLocation.h>
签协议

@interface ViewController ()<CLLocationManagerDelegate>

写俩懒加载, 待会会用到

- (CLGeocoder *)geocoder{

    if (!_geocoder) {
        _geocoder = [[CLGeocoder alloc] init];
    }
    return _geocoder;
}

- (CLLocationManager *)locationManager{

    if (!_locationManager) {
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.delegate = self;
        _locationManager.desiredAccuracy =       kCLLocationAccuracyBest;
    }
    return _locationManager;
}

接下来可以在 viewDidLoad 和 刷新定位按钮响应事件 的地方调用下面方法, 开始定位, 最好别在viewWillAppear调用, 用户关闭过一次权限她不想老被提醒
#pragma mark - 定位
- (void)beginLocate{

    if ([CLLocationManager locationServicesEnabled]) {
        /** 由于IOS8中定位的授权机制改变 需要进行手动授权
         * 获取授权认证,两个方法:
         * [self.locationManager requestWhenInUseAuthorization];
         * [self.locationManager requestAlwaysAuthorization];
         */
        if ([self.locationManager   respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
//                NSLog(@"requestWhenInUseAuthorization");
            [self.locationManager requestWhenInUseAuthorization];
        }
    
        //开启定位, 不断调用其代理方法
        [self.locationManager startUpdatingLocation];
//        NSLog(@"start gps");
    }
    if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied){
        NSLog(@"定位权限被关闭");
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"抱歉" message:@"您尚未开启定位权限" preferredStyle:UIAlertControllerStyleAlert];
    
        UIAlertAction *actionCancel = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:nil];
    
        UIAlertAction *actionOk = [UIAlertAction actionWithTitle:@"去设置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
       
            [self jumpToSetting];
        
        }];
    
        [alertController addAction:actionCancel];
        [alertController addAction:actionOk];
        [self presentViewController:alertController animated:YES completion:nil];
    
    }

}

#pragma mark - 去系统设置开启权限
- (void)jumpToSetting{

    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];

    //info plist中URL type中添加一个URL Schemes添加一个prefs值
    if([[UIApplication sharedApplication] canOpenURL:url]){
        //跳转到定位
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"]];
    }

}

这是定位的代理方法
#pragma mark - CLLocationManagerDelegate
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{

if(!_isLocationed){
    //1.获取最新的一次位置信息
    CLLocation *location = [locations lastObject];
    CLLocationCoordinate2D coordinate = location.coordinate;
    //NSLog(@"经度:%f, 纬度:%f", coordinate.longitude, coordinate.latitude);
    //逆地理编码得到当前定位城市
    [self reGeoCoderLocation:coordinate];
    }else{
    //2.停止定位
    [self.locationManager stopUpdatingLocation];
    }
    }
  #pragma mark - 逆地理编码
   - (void)reGeoCoderLocation:(CLLocationCoordinate2D)coordinate{

    //根据经纬度反向地理编译出地址信息
    CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude longitude:coordinate.longitude];
    [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
    
        if (placemarks.count > 0) {
            CLPlacemark *placemark = placemarks.firstObject;
        
            //placemark.name位置全名
            //
            //placemark.thoroughfare街道
            //
            //placemark.subThoroughfare子街道
            //
            // placemark.locality市
            //
            //placemark.subLocality区
            //
            //placemark.country国家
        
            //NSLog(@"全称:%@, 市:%@, 区:%@, 街道:%@, 子街道:%@", placemark.name, placemark.locality, placemark.subLocality, placemark.thoroughfare, placemark.subThoroughfare);

          //NSString *city = placemark.locality;
        if (!city) {
            //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
            city = placemark.administrativeArea;
        }

            //获取具体位置
            NSString *strOfAccurate = placemark.name;
            NSString *strOfCity = placemark.locality;
            NSString *strOfThroughfare = placemark.thoroughfare;
            if (!strOfCity || !strOfAccurate || !strOfThroughfare) {
                _isLocationed = NO;
                [self.locationManager startUpdatingLocation];
            }else{
                _isLocationed = YES;
            
                _locationView.labelOfLocation.text = [NSString stringWithFormat:@"当前: %@%@", strOfCity, strOfAccurate];
            }
        
        }
    
    else if (error == nil && placemarks.count == 0){
        NSLog(@"定位无返回结果");
    }
    else if(error != nil){
        NSLog(@"location error: %@", error);
    }
    
    }];

    }

#pragma mark - 试图将要消失
- (void)viewWillDisappear:(BOOL)animated{

    [super viewWillDisappear:animated];
    //定位停止
    [self.locationManager stopUpdatingLocation];
}

以下这个协议方法也可以
//代理方法:获取地理位置变化的起始点和终点,didUpdateToLocation:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
//将经度显示到label上
self.longitude.text = [NSString stringWithFormat:@"%lf", newLocation.coordinate.longitude];
//将纬度显示到label上
self.latitude.text = [NSString stringWithFormat:@"%lf", newLocation.coordinate.latitude];

    // 获取当前所在的城市名
    CLGeocoder *geocoder = [[CLGeocoder alloc] init];

    //根据经纬度反向地理编译出地址信息
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error){
    
        if (array.count > 0){
        
            CLPlacemark *placemark = [array objectAtIndex:0];
            //将获得的所有信息显示到label上
            self.location.text = placemark.name;
            //获取城市
            NSString *city = placemark.locality;
            if (!city) {
                //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)
                city = placemark.administrativeArea;
            }
                NSLog(@"city = %@", city);
            _cityLable.text = city;
//              [_cityButton setTitle:city forState:UIControlStateNormal];
        }
        else if (error == nil && [array count] == 0)
        {
            NSLog(@"No results were returned.");
        }
        else if (error != nil)
        {
            NSLog(@"An error occurred = %@", error);
        }
    }];
    //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新
    [manager stopUpdatingLocation];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容