IOS定位服務的應用
一、授權的申請與設置
在IOS8之後,IOS的定位服務做了優化,若要使用定位服務,必須先獲取用戶的授權。
首先需要在info.plist文件中添加一個鍵:NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription。其中NSLocationAlwaysUsageDescription是要始終使用定位服務,NSLocationWhenInUseUsageDescription是隻在前臺使用定位服務。
IOS8中CLLocationManager新增的兩個新方法:
- (void)requestAlwaysAuthorization;
- (void)requestWhenInUseAuthorization;
這兩個方法對應上面的兩個鍵值,用於在代碼中申請定位服務權限。
二、定位服務相關方法
IOS的定位服務在CoreLocation.framework框架內,首先引入這個框架:
開啓定位服務的代碼非常簡單,示例如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#import "ViewController.h" #import <CoreLocation/CoreLocation.h> @interface ViewController ()<CLLocationManagerDelegate> //定位服務的代理 @end @implementation ViewController - ( void )viewDidLoad { [super viewDidLoad]; CLLocationManager* manager = [[CLLocationManager alloc]init]; //初始化一個定位管理對象 [manager requestWhenInUseAuthorization]; //申請定位服務權限 manager.delegate=self; //設置代理 [manager startUpdatingLocation]; //開啓定位服務 } //定位位置改變後調用的函數 -( void )locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ NSLog(@ "%@" ,locations); } @end |
CLLocationManager相關方法解讀:
+ (BOOL)locationServicesEnabled;
判斷設備是否支持定位服務
+ (BOOL)headingAvailable;
判斷設備是否支持航向信息功能(海拔,速度,方向等傳感器的支持)
+ (BOOL)significantLocationChangeMonitoringAvailable;
判斷設備是否支持更新位置信息
+ (BOOL)isMonitoringAvailableForClass:(Class)regionClass;
判斷設備是否支持區域檢測,regionClass是地圖框架中的類。
+ (BOOL)isRangingAvailabl;
判斷設備是否支持藍牙測距
+ (CLAuthorizationStatus)authorizationStatus;
獲得定位服務的授權狀態,CLAuthorizationStatus的枚舉如下:
1
2
3
4
5
6
7
|
typedef NS_ENUM( int , CLAuthorizationStatus) { kCLAuthorizationStatusNotDetermined = 0, //用戶還沒有做選擇 kCLAuthorizationStatusRestricted, //應用拒接使用定位服務 kCLAuthorizationStatusDenied, //用戶拒絕授權 kCLAuthorizationStatusAuthorizedAlways, //8.0後可用,始終授權位置服務 kCLAuthorizationStatusAuthorizedWhenInUse, //8.0後可用,只在前臺授權位置服務 }; |
@property(assign, nonatomic) CLActivityType activityType;
這個屬性用來設置位置更新的模式,枚舉如下:
1
2
3
4
5
6
|
typedef NS_ENUM(NSInteger, CLActivityType) { CLActivityTypeOther = 1, //未知模式,默認爲此 CLActivityTypeAutomotiveNavigation, //車輛導航模式 CLActivityTypeFitness, //行人模式 CLActivityTypeOtherNavigation //其他交通工具模式 }; |
模式的應用可以起到節省電量的作用,例如車輛導航模式,當汽車停止時,位置更新服務會暫停。
@property(assign, nonatomic) CLLocationDistance distanceFilter;
設置位置更新的敏感範圍,單位爲米。
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy;
設置定位服務的精確度,系統定義好的幾個參數如下:
kCLLocationAccuracyBestForNavigation;//導航最高精確
kCLLocationAccuracyBest;//高精確
kCLLocationAccuracyNearestTenMeters;//10米
kCLLocationAccuracyHundredMeters;//百米
kCLLocationAccuracyKilometer;//千米
kCLLocationAccuracyThreeKilometers;//三公里
@property(assign, nonatomic) BOOL pausesLocationUpdatesAutomatically;
設置位置更新是否自動暫停
@property(readonly, nonatomic, copy) CLLocation *location;
最後一次更新的位置信息,只讀屬性
@property(assign, nonatomic) CLLocationDegrees headingFilter;
相關航向更新的敏感範圍
@property(assign, nonatomic) CLDeviceOrientation headingOrientation;
定位航向時的參照方向默認爲正北,枚舉如下:
1
2
3
4
5
6
7
8
9
|
typedef NS_ENUM( int , CLDeviceOrientation) { CLDeviceOrientationUnknown = 0, //方向未知 CLDeviceOrientationPortrait, //縱向模式 CLDeviceOrientationPortraitUpsideDown, //縱向倒置模式 CLDeviceOrientationLandscapeLeft, //左向橫向模式 CLDeviceOrientationLandscapeRight, //右向橫向模式 CLDeviceOrientationFaceUp, //水平屏幕向上模式 CLDeviceOrientationFaceDown //水平屏幕下模式 }; |
@property(readonly, nonatomic, copy) CLHeading *heading;
最後一個定位得到的航向信息
- (void)startUpdatingLocation;
開啓定位服務
- (void)stopUpdatingLocation;
停止定位服務
- (void)startUpdatingHeading;
開啓航向地理信息服務
- (void)stopUpdatingHeading;
停止航向地理信息服務
三、定位服務代理的相關方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;
位置更新後調用的方法,數組中是所有定位到的位置信息,最後一個是最新的。
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;
航向信息更新後調用的方法
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error;
定位異常時調用的方法
四、定位服務獲取到的位置對象
上面也提到,定位後返回的數組中存放的都是CLLocation對象,這裏面有很詳細的位置信息,屬性如下:
@property(readonly, nonatomic) CLLocationCoordinate2D coordinate;
經緯度屬性,CLLocationCoordinate2D是一個結構體,如下:
1
2
3
4
|
typedef struct { CLLocationDegrees latitude; //緯度 CLLocationDegrees longitude; //經度 } CLLocationCoordinate2D; |
@property(readonly, nonatomic) CLLocationDistance altitude;
海拔高度,浮點型
@property(readonly, nonatomic) CLLocationAccuracy horizontalAccuracy;
水平方向的容錯半徑
@property(readonly, nonatomic) CLLocationAccuracy verticalAccuracy;
豎直方向的容錯半徑
@property(readonly, nonatomic) CLLocationDirection course;
設備前進的方向,取值範圍爲0-359.9,相對正北方向
@property(readonly, nonatomic) CLLocationSpeed speed;
速度,單位爲m/s
@property(readonly, nonatomic, copy) NSDate *timestamp;
定位時的時間戳
五、航標定位得到的航標信息對象
CLHeading對象的屬性信息:
@property(readonly, nonatomic) CLLocationDirection magneticHeading;
設備朝向航標方向,0爲北磁極。
@property(readonly, nonatomic) CLLocationDirection trueHeading;
設備朝向真實方向,0被地理上的北極
@property(readonly, nonatomic) CLLocationDirection headingAccuracy;
方向偏差
@property(readonly, nonatomic) CLHeadingComponentValue x;
x軸的方向值
@property(readonly, nonatomic) CLHeadingComponentValue y;
y軸方向值
@property(readonly, nonatomic) CLHeadingComponentValue z;
z軸方向值
@property(readonly, nonatomic, copy) NSDate *timestamp;
方向定位時間戳