- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 1.創(chuàng)建CoreLocation管理者 // CLLocationManager *mgr = [[CLLocationManager alloc] init]; // 2.成為CoreLocation管理者的代理監(jiān)聽獲取到的位置 self.mgr.delegate = self; // 設(shè)置多久獲取一次 // self.mgr.distanceFilter = 500; // 設(shè)置獲取位置的精確度 /* kCLLocationAccuracyBestForNavigation 最佳導(dǎo)航 kCLLocationAccuracyBest; 最精準 kCLLocationAccuracyNearestTenMeters; 10米 kCLLocationAccuracyHundredMeters; 百米 kCLLocationAccuracyKilometer; 千米 kCLLocationAccuracyThreeKilometers; 3千米 */ // self.mgr.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; /* 注意: iOS7只要開始定位, 系統(tǒng)就會自動要求用戶對你的應(yīng)用程序授權(quán). 但是從iOS8開始, 想要定位必須先"自己""主動"要求用戶授權(quán) 在iOS8中不僅僅要主動請求授權(quán), 而且必須再info.plist文件中配置一項屬性才能彈出授權(quán)窗口 NSLocationWhenInUseDescription梆掸,允許在前臺獲取GPS的描述 NSLocationAlwaysUsageDescription麻车,允許在后臺獲取GPS的描述 */ // 判斷是否是iOS8 if([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { NSLog(@"是iOS8"); // 主動要求用戶對我們的程序授權(quán), 授權(quán)狀態(tài)改變就會通知代理 // [self.mgr requestAlwaysAuthorization]; // 請求前臺和后臺定位權(quán)限 // [self.mgr requestWhenInUseAuthorization];// 請求前臺定位權(quán)限 }else { NSLog(@"是iOS7"); // 3.開始監(jiān)聽(開始獲取位置) [self.mgr startUpdatingLocation]; } }
/**
* 授權(quán)狀態(tài)發(fā)生改變時調(diào)用
*
* @param manager 觸發(fā)事件的對象
* @param status 當(dāng)前授權(quán)的狀態(tài)
*/
-(void)locationManager:(CLLocationManager *````)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
/*
用戶從未選擇過權(quán)限
kCLAuthorizationStatusNotDetermined
無法使用定位服務(wù),該狀態(tài)用戶無法改變
kCLAuthorizationStatusRestricted
用戶拒絕該應(yīng)用使用定位服務(wù)鲸伴,或是定位服務(wù)總開關(guān)處于關(guān)閉狀態(tài)
kCLAuthorizationStatusDenied
已經(jīng)授權(quán)(廢棄)
kCLAuthorizationStatusAuthorized
用戶允許該程序無論何時都可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways
用戶同意程序在可見時使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
*/
if (status == kCLAuthorizationStatusNotDetermined) { NSLog(@"等待用戶授權(quán)"); }else if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) { NSLog(@"授權(quán)成功"); // 開始定位 [self.mgr startUpdatingLocation]; }else { NSLog(@"授權(quán)失敗"); } }
#pragma mark - CLLocationManagerDelegate
//-(void)locationManager:(CLLocationManager *````)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
/**
* 獲取到位置信息之后就會調(diào)用(調(diào)用頻率非常高)
*
* @param manager 觸發(fā)事件的對象
* @param locations 獲取到的位置
*/
-(void)locationManager:(CLLocationManager *````)manager didUpdateLocations:(NSArray *)locations
{ NSLog(@"%s", __func__); // 如果只需要獲取一次, 可以獲取到位置之后就停止 // [self.mgr stopUpdatingLocation]; }
#pragma mark - 懶加載
- (CLLocationManager *)mgr { if (!_mgr) { _mgr = [[CLLocationManager alloc] init]; } return _mgr; }