最近在整理之前运用到的一些技术 , 关于定位 我完善了一下知识体系 , 今天跟大家分享一下 关于定位 CLLocationManager 的那些事 .
基本配置
- 导入架包
#import <CoreLocation/CoreLocation.h>
- 创建对象
//这边需要注意的是 要用strong 强引用
@property (nonatomic, strong) CLLocationManager *locationManager;
声明代理
<CLLocationManagerDelegate>
-
plist 文件配置
-
如果要后台定位,需要打开后台模式
代码实现
// 判断是否打开了位置服务
if ([CLLocationManager locationServicesEnabled]) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
//设置定位距离过滤参数 (当本次定位和上次定位之间的距离大于或等于这个值时,调用代理方法)
self.locationManager.distanceFilter = 20;
//设置定位精度(精度越高越耗电)
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
//请求定位服务许可
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
} else {
[self.locationManager requestAlwaysAuthorization];
}
//开始更新位置
[self.locationManager startUpdatingLocation];
}
//iOS9 之后 必须实现的两个代理方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
NSLog(@"locations : %@",locations);
if (locations) {
CLLocation *currentLocation = [locations lastObject];
//经度
NSNumber *latitude = [NSNumber numberWithDouble:
currentLocation.coordinate.latitude];
//纬度
NSNumber *longitude = [NSNumber numberWithDouble:
currentLocation.coordinate.longitude];
[self.locationManager stopUpdatingLocation];
}
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
NSLog(@"Error : %@",error);
}
** CLLocation 属性**
- coordinate : 当前位置的坐标
- latitude : 纬度
- longitude : 经度
- altitude : 海拔,高度
- horizontalAccuracy : 纬度和经度的精度
- verticalAccuracy : 垂直精度(获取不到海拔时为负数)
- course : 行进方向(真北)
- speed : 以米/秒为单位的速度
- description : 位置描述信息
定位城市
- (void)getLocationCity:(CLLocation *)newLocation{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
// 反向地理编译出地址信息
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
if (! error) {
if ([placemarks count] > 0) {
CLPlacemark *placemark = [placemarks firstObject];
// 获取城市
NSString *city = placemark.locality;
if (! city) {
city = placemark.administrativeArea;
}
self.currentCity.text = city;
}
}
}];
}
** CLPlacemark 属性**
- name:地址名称
- country:国家
- administrativeArea:省份(行政区)
- locality:所属城市
- subLocality:所属城市中的区、县等
- thoroughfare:带街道的地址名称
- subThoroughfare : 街道号
- timeZone:时区
计算两点之间的距离
//调用计算两位置之前距离的方法 (单位为 米)
- (CLLocationDistance)getDistanceFromlocation:(CLLocation *)location
ToAnotherLocation:(CLLocation *)anotherLocation{
CLLocationDistance meters = [location distanceFromLocation:anotherLocation];
return meters;
}
参考文档 :
//www.greatytc.com/p/ef6994767cbb
https://segmentfault.com/a/1190000004563937