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