CoreLocation
简介:
CoreLocation框架主要用于实现地理定位等相关功能,需要初步掌握CoreLocation框架,我们需要先了解以下几个类:
CLLocationManager(定位管理器),
CLLocation(定位信息),
CLLocationCoordinate2D(地理坐标)。
下面开始正式介绍CoreLocation框架的使用。
1.区别:
在了解如何使用之前,需要了解在iOS7和iOS8下的一点区别,基于更好的用户体验以及安全性等考虑,在iOS8之后,如果应用需要使用地图定位功能,需要向用户申请授权。
判断当前运行的系统版本,如果大于8.0则请求用户权限,iOS7不需要这一步操作
if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
// 此处的Manager为CoreLocationManager对象,下文介绍
[self.manager requestWhenInUseAuthorization];
}
你也可以使用这个方法来申请授权,两者的区别很明显,WhenInUse表示当使用时应用正在使用时才需要进行定位服务,Always表示当应用进入后台时也一直进行定位,根据需求使用即可。
- (void)requestAlwaysAuthorization
做了这一步之后,可能你还是看不到弹框提醒,那是因为如果想要进行这一步操作,还需要在info.plist中进行一项配置,先看一段文档:
If the NSLocationWhenInUseUsageDescription key is not specified in your Info.plist, this method will do nothing, as your app will be assumed not to support WhenInUse authorization.
意思很简单,也就是说我们需要在info.plist文件中为
NSLocationWhenInUseUsageDescription这个key配置一个value,你所配置的value就是弹框时的提示信息。
当然,还有与Always权限对应的另一个key
NSLocationAlwaysUsageDescription。
在iOS7系统下,默认直接获取授权,如果你也想对用户进行提示,那么也需要配置info.plist中的一个key
Privacy - Location Usage Description,此处设置value的就是提示信息。
2.使用前提
如果用户点击allow允许使用授权服务,那么一切正常,如果此时用户点击了don’t allow,那么就算你再次运行程序,系统也不会再次弹框提醒用户授权,也就是说,提示只有一次!
那么假如用户选择了don’t allow,我们还是希望使用定位该怎么办?
介绍一个CLLocationManagerDelegate的方法,当开始定位时检测到用户没有授权等错误时,会执行这个代理方法
- (void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error {
if (error.code == kCLErrorDenied) {
// 让用户前往设置打开定位服务授权
}
}
还有一种情况需要进行考虑,有时候我们会关闭定位服务,此时最好在想使用定位服务时进行判断:
if (![CLLocationManager locationServicesEnabled]) {
// 定位服务不可用,提示用户进入设置菜单手动开启定位服务
}
注意区分上面两个情况,第一种是开启了定位服务但是用户拒绝为应用授权,第二种是彻底没有开启定位。
3.开始使用
进行了以上的设置,我们可以正式开始使用CoreLocation来进行定位服务了。
先介绍第一个类
CoreLocationManager:
顾名思义,该类主要用于管理定位服务,其实上文中已经用到了这个类的两个方法:
// 判断是否开启定位服务
+ (BOOL)locationServicesEnabled;
// 申请授权
- (void)requestWhenInUseAuthorization ;
当进行了权限的判断之后,如果确定已经开启了定位服务并且获取了授权,那么可以开始定位:
- (void)startUpdatingLocation;
此时,创建的CLLocationManager对象会开始调用它的代理的
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
locations数组中包括了若干CLLocation对象,每一个CLLocation对象代表一个位置信息,最新的位置信息位于数组的最后。
下一篇将会着重介绍CLLocation以及CLLocationManager的使用。