第1步:準(zhǔn)備操作
- 導(dǎo)入CoreLocation.h框架頭文件
- 遵守CLLocationManagerDelegate協(xié)議
- 定義一個(gè)成員屬性保存定位管理者對(duì)象
#import <CoreLocation/CoreLocation.h>
@interface ViewController ()<CLLocationManagerDelegate>
/** 定位管理者對(duì)象屬性 */
@property (nonatomic, strong) CLLocationManager * manger;
@end
第2步:懶加載創(chuàng)建定位管理者對(duì)象并設(shè)置相關(guān)屬性
-(CLLocationManager *)manger
{
if (_manger == nil)
{
//創(chuàng)建位置管理者對(duì)象
_manger = [[CLLocationManager alloc] init];
//設(shè)置位置管理者對(duì)象的代理
_manger.delegate = self;
//設(shè)置定位精度(精度越高越耗電肖油,定位時(shí)間越長(zhǎng))
_manger.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
//設(shè)置定位間隔(每移動(dòng)多遠(yuǎn)獲取一次定位信息)
// _manger.distanceFilter = 10;
//設(shè)置定位授權(quán)
//[_manger requestAlwaysAuthorization]; //永久獲取定位的權(quán)限
[_manger requestWhenInUseAuthorization]; //使用時(shí)獲取定位的權(quán)限
}
return _manger;
}
注意:
1、在設(shè)置定位授權(quán)
的時(shí)候?qū)崿F(xiàn)了方法也無(wú)法獲取權(quán)限,還需要在Info.plist里面添加下面內(nèi)容(永久定位權(quán)限:NSLocationAlwaysUsageDescription App運(yùn)行時(shí)時(shí)定位權(quán)限:NSLocationWhenInUseUsageDescription)
2腥光、如果ios9之后汉匙,獲取到的是app運(yùn)行期間定位權(quán)限
澳泵,那么當(dāng)app在后臺(tái)時(shí)也可以獲取位置信息赂鲤,需要進(jìn)行如下設(shè)置:
然后在[_manger requestWhenInUseAuthorization]這個(gè)方法后面添加如下代碼(如果添加下面代碼苦掘,必須按上面步驟開(kāi)啟可以后臺(tái)獲取位置信息八拱,否則程序會(huì)崩
):
if ([[UIDevice currentDevice].systemVersion floatValue] >= 9.0)
{
_manger.allowsBackgroundLocationUpdates = YES;
}
第3步:調(diào)用方法開(kāi)始定位
//開(kāi)始定位
[self.manger startUpdatingLocation];
//停止定位
//[self.manger stopUpdatingLocation];
第4步:實(shí)現(xiàn)CLLocationManager代理方法
- 1阵赠、獲取到位置信息時(shí)調(diào)用這個(gè)方法
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations
{
NSLog(@"獲取到定位信息!");
}
- 2肌稻、當(dāng)定位權(quán)限的授權(quán)狀態(tài)發(fā)生改變時(shí)調(diào)用該方法
//當(dāng)定位權(quán)限的授權(quán)狀態(tài)發(fā)生改變時(shí)調(diào)用該方法
-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status)
{
//1清蚀、尚未確定是否授權(quán)
case kCLAuthorizationStatusNotDetermined:
NSLog(@"用戶(hù)尚未確定是否授權(quán)!");
break;
//2爹谭、訪(fǎng)問(wèn)權(quán)限受限
case kCLAuthorizationStatusRestricted:
NSLog(@"獲取定位權(quán)限授權(quán)狀態(tài)受限枷邪!");
break;
//3、獲取定位權(quán)限被拒絕
case kCLAuthorizationStatusDenied:
// 定位服務(wù)是否可用(用戶(hù)是否開(kāi)啟了手機(jī)上的定位開(kāi)關(guān))
if([CLLocationManager locationServicesEnabled])
{
NSLog(@"手機(jī)定位功能開(kāi)啟诺凡,但被拒絕");
}
else
{
NSLog(@"手機(jī)定位功能關(guān)閉东揣,不可用");
}
break;
//4药薯、獲取前臺(tái)定位權(quán)限
case kCLAuthorizationStatusAuthorizedWhenInUse:
NSLog(@"獲取了前臺(tái)定位權(quán)限!");
break;
//5救斑、獲取后臺(tái)定位權(quán)限
case kCLAuthorizationStatusAuthorizedAlways:
NSLog(@"獲取了后臺(tái)定位權(quán)限童本!");
break;
}
}
注意: 如果用戶(hù)手機(jī)根本沒(méi)有打開(kāi)定位服務(wù),那么在獲取定位權(quán)限狀態(tài)的時(shí)候是
kCLAuthorizationStatusDenied(拒絕)
脸候,不是kCLAuthorizationStatusRestricted(訪(fǎng)問(wèn)受限)
穷娱。所以要在拒絕狀態(tài)再判斷一下到底是用戶(hù)手機(jī)沒(méi)有打開(kāi)定位服務(wù)還是真的被拒絕了
- 3、獲取位置信息失敗時(shí)調(diào)用這個(gè)方法
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"獲取位置信息失斣寺佟泵额!");
}