zoukankan      html  css  js  c++  java
  • 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];
    
  • 相关阅读:
    算法作业实验三
    牛客练习赛53 B 美味果冻
    牛客练习赛53 C 富豪凯匹配串
    bitmat
    牛客挑战赛33 B 鸽天的放鸽序列
    树状数组
    线段树
    2019牛客国庆集训派对day7 A 2016
    背包
    作业三 -并查集
  • 原文地址:https://www.cnblogs.com/QianChia/p/6212968.html
Copyright © 2011-2022 走看看