iOS - CoreLocation 定位

简介: 前言 NS_CLASS_AVAILABLE(10_6, 2_0) @interface CLLocationManager : NSObject1、CoreLocation 定位配置1、在 iOS7 及以前的版本,如果在应用程序中使用定位服务只要在程序中调用 startUpdatingLocation 方法应用就会询问用户是否允许此应用是否允许使用定位服务,同时在提示过程中可以通过在 info.plist 中配置通过配置 Privacy - Location Usage Description 告诉用户使用的目的,同时这个配置是可选的。

前言

    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];
目录
相关文章
|
4月前
|
iOS开发
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
35 1
|
8月前
|
iOS开发
iOS 第三方dSYM定位BUG
iOS 第三方dSYM定位BUG
92 0
|
定位技术 iOS开发
iOS iPhone 修改手机定位虚拟定位
iOS iPhone 修改手机定位虚拟定位
iOS iPhone 修改手机定位虚拟定位
|
定位技术 API 开发工具
iOS开发-百度地图基本定位和罗盘跟随的使用,附加地理编码和反地理编码
iOS开发-百度地图基本定位和罗盘跟随的使用,附加地理编码和反地理编码
130 0
iOS开发-百度地图基本定位和罗盘跟随的使用,附加地理编码和反地理编码
|
定位技术 iOS开发
iOS模拟动态定位的测试方案
iOS模拟动态定位的测试方案
145 0
iOS模拟动态定位的测试方案
|
定位技术 iOS开发
iOS移动应用模拟定位的非侵入式测试方案
iOS移动应用模拟定位的非侵入式测试方案
337 0
iOS移动应用模拟定位的非侵入式测试方案
|
API 开发工具 iOS开发
iOS定位的使用:地理/逆地理编码/判断目标经纬度是否在大陆
iOS定位的使用:地理/逆地理编码/判断目标经纬度是否在大陆
631 0
iOS定位的使用:地理/逆地理编码/判断目标经纬度是否在大陆
|
测试技术 定位技术 开发工具
iOS设备限制境外定位(支付交易风险控制策略)
iOS设备限制境外定位(支付交易风险控制策略)
271 0
iOS设备限制境外定位(支付交易风险控制策略)
|
API 定位技术 开发工具
iOS14 定位适配:1、向用户申请临时开启一次精确位置权限的方案2、高德定位SDK适配
iOS14 定位适配:1、向用户申请临时开启一次精确位置权限的方案2、高德定位SDK适配
1497 0
iOS14 定位适配:1、向用户申请临时开启一次精确位置权限的方案2、高德定位SDK适配
|
存储 监控 安全
[iOS研习记]——聊聊野指针与僵尸对象定位
在iOS项目开发中,或多或少的我们都会遇到一些Crash的情况,大部分Crash抛出的异常都是NSException层的,这类异常是OC层代码问题造成的,通常堆栈信息和异常的提示信息都非常明确,可以直接定位到出问题的代码,从而使这类问题的解决并不困难。可以引起Crash的异常除了NSException外,还有Unix层和Mach层的异常。
1546 0