导入CoreLocation框架和对应的主头文件(这是废话)
#import <CoreLocation/CoreLocation.h>
创建位置管理者
- (CLLocationManager *)clManager
{
if (_clManager ==
nil) {
_clManager = [[CLLocationManager alloc]init];
_clManager
.delegate =
self;
_clManager
.desiredAccuracy = kCLLocationAccuracyBest;
[_clManager requestWhenInUseAuthorization];
}
return _clManager;
}
desiredAccuracy:定位精度,刚看到这个属性时,以为是个枚举值,结果是个double类型,有以下几种取值
kCLLocationAccuracyBestForNavigation : 最适合导航kCLLocationAccuracyBest : 精确度最高kCLLocationAccuracyNearestTenMeters : 10mkCLLocationAccuracyHundredMeters : 100mkCLLocationAccuracyKilometer : 1000mkCLLocationAccuracyThreeKilometers : 3000m
定位精度越高,定位所需时间越长,也越耗电。
requestWhenInUseAuthorization : 向用户请求前台定位授权
使用这个方法请求前台授权之前,还需要在info.plist文件中配置授权说明,key为NSLocationWhenInUseUsageDescription,value为描述你使用定位是用来干嘛的,所以写得好是能提高用户授权的概率的。
调用startUpdatingLocation方法来开始定位,更新用户位置信息
[_locationM startUpdatingLocation]
实现代理方法,处理接收到的位置数据
-(void)locationManager:(nonnull CLLocationManager *)manager didUpdateLocations:(nonnull NSArray<CLLocation *> *)locations
{
//开始处理位置信息
}
要让APP在后台可以定位,有两种方法来实现
如果APP已经获取到了前台定位授权,那可以在 Backgroud Modes 中勾选 Location updates 选项,不过当APP退至后台时,顶部会有个蓝条。
如果在iOS 9+ 中,同时还需要设置 allowsBackgroundLocationUpdates为 YES。
_locationM.allowsBackgroundLocationUpdates =
YES; 还需要注意一点:如果allowsBackgroundLocationUpdates为 YES,但是 Backgroud Modes 中未勾选 Location updates,程序会出错。
第二个方法就是直接请求前后台定位授权。使用这种方法,当程序退至后台时,顶部也不会出现蓝条。
[_locationM requestAlwaysAuthorization] 同样的,也需要在info.plist 文件中配置授权说明。
iOS 9 出了个获取一次位置的方法。
[_clManager requestLocation]
这个方法会按照定位精确度从低到高进行排序,逐个进行定位。在定位超时后,即使获取到的位置不是精确度最高的那个也会停止定位,并通过代理告诉外界。 使用这个方法需要注意以下两点:
必须实现代理方法 -locationManager:didFailWithError:。不能和startUpdatingLocation方法同时使用。
监听APP的定位授权状态,实现以下代理方法即可
- (
void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
NSLog(@
"用户还未决定");
break;
case kCLAuthorizationStatusRestricted:
NSLog(@
"访问受限");
break;
case kCLAuthorizationStatusDenied:
NSLog(@
"拒绝访问");
break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
NSLog(@
"前台定位授权");
break;
case kCLAuthorizationStatusAuthorizedAlways:
NSLog(@
"前后台定位授权");
break;
default:
break;
}
}
如果APP在后台运行,用户在设置界面修改了定位权限,可以在这个方法里监听到。