网上看了很多,各种问题,各种错误。下面自己写的留档一下。
引入头文件
#import <CoreLocation/CoreLocation.h>
创建几个变量
//创建一个定位管理者 @property (nonatomic ,strong) CLLocationManager *mgr; //经纬度 @property(readonly, nonatomic) CLLocationCoordinate2D coordinate; //海拔 @property(readonly, nonatomic) CLLocationDistance altitude; //路线,航向(取值范围是0.0° ~ 359.9°,0.0°代表真北方向) @property(readonly, nonatomic) CLLocationDirection course; //行走速度(单位是m/s) @property(readonly, nonatomic) CLLocationSpeed speed; //地理编码对象 @property (nonatomic ,strong) CLGeocoder *geocoder;
viewDidLoad里面引用
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. //1.设定CoreLocation管理者的代理监听获取到的位置 self.mgr.delegate = self; // 判断是否是iOS8 if([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { NSLog(@"是iOS8"); // 主动要求用户对我们的程序授权, 授权状态改变就会通知代理 [self.mgr requestAlwaysAuthorization]; // 请求前台和后台定位权限 }else { NSLog(@"是iOS7"); // 3.开始监听(开始获取位置) [self.mgr startUpdatingLocation]; } }
方法
/** * 授权状态发生改变时调用 * * @param manager 触发事件的对象 * @param status 当前授权的状态 */ - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { switch (status) { case kCLAuthorizationStatusAuthorizedAlways: NSLog(@"持续使用授权"); [self.mgr startUpdatingLocation]; break; case kCLAuthorizationStatusAuthorizedWhenInUse: NSLog(@"使用中授权"); [self.mgr startUpdatingLocation]; break; case kCLAuthorizationStatusDenied: NSLog(@"授权被拒绝"); break; case kCLAuthorizationStatusNotDetermined: NSLog(@"等待用户授权"); break; default: NSLog(@"授权失败"); break; } } /** * 获取到位置信息之后就会调用(调用频率非常高) * * @param manager 触发事件的对象 * @param locations 获取到的位置 */ - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { NSLog(@"%s", __func__); // 如果只需要获取一次, 可以获取到位置之后就停止 // [self.mgr stopUpdatingLocation]; // 1.获取最后一次的位置 /* location.coordinate; 坐标, 包含经纬度 location.altitude; 设备海拔高度 单位是米 location.course; 设置前进方向 0表示北 90东 180南 270西 location.horizontalAccuracy; 水平精准度 location.verticalAccuracy; 垂直精准度 location.timestamp; 定位信息返回的时间 location.speed; 设备移动速度 单位是米/秒, 适用于行车速度而不太适用于不行 */ /* 可以设置模拟器模拟速度 bicycle ride 骑车移动 run 跑动 freeway drive 高速公路驾车 */ CLLocation *location = [locations lastObject]; NSLog(@"目前系统位置是:纬度 = %f, 经度 = %f 速度 = %f", location.coordinate.latitude , location.coordinate.longitude, location.speed); [self geocodeBtnClick:@"北京市"]; NSString *strLatitude = [NSString stringWithFormat:@"%f",location.coordinate.latitude]; NSString *strLongitude = [NSString stringWithFormat:@"%f",location.coordinate.longitude]; [self addRessGeocode:strLatitude longtitude:strLongitude]; //[self addRessGeocode:@"29" longtitude:@"121"]; } #pragma mark - 懒加载 - (CLLocationManager *)mgr { if (!_mgr) { _mgr = [[CLLocationManager alloc] init]; } return _mgr; } //地理编码 - (void)geocodeBtnClick:(NSString*) addStr { // 0.获取用户输入的位置 NSString *addressStr = addStr; if (addressStr == nil || addressStr.length == 0) { NSLog(@"请输入地址"); return; } // 1.创建地理编码对象 //创建地理编码对象 CLGeocoder *geocoder=[[CLGeocoder alloc]init]; // 2.利用地理编码对象编码 // 根据传入的地址获取该地址对应的经纬度信息 [geocoder geocodeAddressString:addressStr completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count == 0 || error != nil) { return ; } // placemarks地标数组, 地标数组中存放着地标, 每一个地标包含了该位置的经纬度以及城市/区域/国家代码/邮编等等... // 获取数组中的第一个地标 CLPlacemark *placemark = [placemarks firstObject]; // for (CLPlacemark *placemark in placemarks) { // NSLog(@"%@ %@ %f %f", placemark.name, placemark.addressDictionary, placemark.location.coordinate.latitude, placemark.location.coordinate.longitude); NSLog(@"%@经纬度分别是:,维度:%f,经度:%f",addStr,placemark.location.coordinate.latitude,placemark.location.coordinate.longitude); }]; } //反地理编码 - (void)addRessGeocode:(NSString *)latitude longtitude:(NSString *)longtitude { NSLog(@"反地理编码 传入的值:%@,%@",latitude,longtitude); //创建地理编码对象 CLGeocoder *geocoder=[[CLGeocoder alloc]init]; //创建位置 CLLocation *location=[[CLLocation alloc]initWithLatitude:[latitude floatValue] longitude:[longtitude floatValue]]; [geocoder reverseGeocodeLocation:location completionHandler: ^(NSArray *placemarks,NSError *error) { for (CLPlacemark *placeMark in placemarks) { NSDictionary *addressDic=placeMark.addressDictionary; NSString *state=[addressDic objectForKey:@"State"]; NSString *city=[addressDic objectForKey:@"City"]; NSString *subLocality=[addressDic objectForKey:@"SubLocality"]; NSString *street=[addressDic objectForKey:@"Street"]; NSLog(@"CC = %@,%@,%@,%@",state,city,subLocality,street); //[self stopLocation]; //[_chooseCityBtn setTitle:city forState:UIControlStateNormal]; //[_activityIndicator stopAnimating]; } }]; } //#pragma mark - 懒加载 - (CLGeocoder *)geocoder { if (!_geocoder) { _geocoder = [[CLGeocoder alloc] init]; } return _geocoder; }
最后,Info.plist 文件增加2个键值
Privacy - Location Always Usage Description string 系统想要使用您的位置!
Privacy - Location Usage Description string 系统想要使用您的位置!
© 著作权归作者所有
文章评论(0)