一、CoreLocation框架使用前提
- 导入主头文件
#import <CoreLocation/CoreLocation.h>
注意:CoreLocation框架中所有数据类型的前缀都是CL;CoreLocation中使用CLLocationManager对象来做用户定位。
二、CoreLocation框架使用流程
-
创建CoreLocation管理者
CLLocationManager *manager = [[CLLocationManager alloc] init];
注意:创建CoreLocation管理者要变成属性,使用强引用,因为viewDidLoad方法执行完毕,CLLocationManager是个局部变量,会被销毁。
-
成为CoreLocationManager的代理,监听获取到的位置
manager.delegate = self;
主动要求用户对应用程序授权
在iOS8以前,只有开始定位,系统就会自动要求用户对你的应用程序授权。从iOS8开始,想要定位,必须先主动要求用户授权,而且必须在info.plist文件中配置一项属性才能弹出允许授权的窗口。
- requestWhenInUseAuthorization:请求前台的定位权限
- requestAlwaysAuthorization:请求前台和后台的定位权限cc
- NSLocationWhenInUseDescription:允许在前台获取GPS的描述
- NSLocationAlwaysUsageDescription:允许在后台获取GPS的描述
开发者可以在Info.plist中设置NSLocationUsageDescription说明定位的目的(Privacy -
Location Usage Description)。一旦用户选择了“Don’tAllow”,意味着你的应用无法使用定位功能,为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用。CLLocationManager有个类方法可以判断当前应用的定位功能是否可用:
+ (BOOL)locationServicesEnabled;
开始监听(开始获取位置)
调用[self.manager startUpdatingLocation],当调用了startUpdatingLocation方法,就开始不断地定位用户的位置,中途会频繁地调用下面的代理方法:- (void)locationManager:(CLLocationManager)manager didUpdateLocations:(NSArray)locations;实现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...