一次定位及設置前臺授權和后臺定位
1. ?首先導入頭文件 ? ? ? ? ? #import <CoreLocation/CoreLocation.h>?
2. 添加位置管理者屬性 ? ?@property(nonatomic,strong)CLLocationManager*mgr;
3. 創建定位管理者 統一管理定位服務 ? ?_mgr= [[CLLocationManageralloc]init];
4.?請求授權? (三種方法: 第一種是前臺授權 ?第二種是前后臺同時授權但是用戶反感
? ? ? ? ? ? ? ? ? ? ? ? ? 第三種是設置前臺定位及設置代碼和info.plist設置后臺定位)
? ? ? ? ? 4.1 ?僅限于在前臺使用時授權
? ? ? ? ? ? ? ? ? 1) 配置info.plist相關key (NSLocationWhenInUseUsageDescription)
? ? ? ? ? ? ? ? ? 2)做好低版本適配
? ? ? ? ? ? ? if([_mgrrespondsToSelector:@selector(requestWhenInUseAuthorization)]){
? ? ? ? ? ? ? ? //當應用在使用時可以使用定位服務(僅限于應用在前臺使用時授權,一旦程 ?序到后臺就停止定位)
? ? ? ? ? ? [_mgrrequestWhenInUseAuthorization];
? ? ? ? ? ?}
? ? ? ?4.2 應用始終使用定位服務(應用在前臺和后臺都能獲取到定位服務)——這種方式用戶反感
? ? ? ? ? ?1)配置info.plist相關key(NSLocationAlwaysUsageDescription)
? ? ? ? ? ?2)做好低版本適配
? ? ? ? ? ?if([_mgrrespondsToSelector:@selector(requestWhenInUseAuthorization)]){
? ? ? ? 1.2.2應用始終使用定位服務(應用在前臺和后臺都能獲取到定位服務) //用戶反感
? ? //反感是因為授權提示是 :@"應用未打開時,允許定位"
? ? ? ? ? ? ? ? ?[_mgrrequestAlwaysAuthorization];
? ? ? ? ? }
? ? ? ?4.3 應用開啟臨時后臺(設置后臺運行模式) (常用模式)
? ? ? ? ? ? ? ? 1)?配置info.plist相關key ( 這里需要新加一個選項 選擇: Required background modes->打開items->選取App registers for location updates(定位后臺運行的模式))? — 在ios8 之前只要設置這個就行了
? ? ? ? ? ? ??2)?在ios8以后就是ios9的一個新特性需要再加上一句代碼 才能執行這個功能
?IOS9新特性要求代碼允許mgr執行后臺運行模式
_mgr.allowsBackgroundLocationUpdates=YES;//這是獲取后臺定位 前臺授權還需要再設置 要是不要后臺定位 這個就不要設置
注意 : 這個時候 用戶反感的那個就要取消掉不用,但是前臺的授權模式還是要打開
5. 設置代理 ? 同時遵守協議 ??
1.3獲取數據設置代理? <遵守協議 :CLLocationManagerDelegate>
_mgr.delegate=self;
6. 開啟定位 ? ? ? ? ? ? ? [_mgrstartUpdatingLocation];
7. 實現CLLocationManagerDelegate 代理方法
當更新位置時調用 ? ?底層是異步操作定位
-(void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray *)locations{
CLLocation : 位置對象包含了位置信息這個里面有很多其他的屬性可以設置? 點擊頭文件查看即可
CLLocation*location = locations.lastObject;
NSLog(@"%f,%f",location.coordinate.latitude,location.coordinate.longitude);
停止定位
[_mgr stopUpdatingLocation];
}
?寫到這里 基本的 定位(后臺前臺)都講完了 ? 還有其他的設置優化持續定位 如下:?
? ? ?優化持續定位 ?: (經緯度不變的情況下 就不用一直不斷的去請求)
?1. ?距離篩選器 ?減少不必要的回調
_mgr.distanceFilter = 10;
2 ?設置期望精確度 ?減少耗電量(減少能耗)
_mgr.desiredAccuracy=kCLLocationAccuracyBestForNavigation;//這個還有很多枚舉值可以根據自己需要的進行選取
? 謝謝! ! ?希望能幫到大家