前言
NS_CLASS_AVAILABLE(10_6, 2_0)
@interface CLLocationManager : NSObject
1、CoreLocation 定位
-
配置
-
1、在 iOS7 及以前的版本,如果在应用程序中使用定位服务只要在程序中调用 startUpdatingLocation 方法应用就会询问用户是否允许此应用是否允许使用定位服务,同时在提示过程中可以通过在 info.plist 中配置通过配置 Privacy - Location Usage Description 告诉用户使用的目的,同时这个配置是可选的。
-
2、在需要使用 CoreLocation 的文件中
// 包含头文件
#import <CoreLocation/CoreLocation.h>
// 遵守协议
<CLLocationManagerDelegate>
-
创建开启定位请求
// 声明定位管理器
@property (nonatomic, strong) CLLocationManager *locationManager;
// 实例化定位管理器
self.locationManager = [[CLLocationManager alloc] init];
// 设置代理
self.locationManager.delegate = self;
// 判断系统定位服务是否开启
if (![CLLocationManager locationServicesEnabled]) {
// 创建警告框(自定义方法)
[self showAlertWithTitle:@"提示" message:@"系统定位服务不可用,请开启 !"];
} else {
// 判断应用定位服务授权状态
if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined){ // 没有授权
// 8.0 及以上系统需手动请求定位授权
if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
// 设置前台定位,需在 info.plist 里设置 Privacy - Location When In Use Usage Description 的值
[self.locationManager requestWhenInUseAuthorization];
// 设置前后台同时定位,需在 info.plist 里设置 Privacy - Location Always Usage Description 的值
// [self.locationManager requestAlwaysAuthorization];
}
// 开始定位追踪(第一次打开软件时)
[self.locationManager startUpdatingLocation];
} else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedWhenInUse
|| [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorizedAlways) { // 允许定位授权
// 开始定位追踪
[self.locationManager startUpdatingLocation];
} else{ // 拒绝定位授权
// 创建警告框(自定义方法)
[self showAlertWithTitle:@"提示" message:@"当前应用的定位服务不可用,请检查定位服务授权状态 !"];
}
}
-
获取定位结果
// 定位到位置
// CLLocationManagerDelegate 协议方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
CLLocation *location = [locations lastObject];
// 经纬度
CLLocationDegrees longitude = location.coordinate.longitude; // 经度
CLLocationDegrees latitude = location.coordinate.latitude; // 纬度
// 海拔
CLLocationDistance altitude = location.altitude;
// 路线,航向(0.0 度~359.9 度,0.0 度代表真北方向)
CLLocationDirection course = location.course;
// 速度(m/s)
float speed = location.speed;
// 停止定位(如果不关闭,会一直处在定位请求中)
[manager stopUpdatingLocation];
}
2、CoreLocation 定位设置
// 设置代理
self.locationManager.delegate = self;
// 获取系统定位服务开启状态
BOOL isLocationServicesEnabled = [CLLocationManager locationServicesEnabled];
// 获取应用定位服务授权状态
CLAuthorizationStatus authorizationStatus = [CLLocationManager authorizationStatus];
// 设置每隔多少米更新位置信息
self.locationManager.distanceFilter = kCLDistanceFilterNone;
// 设置定位精确度
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// 设置前台定位,需在 info.plist 里设置 Privacy - Location When In Use Usage Description 的值
[self.locationManager requestWhenInUseAuthorization];
// 设置前后台同时定位,需在 info.plist 里设置 Privacy - Location Always Usage Description 的值
[self.locationManager requestAlwaysAuthorization];
// 开始定位
[self.locationManager startUpdatingLocation];
// 停止定位(如果不关闭,会一直处在定位请求中)
[self.locationManager stopUpdatingLocation];
// 获取定位到的 经纬度
CLLocationDegrees longitude = location.coordinate.longitude; // 经度
CLLocationDegrees latitude = location.coordinate.latitude; // 纬度
// 获取定位到的 海拔
CLLocationDistance altitude = location.altitude;
// 获取定位到的 路线,航向(0.0 度~359.9 度,0.0 度代表真北方向)
CLLocationDirection course = location.course;
// 获取定位到的 速度(m/s)
float speed = location.speed;
// 计算两个位置之间的距离
CLLocation *location1 = [[CLLocation alloc] initWithLatitude:40 longitude:116];
CLLocation *location2 = [[CLLocation alloc] initWithLatitude:41 longitude:116];
CLLocationDistance distance = [location1 distanceFromLocation:location2];