CoreLocation(地理定位)的基本使用

一、CoreLocation框架使用前提

  1. 导入主头文件
    #import
    注意:CoreLocation框架中所有数据类型的前缀都是CL;CoreLocation中使用CLLocationManager对象来做用户定位。

二、CoreLocation框架使用流程

  1. 创建CoreLocation管理者

     CLLocationManager *manager = [[CLLocationManager alloc] init];
    

注意:创建CoreLocation管理者要变成属性,使用强引用,因为viewDidLoad方法执行完毕,CLLocationManager是个局部变量,会被销毁。

  1. 成为CoreLocationManager的代理,监听获取到的位置

     manager.delegate = self;
    
  2. 主动要求用户对应用程序授权
    在iOS8以前,只有开始定位,系统就会自动要求用户对你的应用程序授权。从iOS8开始,想要定位,必须先主动要求用户授权,而且必须在info.plist文件中配置一项属性才能弹出允许授权的窗口。

  • requestWhenInUseAuthorization:请求前台的定位权限
  • requestAlwaysAuthorization:请求前台和后台的定位权限cc
  • NSLocationWhenInUseDescription:允许在前台获取GPS的描述
  • NSLocationAlwaysUsageDescription:允许在后台获取GPS的描述

开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy -
Location Usage Description)。一旦用户选择了“Don’tAllow”,意味着你的应用无法使用定位功能,为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用。CLLocationManager有个类方法可以判断当前应用的定位功能是否可用:

    + (BOOL)locationServicesEnabled;
  1. 开始监听(开始获取位置)
    调用[self.manager startUpdatingLocation],当调用了startUpdatingLocation方法,就开始不断地定位用户的位置,中途会频繁地调用下面的代理方法:- (void)locationManager:(CLLocationManager)manager didUpdateLocations:(NSArray)locations;

  2. 实现CLLocationManager的代理方法
    (1)当授权状态发生改变时调用:

- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
if(status ==kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用户授权");
}else if(status ==kCLAuthorizationStatusAuthorizedAlways||
status ==kCLAuthorizationStatusAuthorizedWhenInUse)
{
NSLog(@"授权成功");
//开始定位
[self.mgr startUpdatingLocation];
}else
{
NSLog(@"授权失败");
}
}

CLAuthorizationStatus枚举类型:

  • 用户从未选择过权限:kCLAuthorizationStatusNotDetermined
  • 无法使用定位服务,该状态用户无法改变:kCLAuthorizationStatusRestricted
  • 用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态:kCLAuthorizationStatusDenied
  • 已经授权(废弃):kCLAuthorizationStatusAuthorized
  • 用户允许该程序无论何时都可以使用地理信息:kCLAuthorizationStatusAuthorizedAlways
  • 用户同意程序在可见时使用地理位置:kCLAuthorizationStatusAuthorizedWhenInUse

(2)当获取到位置信息之后会调用:

- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations {
  //如果只需要获取一次,可以获取到位置之后就停止
  [self.mgr stopUpdatingLocation];
}

在该代理方法中,还可以获取以下信息:

  • location.coordinate:坐标,包含经纬度
  • location.altitude:设备海拔高度单位是米
  • location.course:设置前进方向
  • location.horizontalAccuracy:水平精准度
  • location.verticalAccuracy:垂直精准度
  • location.timestamp:定位信息返回的时间
  • location.speed:设备移动速度单位是米/秒,适用于行车速度而不太适用于不行

6.报错处理
使用CoreLocation获取地理位置信息,报错:
Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
解决方法:

  • 确定模拟器或者手机已经联网并且允许应用程序获取地理位置
  • 重置地理位置服务或者网络服务
    ps:如果是模拟器就果断直接重置模拟器吧 IOS Simulator - Reset Content and Settings...

你可能感兴趣的:(CoreLocation(地理定位)的基本使用)