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