CoreLocation(地理定位)的基本使用

一、CoreLocation框架使用前提

  1. 導(dǎo)入主頭文件
    #import <CoreLocation/CoreLocation.h>
    注意:CoreLocation框架中所有數(shù)據(jù)類(lèi)型的前綴都是CL;CoreLocation中使用CLLocationManager對(duì)象來(lái)做用戶定位。

二、CoreLocation框架使用流程

  1. 創(chuàng)建CoreLocation管理者

     CLLocationManager *manager = [[CLLocationManager alloc] init];
    

注意:創(chuàng)建CoreLocation管理者要變成屬性,使用強(qiáng)引用,因?yàn)関iewDidLoad方法執(zhí)行完畢,CLLocationManager是個(gè)局部變量,會(huì)被銷(xiāo)毀。

  1. 成為CoreLocationManager的代理,監(jiān)聽(tīng)獲取到的位置

     manager.delegate = self;
    
  2. 主動(dòng)要求用戶對(duì)應(yīng)用程序授權(quán)
    在iOS8以前,只有開(kāi)始定位,系統(tǒng)就會(huì)自動(dòng)要求用戶對(duì)你的應(yīng)用程序授權(quán)。從iOS8開(kāi)始,想要定位,必須先主動(dòng)要求用戶授權(quán),而且必須在info.plist文件中配置一項(xiàng)屬性才能彈出允許授權(quán)的窗口。

  • requestWhenInUseAuthorization:請(qǐng)求前臺(tái)的定位權(quán)限
  • requestAlwaysAuthorization:請(qǐng)求前臺(tái)和后臺(tái)的定位權(quán)限cc
  • NSLocationWhenInUseDescription:允許在前臺(tái)獲取GPS的描述
  • NSLocationAlwaysUsageDescription:允許在后臺(tái)獲取GPS的描述

開(kāi)發(fā)者可以在Info.plist中設(shè)置NSLocationUsageDescription說(shuō)明定位的目的(Privacy -
Location Usage Description)。一旦用戶選擇了“Don’tAllow”,意味著你的應(yīng)用無(wú)法使用定位功能,為了嚴(yán)謹(jǐn)起見(jiàn),最好在使用定位功能之前判斷當(dāng)前應(yīng)用的定位功能是否可用。CLLocationManager有個(gè)類(lèi)方法可以判斷當(dāng)前應(yīng)用的定位功能是否可用:

    + (BOOL)locationServicesEnabled;
  1. 開(kāi)始監(jiān)聽(tīng)(開(kāi)始獲取位置)
    調(diào)用[self.manager startUpdatingLocation],當(dāng)調(diào)用了startUpdatingLocation方法,就開(kāi)始不斷地定位用戶的位置,中途會(huì)頻繁地調(diào)用下面的代理方法:- (void)locationManager:(CLLocationManager)manager didUpdateLocations:(NSArray)locations;

  2. 實(shí)現(xiàn)CLLocationManager的代理方法
    (1)當(dāng)授權(quán)狀態(tài)發(fā)生改變時(shí)調(diào)用:

- (void)locationManager:(CLLocationManager*)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
if(status ==kCLAuthorizationStatusNotDetermined) {
NSLog(@"等待用戶授權(quán)");
}else if(status ==kCLAuthorizationStatusAuthorizedAlways||
status ==kCLAuthorizationStatusAuthorizedWhenInUse)
{
NSLog(@"授權(quán)成功");
//開(kāi)始定位
[self.mgr startUpdatingLocation];
}else
{
NSLog(@"授權(quán)失敗");
}
}

CLAuthorizationStatus枚舉類(lèi)型:

  • 用戶從未選擇過(guò)權(quán)限:kCLAuthorizationStatusNotDetermined
  • 無(wú)法使用定位服務(wù),該狀態(tài)用戶無(wú)法改變:kCLAuthorizationStatusRestricted
  • 用戶拒絕該應(yīng)用使用定位服務(wù),或是定位服務(wù)總開(kāi)關(guān)處于關(guān)閉狀態(tài):kCLAuthorizationStatusDenied
  • 已經(jīng)授權(quán)(廢棄):kCLAuthorizationStatusAuthorized
  • 用戶允許該程序無(wú)論何時(shí)都可以使用地理信息:kCLAuthorizationStatusAuthorizedAlways
  • 用戶同意程序在可見(jiàn)時(shí)使用地理位置:kCLAuthorizationStatusAuthorizedWhenInUse

(2)當(dāng)獲取到位置信息之后會(huì)調(diào)用:

- (void)locationManager:(CLLocationManager*)manager didUpdateLocations:(NSArray*)locations {
  //如果只需要獲取一次,可以獲取到位置之后就停止
  [self.mgr stopUpdatingLocation];
}

在該代理方法中,還可以獲取以下信息:

  • location.coordinate:坐標(biāo),包含經(jīng)緯度
  • location.altitude:設(shè)備海拔高度單位是米
  • location.course:設(shè)置前進(jìn)方向
  • location.horizontalAccuracy:水平精準(zhǔn)度
  • location.verticalAccuracy:垂直精準(zhǔn)度
  • location.timestamp:定位信息返回的時(shí)間
  • location.speed:設(shè)備移動(dòng)速度單位是米/秒,適用于行車(chē)速度而不太適用于不行

6.報(bào)錯(cuò)處理
使用CoreLocation獲取地理位置信息,報(bào)錯(cuò):
Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
解決方法:

  • 確定模擬器或者手機(jī)已經(jīng)聯(lián)網(wǎng)并且允許應(yīng)用程序獲取地理位置
  • 重置地理位置服務(wù)或者網(wǎng)絡(luò)服務(wù)
    ps:如果是模擬器就果斷直接重置模擬器吧 IOS Simulator - Reset Content and Settings...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 在移動(dòng)互聯(lián)網(wǎng)時(shí)代,移動(dòng)app能解決用戶的很多生活瑣事,比如 周邊:找餐館、找KTV、找電影院等等 導(dǎo)航:根據(jù)...
    JonesCxy閱讀 1,515評(píng)論 1 1
  • CoreLocation框架 一. iOS8.0之前的定位(?????) 前臺(tái)定位導(dǎo)入CoreLocation框架...
    尼古拉斯趙四爺閱讀 1,132評(píng)論 0 2
  • 出自http://my.oschina.net/are1OfBlog/blog/420034 摘要 現(xiàn)在很多社交、...
    JJO閱讀 4,305評(píng)論 4 19
  • CoreLocation框架 一. iOS8.0之前的定位(?????) 1. 前臺(tái)定位 導(dǎo)入CoreLocati...
    0271fb6f797c閱讀 584評(píng)論 0 1
  • 忙碌的一天終于結(jié)束了 累的癱在寢室,今天特種兵可以休息一下啦,不用簽到,還是有些不習(xí)慣了 下周估計(jì)面臨的挑戰(zhàn)更大,...
    珍珍_03b1閱讀 194評(píng)論 0 0

友情鏈接更多精彩內(nèi)容