直接上代碼:
#import 《CoreLocation/CoreLocation.h》
/** 位置管理者 */
@property (nonatomic, strong) CLLocationManager *lM;
#pragma mark - 懶加載
- (CLLocationManager *)lM
{
if (!_lM) {
// 1. 創(chuàng)建位置管理者
_lM = [[CLLocationManager alloc] init];
// 1.1 代理, 通知, block
_lM.delegate = self;
// 每隔多米定位一次
//? ? ? ? _lM.distanceFilter = 100;
/**
kCLLocationAccuracyBestForNavigation // 最適合導航
kCLLocationAccuracyBest; // 最好的
kCLLocationAccuracyNearestTenMeters; // 10m
kCLLocationAccuracyHundredMeters; // 100m
kCLLocationAccuracyKilometer; // 1000m
kCLLocationAccuracyThreeKilometers; // 3000m
*/
// 精確度越高, 越耗電, 定位時間越長
_lM.desiredAccuracy = kCLLocationAccuracyBest;
/** -------iOS8.0+定位適配-------- */
if([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
{
// 前臺定位授權(quán)(默認情況下,不可以在后臺獲取位置, 勾選后臺模式 location update, 但是 會出現(xiàn)藍條)
[_lM requestWhenInUseAuthorization];
// 前后臺定位授權(quán)(請求永久授權(quán))
// +authorizationStatus != kCLAuthorizationStatusNotDetermined
// 這個方法不會有效
// 當前的授權(quán)狀態(tài)為前臺授權(quán)時,此方法也會有效
//? ? ? ? ? ? [_lM requestAlwaysAuthorization];
}
// 允許后臺獲取用戶位置(iOS9.0)
if([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)
{
// 一定要勾選后臺模式 location updates
_lM.allowsBackgroundLocationUpdates = YES;
}
//? ? ? ? if ([_lM respondsToSelector:@selector(requestAlwaysAuthorization)])
//? ? ? ? {
//? ? ? ? ? ? [_lM requestAlwaysAuthorization];
//? ? ? ? }
}
return _lM;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 2. 使用位置管理者,開始更新用戶位置
// 默認只能在前臺獲取用戶位置,
// 勾選后臺模式 location updates
//? ? [self.lM startUpdatingLocation];
/**
kCLLocationAccuracyBestForNavigation // 最適合導航
kCLLocationAccuracyBest; // 最好的
kCLLocationAccuracyNearestTenMeters; // 10m
kCLLocationAccuracyHundredMeters; // 100m
kCLLocationAccuracyKilometer; // 1000m
kCLLocationAccuracyThreeKilometers; // 3000m
*/
//? ? [self.lM requestLocation];
}
#pragma mark - CLLocationManagerDelegate
/**
*? 更新到位置之后調(diào)用
*
*? @param manager? 位置管理者
*? @param locations 位置數(shù)組
*/
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
NSLog(@"定位到了");
// 拿到位置,做一些業(yè)務邏輯操作
// 停止更新
//? [manager stopUpdatingLocation];
}
/**
*? 授權(quán)狀態(tài)發(fā)生改變時調(diào)用
*
*? @param manager 位置管理者
*? @param status? 狀態(tài)
*/
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
// 用戶還未決定
case kCLAuthorizationStatusNotDetermined:
{
NSLog(@"用戶還未決定");
break;
}
// 問受限
case kCLAuthorizationStatusRestricted:
{
NSLog(@"訪問受限");
break;
}
// 定位關(guān)閉時和對此APP授權(quán)為never時調(diào)用
case kCLAuthorizationStatusDenied:
{
// 定位是否可用(是否支持定位或者定位是否開啟)
if([CLLocationManager locationServicesEnabled])
{
NSLog(@"定位開啟栋荸,但被拒");
}else
{
NSLog(@"定位關(guān)閉留搔,不可用");
}
//? ? ? ? ? ? NSLog(@"被拒");
break;
}
// 獲取前后臺定位授權(quán)
case kCLAuthorizationStatusAuthorizedAlways:
//? ? ? ? case kCLAuthorizationStatusAuthorized: // 失效,不建議使用
{
NSLog(@"獲取前后臺定位授權(quán)");
break;
}
// 獲得前臺定位授權(quán)
case kCLAuthorizationStatusAuthorizedWhenInUse:
{
NSLog(@"獲得前臺定位授權(quán)");
break;
}
default:
break;
}
}
// 定位失敗
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"定位失敗");
}