导入框架(Xcode5.0之后可以省略)
导入主头文件
#import <CoreLocation/CoreLocation.h>
CoreLocation框架使用须知
CoreLocation框架中所有数据类型的前缀都是CL
CoreLocation中使用CLLocationManager对象来做用户定位
CLLocationManager的常用操作
为了严谨起见,最好在使用定位功能之前判断当前应用的定位功能是否可用
CLLocationManager有个类方法可以判断当前应用的定位功能是否可用
+ (BOOL)locationServicesEnabled;
@property(assign, nonatomic) CLLocationDistance distanceFilter;
每隔多少米定位一次
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
定位精确度(越精确就越耗电)
开始更新用户位置
- (void)startUpdatingLocation;
停止更新用户位置
- (void) stopUpdatingLocation;
当调用了startUpdatingLocation方法后,就开始不断地请求、刷新用户的位置,一旦请求到用户位置就会调用代理的下面方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
locations参数里面装着CLLocation对象
授权相关:
相关key:
NSLocationAlwaysUsageDescription
Privacy - Location Usage Description
NSLocationWhenInUseUsageDescription
/** -------iOS8.0+定位适配-------- */ if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0){ // 前台定位授权(默认情况下,不可以在后台获取位置, 勾选后台模式 location update, 但是 会出现蓝条) [_lM requestWhenInUseAuthorization]; // 前后台定位授权(请求永久授权) // +authorizationStatus != kCLAuthorizationStatusNotDetermined // 这个方法不会有效 // 当前的授权状态为前台授权时,此方法也会有效 // [_lM requestAlwaysAuthorization]; } // 允许后台获取用户位置(iOS9.0) if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0) { // 一定要勾选后台模式 location updates _lM.allowsBackgroundLocationUpdates = YES; } // if ([_lM respondsToSelector:@selector(requestAlwaysAuthorization)]) // { // [_lM requestAlwaysAuthorization]; // }
/** * 授权状态发生改变时调用 * * @param manager 位置管理者 * @param status 状态 */ -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { switch (status) { // 用户还未决定 case kCLAuthorizationStatusNotDetermined: { NSLog(@"用户还未决定"); break; } // 问受限 case kCLAuthorizationStatusRestricted: { NSLog(@"访问受限"); break; } // 定位关闭时和对此APP授权为never时调用 case kCLAuthorizationStatusDenied: { // 定位是否可用(是否支持定位或者定位是否开启) if([CLLocationManager locationServicesEnabled]) { NSLog(@"定位开启,但被拒"); }else { NSLog(@"定位关闭,不可用"); } // NSLog(@"被拒"); break; } // 获取前后台定位授权 case kCLAuthorizationStatusAuthorizedAlways: // case kCLAuthorizationStatusAuthorized: // 失效,不建议使用 { NSLog(@"获取前后台定位授权"); break; } // 获得前台定位授权 case kCLAuthorizationStatusAuthorizedWhenInUse: { NSLog(@"获得前台定位授权"); break; } default: break; } }