在iOS開發中,使用定位,必須基於2個框架進行開發
(1)Map Kit :用於地圖展示
(2)Core Location :用於地理定位
兩個熱門專業術語
(1)LBS :Location Based Service(基於定位的服務)百度,(高德是定位與導行比較出色)
(2)SoLoMo :Social Local Mobile(索羅門)基於位置進行社交
CoreLocation框架的使用
1. 使用前提:
1》導入框架:

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];
—— 后續預告 反地理編碼(根據經緯度查詢位置)
