项目当中经常使用到需要获取用户的地理位置,经纬度,现在使用CLLocationManager 苹果自带的获取地理位置的方法
引入头文件,8.0之后不用添加库,之前需要添加库
#import<CoreLocation/CoreLocation.h>
设置代理<CLLocationManagerDelegate>
设置info.plist,添加其中一个就行,
Privacy - Location Always Usage Description
Privacy - Location When In Use Usage Description
@property(nonatomic,strong)CLLocationManager*manger;
@end
@implementationViewController
- (void)viewDidLoad {
[superviewDidLoad];
self.manger=[[CLLocationManageralloc]init];
_manger.delegate=self;
//开始定位,,,,
[_mangerstartUpdatingLocation];
//可以设置在使用是定位也可以设置一直定位,根据项目需求
[_mangerrequestWhenInUseAuthorization];
}
//实现代理方法
//第一次安装会弹出授权界面,如果不允许定位,在下面的方法里可以自动跳转设置页面,更改完设置页面,回到app会重新走这个方法,不用手动调用
- (void)locationManager:(CLLocationManager*)manager
didUpdateLocations:(NSArray *)locations{
//获取定位的最后一组数据,
/* locations.lastObject存储的数据,包括经纬度,定位时间,
<+34.25024365,+108.99842144> +/- 65.00m (speed -1.00 mps / course -1.00) @ 2017/8/25 \U4e2d\U56fd\U6807\U51c6\U65f6\U95f4 \U4e0a\U534811:11:02"
*/
CLLocation*location = locations.lastObject;
//返回当前的经纬度
CLLocationCoordinate2Dcoordinate = location.coordinate;
NSLog(@"获取经纬度::%.2f,,,,,,%.2f",coordinate.latitude,coordinate.longitude);
//反地理编码,通过定位可以获取当前的城市
CLGeocoder*gecoder = [[CLGeocoderalloc]init];
[gecoderreverseGeocodeLocation:locationcompletionHandler:^(NSArray *_Nullableplacemarks,NSError*_Nullableerror) {
CLPlacemark*mark = [placemarksfirstObject];
NSLog(@"%@,,time %@,,,ddress::%@",mark,mark.timeZone,mark.addressDictionary);
}];
//停止定位
[self.mangerstopUpdatingLocation];
//停止定位反地理编码也不再执行
//[gecoder cancelGeocode];
}
//这是通过方法去实现自动打开设置页面,获取定位权限的,返回app会重新走这个代理方法,didUpdateLocations方法。
- (IBAction)locationBtn:(id)sender {
//[self.manger startUpdatingLocation];
NSURL* url = [NSURLURLWithString:UIApplicationOpenSettingsURLString];
if([[UIApplicationsharedApplication]canOpenURL:url]) {
NSURL*url =[NSURLURLWithString:UIApplicationOpenSettingsURLString];
[[UIApplicationsharedApplication]openURL:url];
}
}