IOS定位服務的應用

IOS定位服務的應用 



iOS8位置請求的通知在哪裏

一、授權的申請與設置 

在IOS8之後,IOS的定位服務做了優化,若要使用定位服務,必須先獲取用戶的授權。

首先需要在info.plist文件中添加一個鍵:NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription。其中NSLocationAlwaysUsageDescription是要始終使用定位服務,NSLocationWhenInUseUsageDescription是隻在前臺使用定位服務。

iOS定位服務的應用

IOS8中CLLocationManager新增的兩個新方法:

- (void)requestAlwaysAuthorization;

- (void)requestWhenInUseAuthorization;

這兩個方法對應上面的兩個鍵值,用於在代碼中申請定位服務權限。

二、定位服務相關方法 

IOS的定位服務在CoreLocation.framework框架內,首先引入這個框架:

iOS定位服務的應用

開啓定位服務的代碼非常簡單,示例如下:

?
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;

方向定位時間戳 

iOS8位置請求的通知在哪裏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章