CoreLocation 定位

前言

  • Objective-C

    1
    2
    NS_CLASS_AVAILABLE(10_6, 2_0)
    @interface CLLocationManager : NSObject

1、CoreLocation 定位

1.1 配置

  • 1、在 iOS7 及以前的版本,如果在应用程序中使用定位服务只要在程序中调用 startUpdatingLocation 方法应用就会询问用户是否允许此应用是否允许使用定位服务,同时在提示过程中可以通过在 info.plist 中配置通过配置 Privacy - Location Usage Description 告诉用户使用的目的,同时这个配置是可选的。

    • 但是在 iOS8 中配置项发生了变化,可以通过配置 Privacy - Location Always Usage Description (NSLocationAlwaysUsageDescription) 或者 Privacy - Location When In Use Usage Description(NSLocationWhenInUseUsageDescription) 来告诉用户使用定位服务的目的,并且注意这个配置是必须的,如果不进行配置则默认情况下应用无法使用定位服务,打开应用不会给出打开定位服务的提示,除非安装后自己设置此应用的定位服务。同时,在应用程序中需要根据配置对 requestAlwaysAuthorizationlocationServicesEnabled 方法进行请求。

  • 2、在需要使用 CoreLocation 的文件中

    • Objective-C

      1
      2
      3
      4
      5
      // 包含头文件
      #import <CoreLocation/CoreLocation.h>

      // 遵守协议
      <CLLocationManagerDelegate>

1.2 创建定位请求

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // 声明定位管理器
    @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:@"当前应用的定位服务不可用,请检查定位服务授权状态 !"];
    }
    }

1.3 获取定位结果

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    // 定位到位置

    // 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 定位设置

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    // 设置代理
    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];
文章目录
  1. 1. 前言
  2. 2. 1、CoreLocation 定位
    1. 2.1. 1.1 配置
    2. 2.2. 1.2 创建定位请求
    3. 2.3. 1.3 获取定位结果
  3. 3. 2、CoreLocation 定位设置
隐藏目录