iOS开发之CoreLocation框架使用
CoreLocation框架是iOS开发中比较基础的一个位置信息相关框架,关于定位和地图,之前也有博客多详细的介绍。但是对于CoreLocation框架,并没有完整和细致的记录。本篇博客将剖析这个框架的结构并进行应用示例。下图为CoreLocation框架的相关类布局图:
从图中可以看到,在CoreLocation框架中除了一些数据模型,CLLocationManager作用最为重要,它是整个框架的管理中心,从图中也可以看出,CoreLocation框架功能也非常完善,常规定位,方向信息获取,室内定位,GEO编码等功能都支持。
一、CLLocationManager管理类详解
CLLocationManager作为整个CoreLocation框架的核心管理类,其第一部分功能是获取设备的功能可用性,如下:
//获取位置服务是否可用
+ (BOOL)locationServicesEnabled;
//获取方向信息服务是否可用
+ (BOOL)headingAvailable;
//获取设备是否支持显著位置更改的监听
+ (BOOL)significantLocationChangeMonitoringAvailable;
//获取是否支持针对某种位置区域改变的监听
+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass;
//获取是否支持区域监听 同上面一个函数作用一致
+ (BOOL)regionMonitoringAvailable;
//获取区域监听是否可用 除了设备支持 还需要 用户授权
+ (BOOL)regionMonitoringEnabled;
//获取是否支持测距
+ (BOOL)isRangingAvailable;
在使用CLLocationManager的服务之前,首先需要获取用户的授权,在iOS8之后,还需要在info.plist中添加相关的键,如下:
上面标出的3个键,只需要设置一个,根据自己的定位要求来选择即可。
下面列出了与用户授权相关的方法:
//获取当前用户授权类型
/*
CLAuthorizationStatus枚举如下:
kCLAuthorizationStatusNotDetermined 用户目前还没有选择
kCLAuthorizationStatusRestricted 当前应用尚未授权
kCLAuthorizationStatusDenied 用户拒绝使用位置服务
kCLAuthorizationStatusAuthorizedAlways 用户授权始终可以使用位置服务
kCLAuthorizationStatusAuthorizedWhenInUse 用户授权可以在APP使用时使用位置
kCLAuthorizationStatusAuthorized 用户授权使用位置 iOS8之前
*/
+ (CLAuthorizationStatus)authorizationStatus;
//请求在APP使用时使用用户的位置信息
- (void)requestWhenInUseAuthorization;
//请求始终使用用户的位置信息
- (void)requestAlwaysAuthorization;
下面列举了CLLocationManager中核心的属性和方法:
//设置代理
@property(assign, nonatomic, nullable) id<CLLocationManagerDelegate> delegate;
//定位服务是否可用
@property(readonly, nonatomic) BOOL locationServicesEnabled;
//位置服务的用途,目前这个属性不再使用,在info.plist中配置
@property(copy, nonatomic, nullable) NSString *purpose;
//指定定位活动的行为
/*
CLActivityTypeAutomotiveNavigation 汽车导航
CLActivityTypeFitness 步行
CLActivityTypeOtherNavigation 其他导航 如火车 轮船
CLActivityTypeAirborne 飞机导航
CLActivityTypeOther 其他类型
*/
@property(assign, nonatomic) CLActivityType activityType;
//设置以米为单位的精度,当小于此精度的位置改变不会收到通知CLLocationDistance就是double类型
@property(assign, nonatomic) CLLocationDistance distanceFilter;
//设置预期的定位精度CLLocationAccuracy为double类型 不一定完全精准 只是设置预期
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
//设置是否自动暂停位置更新 根据电量等
@property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically;
//设置是否在后台一直更新定位
@property(assign, nonatomic) BOOL allowsBackgroundLocationUpdates;
//当后台定位时 是否显示活动指示器 在状态栏上
@property(assign, nonatomic) BOOL showsBackgroundLocationIndicator;
//最近的一次位置信息
@property(readonly, nonatomic, copy, nullable) CLLocation *location;
//是否支持方向
@property(readonly, nonatomic) BOOL headingAvailable;
//设置最小方向更新精度
@property(assign, nonatomic) CLLocationDegrees headingFilter;
//用来作为参考的物理设备方向
/*
CLDeviceOrientationUnknown ,
CLDeviceOrientationPortrait,
CLDeviceOrientationPortraitUpsideDown,
CLDeviceOrientationLandscapeLeft,
CLDeviceOrientationLandscapeRight,
CLDeviceOrientationFaceUp,
CLDeviceOrientationFaceDown
*/
@property(assign, nonatomic) CLDeviceOrientation headingOrientation;
//最近一次更新的方向信息
@property(readonly, nonatomic, copy, nullable) CLHeading *heading;
//设置最大的区域监听范围
@property (readonly, nonatomic) CLLocationDistance maximumRegionMonitoringDistance;
//一组目前正在监听的范围集合
@property (readonly, nonatomic, copy) NSSet<__kindof CLRegion *> *monitoredRegions;
//返回一组支持测距的范围
@property (readonly, nonatomic, copy) NSSet<__kindof CLRegion *> *rangedRegions;
//开始更新位置信息
- (void)startUpdatingLocation;
//停止更新位置信息
- (void)stopUpdatingLocation;
//请求一次位置信息
- (void)requestLocation;
//开始更新方向信息
- (void)startUpdatingHeading;
//停止更新方向信息
- (void)stopUpdatingHeading;
//取消航向校准
- (void)dismissHeadingCalibrationDisplay;
//开始显著位置变化的监听
- (void)startMonitoringSignificantLocationChanges;
//停止线束位置变化的监听
- (void)stopMonitoringSignificantLocationChanges;
//开启范围监听
- (void)startMonitoringForRegion:(CLRegion *)region
desiredAccuracy:(CLLocationAccuracy)accuracy;
- (void)startMonitoringForRegion:(CLRegion *)region;
//停止范围监听
- (void)stopMonitoringForRegion:(CLRegion *)region;
//获取指定区域的状态 会在代理回调中返回
- (void)requestStateForRegion:(CLRegion *)region;
//开始计算信标范围 关于Beacon 是一种专门的室内定位服务
- (void)startRangingBeaconsInRegion:(CLBeaconRegion *)region;
//停止计算信标范围
- (void)stopRangingBeaconsInRegion:(CLBeaconRegion *)region;
//允许延迟更新 即位置改变了多少距离或者间隔了多少秒后更新
- (void)allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)distance
timeout:(NSTimeInterval)timeout;
//不允许进行延迟更新
- (void)disallowDeferredLocationUpdates;
//设备是否支持延迟更新
+ (BOOL)deferredLocationUpdatesAvailable;
二、CLLocationManagerDelegate协议
CLLocationManagerDelegate配合CLLocationManager进行使用,其中定义了管理器在提供服务时进行回调的相关函数。解析如下:
//位置更新后调用的回调 会将原位置和更新后的位置信息传入
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation;
//位置更新后调用的回调 会传入按时间排序的一组位置信息对象
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray<CLLocation *> *)locations;
//方向信息更新后调用的回调
- (void)locationManager:(CLLocationManager *)manager
didUpdateHeading:(CLHeading *)newHeading;
//返回布尔值设置是否需要进行方向校准
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager;
//当监听的区域状态变化时调用
/*
CLRegionState定义区域的状态
CLRegionStateUnknown 未知状态
CLRegionStateInside 进入
CLRegionStateOutside 出去
*/
- (void)locationManager:(CLLocationManager *)manager
didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region ;
//区域内有新的信标可用时调用
- (void)locationManager:(CLLocationManager *)manager
didRangeBeacons:(NSArray<CLBeacon *> *)beacons inRegion:(CLBeaconRegion *)region;
//区域内的信标测距发生错误时调用
- (void)locationManager:(CLLocationManager *)manager
rangingBeaconsDidFailForRegion:(CLBeaconRegion *)region
withError:(NSError *)error;
//进入监听区域时调用
- (void)locationManager:(CLLocationManager *)manager
didEnterRegion:(CLRegion *)region;
//退出监听区域时调用
- (void)locationManager:(CLLocationManager *)manager
didExitRegion:(CLRegion *)region;
//服务发生错误时调用
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error;
//监听区域发生错误时调用
- (void)locationManager:(CLLocationManager *)manager
monitoringDidFailForRegion:(nullable CLRegion *)region
withError:(NSError *)error;
//用户授权改变时调用
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;
//开启区域监听时调用
- (void)locationManager:(CLLocationManager *)manager
didStartMonitoringForRegion:(CLRegion *)region;
//暂停位置更新时调用
- (void)locationManagerDidPauseLocationUpdates:(CLLocationManager *)manager;
//恢复位置更新时调用
- (void)locationManagerDidResumeLocationUpdates:(CLLocationManager *)manager;
//延迟更新位置信息错误时调用
- (void)locationManager:(CLLocationManager *)manager
didFinishDeferredUpdatesWithError:(nullable NSError *)error;
//如果启用了访问监听 则收到访问会调用
- (void)locationManager:(CLLocationManager *)manager didVisit:(CLVisit *)visit;