前言
NS_CLASS_AVAILABLE(10_6, 2_0)
@interface CLLocationManager : NSObject
1、CoreLocation 定位
-
配置
-
1、在 iOS7 及以前的版本,如果在应用程序中使用定位服务只要在程序中调用
startUpdatingLocation
方法应用就会询问用户是否允许此应用是否允许使用定位服务,同时在提示过程中可以通过在 info.plist 中配置通过配置Privacy - Location Usage Description
告诉用户使用的目的,同时这个配置是可选的。-
但是在 iOS8 中配置项发生了变化,可以通过配置
Privacy - Location Always Usage Description (NSLocationAlwaysUsageDescription)
或者Privacy - Location When In Use Usage Description(NSLocationWhenInUseUsageDescription)
来告诉用户使用定位服务的目的,并且注意这个配置是必须的,如果不进行配置则默认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,除非安装后自己设置此应用的定位服务。同时,在应用程序中需要根据配置对requestAlwaysAuthorization
或requestWhenInUseAuthorization
方法进行请求。
-
-
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];