一、重要属性
CLLocationManager还提供了如下类方法来判断当前设备的定位相关服务状态。
Ø + locationServicesEnabled:返回当前定位服务是否可用。
typedef NS_ENUM(int, CLAuthorizationStatus) {
kCLAuthorizationStatusNotDetermined = 0,// 用户从未选择过权限
kCLAuthorizationStatusRestricted, //1 无法使用定位服务,该状态用户无法改变
kCLAuthorizationStatusDenied, // 2用户拒绝该应用使用定位服务,或是定位服务总开关处于关闭状态
kCLAuthorizationStatusAuthorizedAlways// 3大致是用户允许该程序无论何时都可以使用地理信息
kCLAuthorizationStatusAuthorizedWhenInUse // 4大致是用户同意程序在可见时使用地理位置
kCLAuthorizationStatusAuthorized // 这个值已弃用};
Ø + deferredLocationUpdatesAvailable:返回延迟定位更新是否可用。
Ø + significantLocationChangeMonitoringAvailable:返回重大位置改变监听是否可用。
Ø + headingAvailable:返回该设备是否支持磁力计计算方向。
Ø + isRangingAvailable:返回蓝牙信号范围服务是否可用。这是iOS 7新增的方法。
除此之外,在使用CLLocationManager开始定位之前,还可为该对象设置如下属性。
Ø pausesLocationUpdatesAutomatically:设置iOS设备是否可暂停定位来节省电池的电量。如果该属性设为“YES”,则当iOS设备不再需要定位数据时,iOS设备可以自动暂停定位。
Ø distanceFilter:设置CLLocationManager的自动过滤距离。也就是说,只有当设备在水平方向的位置改变超过该数值(以米为单位)指定的距离时才会生成一次位置改变的信号。
Ø desiredAccuracy:设置定位服务的精度。该属性值支持kCLLocationAccuracyBestForNavigation(导航级的最佳精确度)、kCLLocationAccuracyBest(最佳精确度)、kCLLocationAccuracy NearestTenMeters(10米误差)、kCLLocationAccuracyHundredMeters(百米误差)、kCLLocationAccuracyKilometer(千米误差)、kCLLocationAccuracyThreeKilometers(三千米误差)等常量值。当然,也可直接指定一个浮点数作为定位服务允许的误差。
Ø activityType:设置定位数据的用途。该属性支持CLActivityTypeOther(定位数据作为普通用途)、CLActivityTypeAutomotiveNavigation(定位数据作为车辆导航使用)、CLActivityTypeFitness(定位数据作为步行导航使用)和CLActivityTypeOtherNavigation(定位数据作为其他导航使用)这几个枚举值之一。
------------CLLocation
<CoreLocation/CoreLocation.h>
CLLocationManager
, 并添加到属性。5.设置 每隔多远定位一次
和 精确度
,精确度越高越耗电,定位时间越长
// 1.设置位置管理者属性
@property (nonatomic, strong) CLLocationManager *lcManager;
// 2.判断是否打开了位置服务
if ([CLLocationManager locationServicesEnabled]) {
// 创建位置管理者对象
self.lcManager = [[CLLocationManager alloc] init];
self.lcManager.delegate = self; // 设置代理
// 设置定位距离过滤参数 (当本次定位和上次定位之间的距离大于或等于这个值时,调用代理方法)
self.lcManager.distanceFilter = 100;
self.lcManager.desiredAccuracy = kCLLocationAccuracyBest; // 设置定位精度(精度越高越耗电)
[self.lcManager startUpdatingLocation]; // 开始更新位置
}
/** 获取到新的位置信息时调用*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"定位到了");
}
/** 不能获取位置信息时调用*/
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"获取定位失败");
}
Info.plist
文件中定义 Key
提醒用户,提高用户允许定位的概率。Info.plist
中设置对应的 key
,才会弹框NSLocationWhenInUseUsageDescription
, 如果不设置key,系统会忽略定位请求。2.当用户授权 when-in-use
时,程序在前台时可以启动大部分定位服务。如果想要后台定位,需要开启后台定位模式,但在状态栏会出现蓝条提示用户程序正在进行定位。
[_lcManager requestWhenInUseAuthorization];
Info.plist
文件中包含key NSLocationAlwaysUsageDescription
requestWhenInUseAuthorization
或 requestAlwaysAuthorization
方法。when-in-use
写在前面,第一次打开程序时请求授权,如果勾选了后台模式,进入后台会出现蓝条提示正在定位。当程序退出,第二次打开程序时Always
会再次请求授权。之后进入后台就不会出现蓝条了(前后台都能定位)。Always
写在前面, when-in-use
写在后面,只会在第一次打开程序时请求授权,因为 Always
得到的授权大于when-in-use
的到的授权if ([CLLocationManager locationServicesEnabled]) { // 判断是否打开了位置服务
[self.lcManager startUpdatingLocation]; // 开始更新位置
}
when-in-use
和 Always
都是iOS8之后出现的方法,如果不进行版本适配,运行在iOS7上就会crash,此时需要做版本号判断if ([[UIDevice currentDevice].systemVersion floatValue] >=8.0 ) {
[_lcManager requestAlwaysAuthorization];
}
if ([_lcManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[_lcManager requestWhenInUseAuthorization];
}
/** 定位服务状态改变时调用*/
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用户还未决定授权");
break;
}
case kCLAuthorizationStatusRestricted:
{
NSLog(@"访问受限");
break;
}
case kCLAuthorizationStatusDenied:
{
// 类方法,判断是否开启定位服务
if ([CLLocationManager locationServicesEnabled]) {
NSLog(@"定位服务开启,被拒绝");
} else {
NSLog(@"定位服务关闭,不可用");
}
break;
}
case kCLAuthorizationStatusAuthorizedAlways:
{
NSLog(@"获得前后台授权");
break;
}
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"获得前台授权");
break;
}
default:
break;
}
}
locations
信息locationManager:didUpdateLocations:
方法,返回的类型为 CLLocation
的位置信息数组,以下为数组包含的属性
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { CLLocation *location = [locations firstObject];
NSLog(@"%@", location);
}
requestLocation
ocationManager:didUpdateLocations:
和 locationManager:didFailWithError
方法,但是只调用一次startUpdatingLocation
同时使用 if ([CLLocationManager locationServicesEnabled]) { // 判断是否打开了位置服务
[self.lcManager requestLocation];
}
4.实现 requestWhenInUseAuthorization
或 requestAlwaysAuthorization
方法,并设置对应的 key
if ([[UIDevice currentDevice].systemVersion floatValue] >=8.0 ) {
// iOS0.0:如果当前的授权状态是使用是授权,那么App退到后台后,将不能获取用户位置,即使勾选后台模式:location
[_lcManager requestWhenInUseAuthorization];
}
5.必须勾选后台模式,并设置 allowsBackgroundLocationUpdates
属性为YES(默认是NO)
2.使用 -responsdToSelector:
判断
// iOS9.0+ 要想继续获取位置,需要使用以下属性进行设置(注意勾选后台模式:location)但会出现蓝条
if ([_lcManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
_lcManager.allowsBackgroundLocationUpdates = YES;
}