導讀
這篇將介紹CoreLocation
框架關于定位相關的類(CLLocationManager
、CLLocation
)。
CLLocation
:用于表示位置信息,包含地理坐標、海拔等信息,包含在CoreLoaction
框架中。
CLLocationManager位置管理器
-
屬性
//位置更新的模式
@property(assign, nonatomic) CLActivityType activityType;
typedef NS_ENUM(NSInteger, CLActivityType) {
CLActivityTypeOther = 1,//未知模式,默認為此
CLActivityTypeAutomotiveNavigation, //車輛導航模式
CLActivityTypeFitness, //行人模式
CLActivityTypeOtherNavigation //其他交通工具模式
};//位置信息更新最小距離,只有當最新的位置與上一次獲取的位置之間的距離大于這個距離才更新位置信息,單位為米 @property(assign, nonatomic) CLLocationDistance distanceFilter; kCLDistanceFilterNone;//默認選擇,不進行距離限制 //定位精度,單位為米 //注意事項:精確度越高,越耗電,定位所需時間越長 @property(assign, nonatomic) CLLocationAccuracy desiredAccuracy; kCLLocationAccuracyBestForNavigation;//導航最高精確 kCLLocationAccuracyBest;//高精確 kCLLocationAccuracyNearestTenMeters;//10米 kCLLocationAccuracyHundredMeters;//百米 kCLLocationAccuracyKilometer;//千米 kCLLocationAccuracyThreeKilometers;//三公里 //設置iOS設備是否可暫停定位來節省電池的電量。如果該屬性設為“YES”,則當iOS設備不再需要定位數據時,iOS設備可以自動暫停定位。默認為YES。 @property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically; //是否允許后臺位置更新,iOS9.0后才出現, //注意事項:要開啟這項設置,需要勾選后臺模式,否則會崩潰。 @property(assign, nonatomic) BOOL allowsBackgroundLocationUpdates
-
方法
-
類方法
//判斷設備是否支持定位服務,通常如果用戶沒有啟用定位服務可以提示用戶打開定位服務
+ (BOOL)locationServicesEnabled;//判斷設備是否支持航向信息功能(海拔,速度,方向等傳感器的支持) + (BOOL)headingAvailable; //判斷設備是否支持更新位置信息 + (BOOL)significantLocationChangeMonitoringAvailable //判斷設備是否支持區域檢測,regionClass是地圖框架中的類。 + (BOOL)isMonitoringAvailableForClass:(Class)regionClass; //判斷設備是否支持藍牙測距 + (BOOL)isRangingAvailabl; //定位服務授權狀態 + (CLAuthorizationStatus)authorizationStatus; kCLAuthorizationStatusNotDetermined: 用戶尚未做出決定是否啟用定位服務 kCLAuthorizationStatusRestricted: 沒有獲得用戶授權使用定位服務,可能用戶沒有自己禁止訪問授權 kCLAuthorizationStatusDenied :用戶已經明確禁止應用使用定位服務或者當前系統定位服務處于關閉狀態 kCLAuthorizationStatusAuthorizedAlways: 應用獲得授權可以一直使用定位服務,即使應用不在使用狀態 kCLAuthorizationStatusAuthorizedWhenInUse: 使用此應用過程中允許訪問定位服務
-
對象方法
//請求獲得應用使用時的定位服務授權,注意使用此方法前在要在info.plist中配置<NSLocationWhenInUseUsageDescription>
- (void)requestWhenInUseAuthorization;//請求獲得應用一直使用定位服務授權,注意使用此方法前要在info.plist中配置<NSLocationAlwaysUsageDescription> - (void)requestAlwaysAuthorization; //開啟定位服務 - (void)startUpdatingLocation; //停止定位服務 - (void)stopUpdatingLocation; //單次定位,iOS9.0出現 - (void)requestLocation //開啟航向地理信息服務 - (void)startUpdatingHeading; //停止航向地理信息服務 - (void)stopUpdatingHeading; //立即校準航向 - (void)dismissHeadingCalibrationDisplay; //開始對某個區域進行定位追蹤,開始對某個區域進行定位后。如果用戶進入或者走出某個區域會調用相應的代理方法 - (void)startMonitoringForRegion:(CLRegion *)region ; //停止對某個區域進行定位追蹤 - (void)stopMonitoringForRegion:(CLRegion *)region ;
-
代理方法
//位置發生改變后執行(第一次定位到某個位置之后也會執行)
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;//導航方向發生變化后執行 - (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading; //進入某個區域之后執行 - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region; //走出某個區域之后執行 - (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region; //定位失敗 - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;
-
CLLocation定位服務的位置對象
-
屬性
//當前位置所在的經緯度數據
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
typedef struct {
CLLocationDegrees latitude;//緯度
CLLocationDegrees longitude;//經度
} CLLocationCoordinate2D;//海拔高度 @property(readonly, nonatomic) CLLocationDistance altitude; //速度 @property(readonly, nonatomic) CLLocationSpeed speed; //航向(設備移動的方向, 值域范圍:0.0 ~ 359.9, 正北方向為0.0) @property(readonly, nonatomic) CLLocationDirection course; //定位時的時間戳 @property(readonly, nonatomic, copy) NSDate *timestamp; //水平方向的容錯半徑 @property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy; //豎直方向的容錯半徑 @property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;
對象方法
//計算兩個位置對象之間的物理距離, 單位是(米)
- (CLLocationDistance)distanceFromLocation:(const CLLocation*)location;注意事項
使用location前,務必判斷當前獲取的位置是否有效,如果水平精確度小于零, 代表雖然可以獲取位置對象, 但是數據錯誤, 不可用