CoreLocation定位技術,corelocation定位
CoreLocation架構可用於定位裝置當前經緯度,通過該架構,應用程式可通過附近的蜂窩基站,WIFI訊號或者GPS等資訊計算使用者位置。
iOS定位支援的3種模式。 (1)GPS衛星定位 (2)基站定位 (3)WiFi iOS開發人員使用CoreLocation.framework架構進行定位非常簡單,CoreLocation架構的常用API主要有如下幾個。 (1)CLLocationManger:定位管理器類。 (2)CLLocationManagerDelegate:該協議代表定位管理器的delegate協議。實現該協議的對象可負責處理CLLocationManager的定位事件。 (3)CLLocation:該對象代表位置。該對象包含了當前裝置的經度、緯度、高度、速度、路線等資訊,還包含了該定位資訊的水平精確度,垂直精確度以及時間戳記資訊。 (4)CLHeading:該對象代表裝置的移動方向。 (5)CLRegion:該對象代表一個地區。一般程式不會直接使用該類,而是使用它的兩個子類,即CLCircularRegion(圓形地區)和CLBeaconRegion(藍芽訊號區)。 1.擷取位置資訊 (1)建立CLLocationManager對象,該對象負責擷取定位相關資訊。並為該對象設定一些必要的屬性。 (2)為CLLocationManager指定delegate屬性,該屬性值必須是一個實現CLLocationManagerDelegate協議的對象。實現CLLocationManagerDelegate協議時可根據需要實現協議中特定的方法。 (3)調用CLLocationManager的startUpdatingLocation方法擷取定位資訊。定位結束時,可調用stopUpdatingLocation方法結束擷取定位資訊。 1、將CoreLocation.framework添加到項目中 2、
在iOS8中需要在info.plist中添加兩個欄位。 方向監測 擁有GPS硬體的裝置可以產生裝置的當前方向(course屬性)和速度資訊。iPhone裝置攜帶的定位管理器可以返回一個已經計算好的course 值,通過這個值我們可以獲得當前前進的方向,course值是0~360之間的浮點數,0°值表示正北方向,90°表示正東方向,180°值表示正南方 向,270°值表示正西方向,程式可以通過course值來檢測使用者位置的移動方向。除此之外,還可以通過磁力計來擷取裝置的真實方向。 使用CLLocationManager擷取裝置方向的步驟如下。 1.建立CLLocationManager對象,該對象負責擷取定位相關資訊,並為該對象設定一些必要的屬性。 2.為CLLocationManager指定delegate屬性,該屬性值必須是一個實現CLLocationManagerDelegate協議的對象。實現CLLocationManagerDelegate協議時可根據需要實現協議中特定的方法。 3.調用CLLocationManager的startUpdatingHeading方法擷取方向資訊。擷取方向結束時,可調用stopUpdatingHeading方法結束時擷取方向資訊。 當裝置的方向改變時,iOS系統就會自動激發CLLocationManager的delegate對象的locationManager:didUpdateHeading:方法,而程式可通過重寫該方法來擷取裝置方向。 iOS允許為檢測方向改變設定如下屬性。 1)CLLocationDegress headingFilter:設定只有當裝置方向的改變值超過該屬性值時才激發delegate的方法。 2)CLDeviceOrientation headingOrientation:設定裝置當前方向。 監聽方向時返回的是一個CLHeading對象,該對象包含以下屬性。 1)magnticHeading:該屬性返回裝置與磁北的相對方向。 2)trueHeading:該屬性返回裝置與真北的相對方向。 3)headingAccuracy:該屬性返回方向值的誤差範圍。 4)timestamp:該屬性返回方向值的產生時間。 地區監測 如果希望iOS裝置進入某個地區發出通知,那麼這種地區監測的功能也被稱為臨近警告。 使用者裝置不斷地臨近指定固定點,當與該固定點的距離小於指定範圍時,系統可以觸發相應的處理。使用者裝置離開指定固定點,當與該固定點的距離大於指定範圍時,系統也可以觸發相應的處理。 iOS的地區監測同樣可以使用CLLocationManager來實現,監聽裝置是否進入/離開某個地區的步驟如下: 1)建立CLLocationManager對象,該對象負責擷取定位相關資訊,並未該對象設定一些必要的屬性。對於地區監測而言,CLLocationManager對象需要設定monitoredRegions屬性,該屬性值用於設定該裝置監聽的多個地區。 2)為CLLocationManager指定delegate屬性,該屬性值必須是一個實現CLLocationManagerDelegate協議的對象。實現CLLocationManagerDelegate協議時可根據需要實現協議中特定的方法。 3)調用CLLocationManager的startMonitoringForRegion:方法進列區域監測。地區監測結束時,可調用stopMonitoringForRegion:方法結束地區監測。 CoreLocation具體詳細用法代碼
#import "ViewController.h"#import <CoreLocation/CoreLocation.h>@interface ViewController ()<CLLocationManagerDelegate>@property (nonatomic,strong) CLLocationManager *mange;@end@implementation ViewController-(CLLocationManager *)mange{ if (!_mange) { //建立定位管理器 _mange = [[CLLocationManager alloc]init]; /* extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation __OSX_AVAILABLE_STARTING(__MAC_10_7,__IPHONE_4_0);導航定位 extern const CLLocationAccuracy kCLLocationAccuracyBest;精準定位 extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;精確度十米 extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters; extern const CLLocationAccuracy kCLLocationAccuracyKilometer; extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;一英裡 */ //定位精確度,精確度越高越耗電 _mange.desiredAccuracy = kCLLocationAccuracyBest; //定位的更新頻率,單位為米 _mange.distanceFilter = 5; _mange.delegate = self; } return _mange;}- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //iOS8之後開啟定位需要執行這個方法或者,而且還要配置info.plist CGFloat systemVersion = [UIDevice currentDevice].systemVersion.floatValue; if (systemVersion>=8.0) { [self.mange requestAlwaysAuthorization]; } //2.判斷方法能否執行 // if ([self.mange respondsToSelector:@selector(requestAlwaysAuthorization)]) {// // [self.mange requestAlwaysAuthorization];// } //3.判斷定位按鈕是否開啟 if (![CLLocationManager locationServicesEnabled]) { NSLog(@"請開啟地圖導覽按鈕...親"); } else { //擷取當前定位的狀態 CLAuthorizationStatus status = [CLLocationManager authorizationStatus]; //如果定位狀態未開啟 if(status == kCLAuthorizationStatusNotDetermined) { //前端定位 [self.mange requestAlwaysAuthorization]; } } //開啟定位 [self.mange startUpdatingLocation];}-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{ CLLocation *location = [locations lastObject]; // 經緯度 CLLocationCoordinate2D coordinate = location.coordinate; NSLog(@"經度為:%f,緯度為:%f",coordinate.longitude,coordinate.latitude); //當定位成功後,這個代理只執行一次,所有停止位置更新 [manager stopUpdatingLocation];}