一、定位。
1),iOS8以后,请求定位时候,需要在info.plist文件里加入一个字段。
//NSLocationAlwaysUsageDescription(一直定位,后台的也能定位)
//NSLocationWhenInUseUsageDescription(使用的时候定位)
2),如果需要使用定位,需要导入CoreLocation框架。
import <CoreLocation/CoreLocation.h>
遵守代理<CLLocationManagerDelegate>
_locationManager.delegate = self;
初始化定位管理器
_locationManager = [[CLLocationManager alloc] init];
//在ios8以后,请求定位需要调用下面的方法
//做版本判断是因为低版本调用高版本的方法,会出现崩溃
if ([[[UIDevice currentDevice] systemVersion] floatValue]>=8.0) {
//一直定位
[_locationManager requestAlwaysAuthorization];
//用时定位
[_locationManager requestWhenInUseAuthorization];
}
//当用户移动50米时,会调用一次代理方法[定位一次]
_locationManager.distanceFilter = 50;
//设置定位的精确度,精确度越高,越费电
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
实现代理方法
。
//授权结果
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status{
if (status == kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用户授权");
}else if(status == kCLAuthorizationStatusAuthorizedAlways ||
status == kCLAuthorizationStatusAuthorizedWhenInUse){
NSLog(@"授权成功");
//开始更新用户的位置信息,一旦调用了这个方法,就会不断地获取用户的位置信息
[_locationManager startUpdatingLocation];
}else{
NSLog(@"授权失败");
}
}
//定位成功
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
//数组中最后的元素是最新的定位
//拿到用户最新的位置信息
//按时间排序,如果想要拿到最新的位置信息,如果想要拿到最新的位置信息,直接拿到最后一个
CLLocation *currentLocation = [locations lastObject];
//把最新的位置信息赋值给_location
_location = currentLocation;
//比如:获取用户所在的城市,只需要一次
//停止更新用户的位置信息
// [manager stopUpdatingLocation];
}
//定位失败
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"失败");
NSLog(@"%@",error.userInfo);
}
正向地理编码
地址转换为经纬度称为正向地理编码
//创建编码对象
CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
//正向地理编码
NSString *str = @"地址字符串";
[geoCoder geocodeAddressString:str completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0) {
return ;
}
CLPlacemark *placeMark = [placemarks lastObject];
NSLog(@"纬度%lf",placeMark.location.coordinate.latitude);
NSLog(@"经度%lf",placeMark.location.coordinate.longitude);
}];
反向地理编码
将经纬度转换成详细的地址。
//创建编码对象
CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
//反向地理变量
//_location :一个地理位置的
[geoCoder reverseGeocodeLocation:_location completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (placemarks.count == 0) {
return ;
}
//地标 里面封住了详细的地址信息
CLPlacemark *placeMark = placemarks[0];
NSLog(@"%@",placeMark.addressDictionary);
//addressDictionary 详细的位置信息
}];
通过两个地理位置计算之间距离
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:34.772108 longitude:113.675915];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:34.772478 longitude:113.678005];
//计算两个经纬度之间的距离 单位是米
CLLocationDistance distance = [location1 distanceFromLocation:location2];