一、CoreLocation框架使用前提
- 導(dǎo)入主頭文件
#import <CoreLocation/CoreLocation.h>
注意:CoreLocation框架中所有數(shù)據(jù)類(lèi)型的前綴都是CL;CoreLocation中使用CLLocationManager對(duì)象來(lái)做用戶定位。
二、CoreLocation框架使用流程
-
創(chuàng)建CoreLocation管理者
CLLocationManager *manager = [[CLLocationManager alloc] init];
注意:創(chuàng)建CoreLocation管理者要變成屬性,使用強(qiáng)引用,因?yàn)関iewDidLoad方法執(zhí)行完畢,CLLocationManager是個(gè)局部變量,會(huì)被銷(xiāo)毀。
-
成為CoreLocationManager的代理,監(jiān)聽(tīng)獲取到的位置
manager.delegate = self; 主動(dòng)要求用戶對(duì)應(yīng)用程序授權(quán)
在iOS8以前,只有開(kāi)始定位,系統(tǒng)就會(huì)自動(dòng)要求用戶對(duì)你的應(yīng)用程序授權(quán)。從iOS8開(kāi)始,想要定位,必須先主動(dòng)要求用戶授權(quán),而且必須在info.plist文件中配置一項(xiàng)屬性才能彈出允許授權(quán)的窗口。
- requestWhenInUseAuthorization:請(qǐng)求前臺(tái)的定位權(quán)限
- requestAlwaysAuthorization:請(qǐng)求前臺(tái)和后臺(tái)的定位權(quán)限cc
- NSLocationWhenInUseDescription:允許在前臺(tái)獲取GPS的描述
- NSLocationAlwaysUsageDescription:允許在后臺(tái)獲取GPS的描述
開(kāi)發(fā)者可以在Info.plist中設(shè)置NSLocationUsageDescription說(shuō)明定位的目的(Privacy -
Location Usage Description)。一旦用戶選擇了“Don’tAllow”,意味著你的應(yīng)用無(wú)法使用定位功能,為了嚴(yán)謹(jǐn)起見(jiàn),最好在使用定位功能之前判斷當(dāng)前應(yīng)用的定位功能是否可用。CLLocationManager有個(gè)類(lèi)方法可以判斷當(dāng)前應(yīng)用的定位功能是否可用:
+ (BOOL)locationServicesEnabled;
開(kāi)始監(jiān)聽(tīng)(開(kāi)始獲取位置)
調(diào)用[self.manager startUpdatingLocation],當(dāng)調(diào)用了startUpdatingLocation方法,就開(kāi)始不斷地定位用戶的位置,中途會(huì)頻繁地調(diào)用下面的代理方法:- (void)locationManager:(CLLocationManager)manager didUpdateLocations:(NSArray)locations;實(shí)現(xiàn)CLLocationManager的代理方法
(1)當(dāng)授權(quán)狀態(tài)發(fā)生改變時(shí)調(diào)用:
- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
if(status ==kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用戶授權(quán)");
}else if(status ==kCLAuthorizationStatusAuthorizedAlways||
status ==kCLAuthorizationStatusAuthorizedWhenInUse)
{
NSLog(@"授權(quán)成功");
//開(kāi)始定位
[self.mgr startUpdatingLocation];
}else
{
NSLog(@"授權(quán)失敗");
}
}
CLAuthorizationStatus枚舉類(lèi)型:
- 用戶從未選擇過(guò)權(quán)限:kCLAuthorizationStatusNotDetermined
- 無(wú)法使用定位服務(wù),該狀態(tài)用戶無(wú)法改變:kCLAuthorizationStatusRestricted
- 用戶拒絕該應(yīng)用使用定位服務(wù),或是定位服務(wù)總開(kāi)關(guān)處于關(guān)閉狀態(tài):kCLAuthorizationStatusDenied
- 已經(jīng)授權(quán)(廢棄):kCLAuthorizationStatusAuthorized
- 用戶允許該程序無(wú)論何時(shí)都可以使用地理信息:kCLAuthorizationStatusAuthorizedAlways
- 用戶同意程序在可見(jiàn)時(shí)使用地理位置:kCLAuthorizationStatusAuthorizedWhenInUse
(2)當(dāng)獲取到位置信息之后會(huì)調(diào)用:
- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations {
//如果只需要獲取一次,可以獲取到位置之后就停止
[self.mgr stopUpdatingLocation];
}
在該代理方法中,還可以獲取以下信息:
- location.coordinate:坐標(biāo),包含經(jīng)緯度
- location.altitude:設(shè)備海拔高度單位是米
- location.course:設(shè)置前進(jìn)方向
- location.horizontalAccuracy:水平精準(zhǔn)度
- location.verticalAccuracy:垂直精準(zhǔn)度
- location.timestamp:定位信息返回的時(shí)間
- location.speed:設(shè)備移動(dòng)速度單位是米/秒,適用于行車(chē)速度而不太適用于不行
6.報(bào)錯(cuò)處理
使用CoreLocation獲取地理位置信息,報(bào)錯(cuò):
Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
解決方法:
- 確定模擬器或者手機(jī)已經(jīng)聯(lián)網(wǎng)并且允許應(yīng)用程序獲取地理位置
- 重置地理位置服務(wù)或者網(wǎng)絡(luò)服務(wù)
ps:如果是模擬器就果斷直接重置模擬器吧 IOS Simulator - Reset Content and Settings...