iOS

前言

	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) 来告诉用户使用定位服务的目的,并且注意这个配置是必须的,如果不进行配置则默认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,除非安装后自己设置此应用的定位服务。同时,在应用程序中需要根据配置对 requestAlwaysAuthorizationrequestWhenInUseAuthorization 方法进行请求。

        corelocation1

    • 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];
原文地址:https://www.cnblogs.com/QianChia/p/6212968.html