在iOS開發中,使用定位,必須基於2個框架進行開發git
(1)Map Kit :用於地圖展現框架
(2)Core Location :用於地理定位iphone
兩個熱門專業術語ui
(1)LBS :Location Based Service(基於定位的服務)百度,(高德是定位與導行比較出色)編碼
(2)SoLoMo :Social Local Mobile(索羅門)基於位置進行社交atom
CoreLocation框架的使用spa
1. 使用前提:代理
1》導入框架:code
2》導入主頭文件對象
#import <CoreLocation/CoreLocation.h>
2. CoreLocation框架使用須知
CoreLocation框架中全部數據類型的前綴都是CL
CoreLocation中使用CLLocationManager對象來作用戶定位
【初學】
使用方法:
——實現一次定位
// 使用前注意:使用模擬器定位可能會出現bug(沒法定位位置),
// 解決方案:切換模擬器,(好比模擬器iphone6切換成iphone7)
1. 建立位置管理器
// @property (nonatomic, strong) CLLocationManager *locationManager self.locationManager = [[CLLocationManager alloc] init];
2. 設置代理--爲了獲取經緯度
self.locationManager.delegate = self;
3. 請求受權-iOS8之後必須實現
詳細——http://www.tuicool.com/articles/VN3632
// 在IOS8之後須要受權 —— 配置plist文件 /* 修改info.plist 新增Key: NSLocationAlwaysUsageDescription 和 NSLocationWhenInUseUsageDescription ,這兩個Key的值將分別用於描述應用程序始終使用和使用期間使用定位的說明 這些說明將顯示在用戶設置中(彈窗受權時的說明)。 */ // 用戶使用期間受權 [self.locationManager requestWhenInUseAutorization]; // 老是受權 [self.locationManager requestAlwaysAuthorization];
4. 開始請求定位
// [self.locationManager startUpdatingHeading]; 這個是獲取定位方向 // 開始定位 [self.locationManager startUpdatingLocation];
5. 在代理方法中中止更新
// 用戶更新位置時候調用, // 不停調用,因此會很耗電,因此使用一次定位後中止就能夠 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations { NSLog(@"%@", locations); // locations包含的是CLLocation對象 // CLLocationCoordinate2D 2D位置座標 也就是經緯度 // latitude 緯度 // longitude 經度 CLLocation *location = [locations lastObject]; NSLog(@"緯度 %f", location.coordinate.latitude); NSLog(@"經度 %f", location.coordinate.longitude); // 中止更新位置——實現一次定位 [self.locationManager stopUpdatingLocation]; }
——實現持續定位,比較兩點間距離
- (void)viewDidLoad { [super viewDidLoad]; //1. 建立位置管理器 self.locationManager = [[CLLocationManager alloc] init]; //2. 設置代理 self.locationManager.delegate = self; //3. 請求用戶受權--iOS8之後才須要受權 --配置plist文件 // 用戶使用期間受權 [self.locationManager requestWhenInUseAuthorization];
// —————————————上邊都同樣————下邊實現持續定位,設置經度,並比較兩點間直線距離——————————————————— // 老是受權 [self.locationManager requestAlwaysAuthorization]; //4. 距離篩選器 好比: 當前設置10米 實現持續定位 當位置發生多大的改變後調用代理方法 self.locationManager.distanceFilter = 50; //5. 定位精準度 50米 周圍50米的範圍都會認爲是同一地點 2000米 周圍2000米的範圍都會認爲是同一地點 //desired 指望 //Accuracy 精準度 //kCLLocationAccuracyBest 默認 self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; //6. 開始定位 [self.locationManager startUpdatingLocation]; //7. 比較兩個位置之間的距離 [self compareDistance]; } - (void)compareDistance { //北京到阿拉善左旗位置 CLLocation *location1 = [[CLLocation alloc] initWithLatitude:40.06 longitude:116.39]; CLLocation *location2 = [[CLLocation alloc ] initWithLatitude:38.85 longitude:105.68]; // 比較兩點之間的直線距離 CGFloat distance = [location1 distanceFromLocation:location2]; NSLog(@"distance: %f",distance / 1000); }
IOS9新特性
iOS9新特性-只開啓前臺定位時, 臨時開啓後臺定位功能
在以前的版本若是隻開啓了用戶使用期間定位, 就沒法後臺定位. iOS9更加靈活的提供了屬性, 能夠再須要的時候臨時開啓後臺定位.
首先設置allowsBackgroundLocationUpdates屬性爲YES
而後須要增長plist鍵值對: Required background modes : App registers for location updates
應用進入後臺
//1. 建立位置管理器 self.locationManager = [CLLocationManager new]; //2. 設置代理 self.locationManager.delegate = self; //3. 請求用戶受權--iOS8之後才須要受權 --配置plist文件 //1. 若是要適配iOS7, 須要增長判斷 //2. 注意方法和鍵值對的匹配 //3. requestWhenInUseAuthorization 和 requestAlwaysAuthorization 兩者實現其一便可, 一般實現requestWhenInUseAuthorization用戶使用期間 // 版本判斷 系統版本大於8時, 才須要請求受權 if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) { // 用戶使用期間受權 [self.locationManager requestWhenInUseAuthorization]; // MARK: iOS9新增 // 臨時開打後臺定位功能 還要配置pllist self.locationManager.allowsBackgroundLocationUpdates = YES; // 老是受權 -- 顯示其餘程序時--程序在後臺時能夠定位 // [self.locationManager requestAlwaysAuthorization]; } //4. 開始定位 [self.locationManager startUpdatingLocation];
—— 後續預告 反地理編碼(根據經緯度查詢位置)