获取当前所在城市-定位信息

2020-10-09  本文已影响0人  weian1

1、Info.plist里添加权限声明


2614444-0a8a0f91c8f0b786.png

2、导入框架

import <CoreLocation/CoreLocation.h>

3、头文件注册代理

CLLocationManagerDelegate

4、定义对象

@property (nonatomic,strong) CLLocationManager *locationManager;

5、开始定位

- (void)startLocate{

  // 判断定位操作是否被允许

  if([CLLocationManager locationServicesEnabled]) {

    self.locationManager = [[CLLocationManager alloc] init] ;

    self.locationManager.delegate = self;

    self.locationManager.desiredAccuracy=kCLLocationAccuracyKilometer;

    // 设置过滤器为无

    self.locationManager.distanceFilter=kCLDistanceFilterNone;

    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0f) {

      [self.locationManager requestWhenInUseAuthorization];

    }

    // 开始定位

    [self.locationManager startUpdatingLocation];

  }else {

    //提示用户无法进行定位操作

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"无法定位"message:@"请检查你的设备是否开启定位功能" delegate:nilcancelButtonTitle:@"确定" otherButtonTitles:nil, nil];

    [alert show];

  }

}

6、代理方法

#pragma mark - CoreLocation Delegate

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{

  //此处locations存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后让locationManager stopUpdatingLocation

  CLLocation *currentLocation = [locations lastObject];

  // 获取当前所在的城市名

  CLGeocoder *geocoder = [[CLGeocoder alloc] init];

  //根据经纬度反向地理编译出地址信息

  [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *array, NSError *error){

    if (array.count > 0){

      CLPlacemark *placemark = [array objectAtIndex:0];

      //将获得的所有信息显示到label上

      NSLog(@"%@",placemark.name);

      //获取城市

      NSString *city = placemark.locality;

      if (!city) {

        //四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)

        city = placemark.administrativeArea;

//        self.cityName = city;

        NSLog(@"city = %@", city);

      }

    }else if (error == nil && [array count] == 0){

      NSLog(@"No results were returned.");

    }else if (error != nil){

      NSLog(@"An error occurred = %@", error);

    }

  }];

  //系统会一直更新数据,直到选择停止更新,因为我们只需要获得一次经纬度即可,所以获取之后就停止更新

  [manager stopUpdatingLocation];

}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {

  if (error.code == kCLErrorDenied) {

    // 提示用户出错原因,可按住Option键点击 KCLErrorDenied的查看更多出错信息,可打印error.code值查找原因所在

  }

}
上一篇下一篇

猜你喜欢

热点阅读