CoreLocation导入框架 :#import <CoreLocation/CoreLocation.h>
需要了解的基本的属性和方法:
属性:
- 定位管理者:CLLocationManager
- 请求定位权限:requestAlwaysAuthorization
- 开始获取位置:startUpdatingLocation
- 停止获取位置:stopUpdatingLocation
- 授权认证状态:CLAuthorizationStatus
- 过滤定位的距离:distanceFilter
- 定位所需精度:desiredAccuracy
- 定位到的信息:CLLocation
- 创建经纬度点:CLLocationCoordinate2D
- 地理编码:CLGeocoder
方法:
- 授权状态发生改变:
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
- 获取到位置信息:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
- 进入监听区域:
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
- 离开监听区域:
- (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
CoreLocatio定位的基本操作:
在ios8后,系统不会默认帮我们调用定位授权,需要我们自己主动要求用户给我们授权,我们需要调用此方法:
[self.mgr requestAlwaysAuthorization];
并且我们还需要在info.plist文件中配置:
NSLocationWhenInUseDescription,允许在前台获取GPS的描述
NSLocationAlwaysUsageDescription,允许在后台获取GPS的描述
#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate> /** * 定位管理者 */ @property (nonatomic ,strong) CLLocationManager *mgr; @end @implementation ViewController // 懒加载 // 创建CoreLocation管理者 - (CLLocationManager *)mgr { if (!_mgr) { _mgr = [[CLLocationManager alloc] init]; } return _mgr; } - (void)viewDidLoad { [super viewDidLoad]; // 设置代理监听获取到的位置 self.mgr.delegate = self; // 判断是否是iOS8 if([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { NSLog(@"是iOS8"); // 主动要求用户对我们的程序授权, 授权状态改变就会通知代理 [self.mgr requestAlwaysAuthorization]; }else { // 开始监听(开始获取位置) [self.mgr startUpdatingLocation]; } } // 授权状态发生改变时调用 - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { if (status == kCLAuthorizationStatusNotDetermined) { NSLog(@"等待用户授权"); }else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) { NSLog(@"授权成功"); // 开始定位 [self.mgr startUpdatingLocation]; }else { NSLog(@"授权失败"); } } #pragma mark - CLLocationManagerDelegate // 获取到位置信息之后就会调用(调用频率非常高) - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { // 定位的信息 // CLLocation *location = [locations lastObject]; }
地理编码(地址转经纬度):
1 #import "ViewController.h" 2 #import <CoreLocation/CoreLocation.h> 3 4 @interface ViewController () 5 6 #pragma mark - 地理编码 7 // 地理编码对象 8 @property (nonatomic ,strong) CLGeocoder *geocoder; 9 @end 10 11 @implementation ViewController 12 13 // 懒加载 14 - (CLGeocoder *)geocoder 15 { 16 if (!_geocoder) { 17 _geocoder = [[CLGeocoder alloc] init]; 18 } 19 return _geocoder; 20 } 21 22 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event23 { 24 // 位置 25 NSString *addressStr = @"上海"; 26 27 // 利用地理编码对象编码 28 // 根据传入的地址获取该地址对应的经纬度信息 29 [self.geocoder geocodeAddressString:addressStr completionHandler:^(NSArray *placemarks, NSError *error) { 30 31 if (placemarks.count == 0 ) { 32 return ; 33 } 34 // placemarks地标数组, 地标数组中存放着地标, 每一个地标包含了该位置的经纬度以及城市/区域/国家代码/邮编等等... 35 // 获取数组中的第一个地标 36 CLPlacemark *placemark = [placemarks firstObject]; 37 // for (CLPlacemark *placemark in placemarks) { 38 // NSLog(@"%@ %@ %f %f", placemark.name, placemark.addressDictionary, placemark.location.coordinate.latitude, placemark.location.coordinate.longitude); 39 40 // 获取城市数组 41 NSArray *address = placemark.addressDictionary[@"FormattedAddressLines"]; 42 NSMutableString *strM = [NSMutableString string]; 43 for (NSString *str in address) { 44 [strM appendString:str]; 45 } 46 47 // } 48 49 }]; 50 }
反地理编码(经纬度转地址):
1 #import "ViewController.h" 2 #import <CoreLocation/CoreLocation.h> 3 4 @interface ViewController () 5 6 // 地理编码对象 7 @property (nonatomic ,strong) CLGeocoder *geocoder; 8 9 @end 10 11 @implementation ViewController 12 13 #pragma mark - 懒加载 14 - (CLGeocoder *)geocoder 15 { 16 if (!_geocoder) { 17 _geocoder = [[CLGeocoder alloc] init]; 18 } 19 return _geocoder; 20 } 21 22 23 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 24 { 25 // 经纬度 26 NSString *longtitude = @"122.48"; 27 NSString *latitude = @"32.22"; 28 29 // 根据经纬度创建CLLocation对象 30 CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude doubleValue] longitude:[longtitude doubleValue]]; 31 32 // 根据CLLocation对象获取对应的地标信息 33 [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) { 34 35 for (CLPlacemark *placemark in placemarks) { 36 NSLog(@"%@ %@ %f %f %@", placemark.name, placemark.addressDictionary, placemark.location.coordinate.latitude, placemark.location.coordinate,longitude,placemark.locality); 37 } 38 }]; 39 } 40 41 @end