iOS 關(guān)于前后臺(tái)定位的設(shè)置

這兩天把定位的功能仔細(xì)捋了一下,做個(gè)總結(jié):

用系統(tǒng)自帶的定位功能舉例吧

如果應(yīng)用只有簡(jiǎn)單的定位需求企锌,一般用系統(tǒng)自帶的定位功能就可以解決問(wèn)題了角寸,使用方法如下:

1、導(dǎo)入

CoreLocation.framework

2死相、使用的類(lèi)里引入頭文件

#import <CoreLocation/CoreLocation.h>

3融求、遵守定位的代理

<CLLocationManagerDelegate>

4、聲明定位功能管理對(duì)象

@property (nonatomic, strong) CLLocationManager* locationManager;

5算撮、檢測(cè)定位授權(quán)狀態(tài)

- (void)checkServiceStatus
 {
     if([CLLocationManager locationServicesEnabled]) {
         CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
         //確定用戶的位置服務(wù)啟用
         if(status == kCLAuthorizationStatusNotDetermined){
              //用戶未選擇生宛,繼續(xù)請(qǐng)求授權(quán)
              [self requestLocationServicesAuthorization];
          }else if(status == kCLAuthorizationStatusRestricted){
              //功能受限制县昂,嘗試提示用戶進(jìn)入設(shè)置頁(yè)面看一下(一般不會(huì)返回該值)
              
          }else if (status == kCLAuthorizationStatusDenied){
              //位置服務(wù)是在設(shè)置中禁用,用戶選擇了“不允許”
              UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"位置權(quán)限未開(kāi)啟陷舅,請(qǐng)到設(shè)置-隱私-定位中開(kāi)啟" preferredStyle:UIAlertControllerStyleAlert];
              UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"暫不" style:UIAlertActionStyleCancel handler:nil];
              UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"去設(shè)置" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                  //進(jìn)入系統(tǒng)設(shè)置頁(yè)面倒彰,APP本身的權(quán)限管理頁(yè)面
                  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
              }];
              [alert addAction:cancelAction];
              [alert addAction:okAction];
              [self presentViewController:alert animated:YES completion:nil];
              
          }else if(status == kCLAuthorizationStatusAuthorizedWhenInUse){
              //已授權(quán)使用
          }else if(status == kCLAuthorizationStatusAuthorizedAlways) {
             //已授權(quán)始終使用
          }
     }
 
 }

6、授權(quán)開(kāi)啟定位功能

//授權(quán)開(kāi)啟定位功能
- (void)requestLocationServicesAuthorization {
   
    if (!self.locationManager) {
        //初始化管理器
        self.locationManager  = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        self.locationManager.distanceFilter = 100.0f;
    }
    
    [self.locationManager requestAlwaysAuthorization];
    [self.locationManager requestWhenInUseAuthorization];
    //開(kāi)始定位
    [self.locationManager startUpdatingLocation];
}

7莱睁、target中的設(shè)置
(1)info.plist中添加定位相關(guān)的key
如果只需要前臺(tái)定位功能待讳,無(wú)需開(kāi)啟后臺(tái)定位,則只需要添加一個(gè)key即可:NSLocationWhenInUseUsageDescription仰剿,對(duì)應(yīng)的value是字符串创淡,就是彈出框的副標(biāo)題,顯示給用戶看的南吮,比如“App需要訪問(wèn)您的位置信息琳彩,以便為您提供最優(yōu)服務(wù)”之類(lèi)的,自己定義即可部凑。
如果前后臺(tái)定位都需要開(kāi)啟汁针,為了考慮iOS系統(tǒng)版本的問(wèn)題,需要再添加兩個(gè)key:NSLocationAlwaysAndWhenInUseUsageDescription(適用于iOS11之前的后臺(tái)定位) 和 NSLocationAlwaysUsageDescription (iOS11以后要使用后臺(tái)定位必加)砚尽,三個(gè)key對(duì)應(yīng)的value內(nèi)容最好都保持一致施无。
(2)如果需要啟用后臺(tái)定位功能,需要操作這一步


image.png

彈框輸入background Modes,找到這個(gè)選項(xiàng)必孤,雙擊一下就添加進(jìn)去了


image.png

這個(gè)選項(xiàng)需要勾選猾骡。
對(duì)了,順便說(shuō)一下敷搪,以前遠(yuǎn)程推送的服務(wù)也是點(diǎn)擊加號(hào)后自己去找到push notifications這一項(xiàng)兴想,雙擊添加的。
8赡勘、定位的代理方法
#pragma mark - ************** 定位的代理回調(diào)方法 **************************
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
     // 1.獲取用戶位置的對(duì)象
     CLLocation *location = [locations lastObject];
     CLLocationCoordinate2D coordinate = location.coordinate;
     NSLog(@"緯度:%f 經(jīng)度:%f", coordinate.latitude, coordinate.longitude);
     
     // 2.停止定位
     [manager stopUpdatingLocation];
    
    CLLocation *newLocation = [locations firstObject];
    CLGeocoder *geocoder = [[CLGeocoder alloc]init];
    [geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> *_Nullable placemarks, NSError * _Nullable error) {
            for (CLPlacemark *place in placemarks) {
                NSLog(@"name,%@",place.name);                      // 位置名
                NSLog(@"thoroughfare,%@",place.thoroughfare);      // 街道
                NSLog(@"subThoroughfare,%@",place.subThoroughfare);// 子街道
                NSLog(@"locality,%@",place.locality);              // 市
                NSLog(@"subLocality,%@",place.subLocality);        // 區(qū)
                NSLog(@"country,%@",place.country);                // 國(guó)家
            }
        }];
  
 }
 //定位失敗
 - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
     if (error.code == kCLErrorDenied) {
         // 提示用戶出錯(cuò)原因嫂便,kCLErrorDenied是個(gè)枚舉值,可查看其它錯(cuò)誤原因
     }
 }

至此闸与,定位的簡(jiǎn)單應(yīng)用已完成毙替,后面是一些對(duì)細(xì)節(jié)的講解:
針對(duì)第六步中的兩個(gè)方法:

 [self.locationManager requestAlwaysAuthorization];
 [self.locationManager requestWhenInUseAuthorization];

(1)如果項(xiàng)目中前后臺(tái)定位都需要使用,直接調(diào)用上面這個(gè)方法即可践樱,plist中的key值也需要添加那三個(gè)厂画。
(2)如果只需要前臺(tái)定位,那就調(diào)用下面的方法拷邢,key值只寫(xiě)一個(gè)使用中的就行袱院。
(3)這兩個(gè)方法的作用就是主動(dòng)調(diào)起系統(tǒng)的定位權(quán)限彈窗,一定要在調(diào)用startUpdatingLocation方法前調(diào)用這個(gè)兩個(gè)方法其中的一個(gè),如果都不調(diào)忽洛,則無(wú)法彈出權(quán)限彈窗腻惠。
(4)如果key里面配置了后臺(tái)定位功能,但你調(diào)用的是下面[self.locationManager requestWhenInUseAuthorization];方法欲虚,則彈窗提示詢問(wèn)用戶是否在應(yīng)用使用期間定位集灌,選項(xiàng)也只有允許和不允許兩個(gè),用戶如果要開(kāi)啟后臺(tái)定位苍在,只能自己去設(shè)置-隱私-定位中找到app绝页,把定位權(quán)限從使用期間切換到始終允許上面荠商,彈窗里不能選擇始終允許寂恬,所以如果需要使用后臺(tái)定位,務(wù)必定位前要調(diào)用上面[self.locationManager requestAlwaysAuthorization];這個(gè)方法莱没,這樣用戶在彈窗里就可以選擇授權(quán)的權(quán)限初肉。

如有不對(duì)的地方,煩請(qǐng)多多指正饰躲,謝謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末牙咏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘹裂,更是在濱河造成了極大的恐慌妄壶,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寄狼,死亡現(xiàn)場(chǎng)離奇詭異丁寄,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)泊愧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)伊磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人删咱,你說(shuō)我怎么就攤上這事屑埋。” “怎么了痰滋?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵摘能,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我敲街,道長(zhǎng)徊哑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任聪富,我火速辦了婚禮莺丑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己梢莽,他們只是感情好萧豆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著昏名,像睡著了一般涮雷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轻局,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天洪鸭,我揣著相機(jī)與錄音,去河邊找鬼仑扑。 笑死览爵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镇饮。 我是一名探鬼主播蜓竹,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼储藐!你這毒婦竟也來(lái)了俱济?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钙勃,失蹤者是張志新(化名)和其女友劉穎蛛碌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體辖源,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔚携,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了同木。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮梢。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖彤路,靈堂內(nèi)的尸體忽然破棺而出秕硝,到底是詐尸還是另有隱情,我是刑警寧澤洲尊,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布远豺,位于F島的核電站,受9級(jí)特大地震影響坞嘀,放射性物質(zhì)發(fā)生泄漏躯护。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一丽涩、第九天 我趴在偏房一處隱蔽的房頂上張望棺滞。 院中可真熱鬧裁蚁,春花似錦、人聲如沸继准。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)移必。三九已至室谚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崔泵,已是汗流浹背秒赤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憎瘸,地道東北人入篮。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像含思,于是被迫代替她去往敵國(guó)和親崎弃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子甘晤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容