iOS中的定位功能

iOS中的定位功能

CoreLocation框架(CoreLocation.framework)可用于定位設(shè)備當(dāng)前的經(jīng)緯度薪前,通過(guò)該框架,應(yīng)用程序可通過(guò)附近的蜂窩基站苍狰、WIFI信號(hào)或者GPS等信息計(jì)算用戶位置露筒。
iOS SDK提供了CLLocationManager、CLLocationManagerDelegate來(lái)處理設(shè)備的定位信息废酷,包括獲取設(shè)備的方向以及進(jìn)行方向檢測(cè)等瘟檩。

iOS開(kāi)發(fā)者使用CoreLocation.framework框架進(jìn)行定位非常簡(jiǎn)單,CoreLocation框架的常用API主要有如下幾個(gè):

  • CLLocationManager:定位管理器類澈蟆;
  • CLLocationManagerDelegate:該協(xié)議代表定位管理器的delegate協(xié)議墨辛。實(shí)現(xiàn)該協(xié)議的對(duì)象可負(fù)責(zé)處理CLLocationManager的定位事件;
  • CLLocation:該對(duì)象代表位置趴俘。該對(duì)象包含了當(dāng)前設(shè)備的經(jīng)度睹簇、緯度、高度寥闪、速度太惠、路線等信息,還包含了該定位信息的水平精確度疲憋、垂直精確度以及時(shí)間戳信息凿渊;
  • CLHeading:該對(duì)象代表設(shè)備的移動(dòng)方向;
  • CLRegion:該對(duì)象代表一個(gè)區(qū)域缚柳。一般程序不會(huì)直接使用該類埃脏,而是使用它的兩個(gè)子類,即CLCircularRegion(圓形區(qū)域)和CLBeaconRegion(藍(lán)牙信號(hào)區(qū))喂击;
    除此之外剂癌,CoreLocation框架還涉及一個(gè)CLLocationCoordinate2D結(jié)構(gòu)體變量,該結(jié)構(gòu)體變量包含經(jīng)度翰绊、緯度兩個(gè)值佩谷,其中CLLocation對(duì)象的coordinate屬性就是一個(gè)CLLocationCoordinate2D結(jié)構(gòu)體變量旁壮。

通過(guò)上述API不難看出,通過(guò)定位我們可以做什么?

  • 獲取用戶當(dāng)前位置,記錄路線軌跡等
  • 監(jiān)控行車速度和行車距離
  • 方向監(jiān)測(cè)
  • 指南針
  • 區(qū)域監(jiān)聽(tīng),比如用戶進(jìn)入某個(gè)區(qū)域時(shí)推廣某些信息,考勤打卡等

1.定位常用屬性和方法

1.0請(qǐng)求定位步驟

  • 導(dǎo)入CoreLocation框架
  • 懶加載CLLocationManager對(duì)象
  • 請(qǐng)求授權(quán) (1) 使用期間whenInUse (2) 始終允許always
  • 注意:必須把授權(quán)對(duì)應(yīng)的key值 添加到info.plist文件中
  • 設(shè)置代理,實(shí)現(xiàn)代理方法
  • 開(kāi)始定位

1.1獲取定位權(quán)限

定位屬于用戶的隱私權(quán)限,所以當(dāng)APP需要使用這一權(quán)限的時(shí)候,需要獲取用戶的授權(quán).
在獲取授權(quán)之前,我們必須把授權(quán)對(duì)應(yīng)的key值 添加到info.plist文件中,否則可能會(huì)引起APP crash或者審核不通過(guò).
跟定位相關(guān)的隱私權(quán)限主要有兩種,

  • NSLocationWhenInUseUsageDescription(使用期間)
  • NSLocationAlwaysUsageDescription(始終允許)

通俗的說(shuō),如果只是一次性定位,不需要持續(xù)定位的話,這倆實(shí)際并無(wú)區(qū)別.
而持續(xù)定位時(shí)這倆的差別,會(huì)單獨(dú)在后面講后臺(tái)持續(xù)定位的時(shí)候提及.

1.2定位屬性的應(yīng)用

精確度desiredAccuracy

desiredAccuracy精確度越高,越耗電,屬性接收double類型的值,也可以傳系統(tǒng)給定好的值
系統(tǒng)給出的枚舉類型有以下:

  • kCLLocationAccuracyBestForNavigation: 導(dǎo)航精確度(最精確)
  • kCLLocationAccuracyBest: 最好精確度(默認(rèn))
  • kCLLocationAccuracyNearestTenMeters: 10米的誤差
  • kCLLocationAccuracyHundredMeters: 100米的誤差
  • kCLLocationAccuracyKilometer: 千米誤差
  • kCLLocationAccuracyThreeKilometers: 三千米的誤差

距離過(guò)濾distanceFilter

設(shè)置用于移動(dòng)多少距離,重新進(jìn)行定位
枚舉類型同精確度,也是一個(gè)float值.

1.3位置信息的獲取

通過(guò)代理方法,我們可以獲取到更新后的位置信息.以下是位置具體屬性的圖示.

cllocation.png

1.3后臺(tái)持續(xù)定位

之前產(chǎn)品提了一個(gè)需求,想持續(xù)上報(bào)司導(dǎo)的位置信息,這就需要用到我們的后臺(tái)持續(xù)定位功能了.
使用后臺(tái)定位需要以下設(shè)置:

  • 選中target-->Gapability,打開(kāi)Background Modes模式谐檀,并勾選Location updates,如下圖所示:
background.png
  • 設(shè)置允許后臺(tái)更新位置的屬性.需注意的是,該屬性必須和上一條設(shè)置配合使用,否則會(huì)crash

     if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")) {
        // 該模式是抵抗程序在后臺(tái)被殺抡谐,申明不能夠被暫停
        self.locationManager.allowsBackgroundLocationUpdates = YES;
        
    }
    self.locationManager.pausesLocationUpdatesAutomatically = NO;

為什么要進(jìn)行以上設(shè)置呢?
因?yàn)閕OS系統(tǒng)下,當(dāng)APP進(jìn)入后臺(tái)時(shí),過(guò)三分鐘之后,APP會(huì)自動(dòng)進(jìn)入掛起模式,也就是說(shuō)如果不做任何處理的情況下,定位會(huì)被系統(tǒng)終止掉.當(dāng)用戶再進(jìn)入APP的時(shí)候,定位又重新開(kāi)始.所以才說(shuō)APP使用定位的授權(quán)選項(xiàng),使用應(yīng)用期間和始終其實(shí)區(qū)別不大.如果不想被終止,就得通過(guò)后臺(tái)模式設(shè)置,向蘋(píng)果聲明,APP在后臺(tái)需要操作的權(quán)限,這樣定位功能才得以保留.

使用定位的授權(quán)選項(xiàng),使用應(yīng)用期間和始終,唯一的區(qū)別就是,當(dāng)APP退到后臺(tái)并持續(xù)定位時(shí),使用應(yīng)用期間的權(quán)限下,APP頂部狀態(tài)欄會(huì)有個(gè)藍(lán)色的條,提示用戶當(dāng)前APP一直在使用定位.而始終這個(gè)選項(xiàng)則不會(huì).

說(shuō)到這里,之前GAPP按照以上設(shè)置,功能正常,但是在提交appstore的時(shí)候被拒絕了,理由是,審核人員不認(rèn)為我們的APP需要持續(xù)定位.后來(lái)在筆者申訴加重新提審的情況下,蘋(píng)果體諒的給我們通過(guò)了.

持續(xù)定位優(yōu)化方案,可以從以下幾個(gè)維度考慮:

  • 精度
  • 過(guò)濾距離范圍
  • 定時(shí)
  • 重大位置變化比如方向等

耗電測(cè)試:
1.位置相對(duì)固定時(shí),自動(dòng)更新位置和交替精度(精度非常精確和寬泛時(shí)定時(shí)切換)的對(duì)比實(shí)驗(yàn);
2.位置更新比較頻繁情況下,二者的對(duì)比

第一種情況下,自動(dòng)更新位置能堅(jiān)持8個(gè)小時(shí)左右,交替精度大概在6小時(shí);
第二種情況下,由于位置變動(dòng)時(shí)間只在一個(gè)小時(shí)左右,差別不太明顯;

針對(duì)GAPP產(chǎn)品提出想要定時(shí)持續(xù)更新司導(dǎo)位置的需求,最終采取了第二種方案.

2.計(jì)算經(jīng)緯度之間的距離

計(jì)算經(jīng)緯度之間的距離所需步驟:

  • 獲取當(dāng)前位置信息
  • 獲取另一個(gè)位置的經(jīng)緯度
  • 計(jì)算兩個(gè)位置的距離
distance.png

3.地理編碼&反地理編碼

地理編碼:輸入地理名稱,地理編碼獲得該位置的經(jīng)緯度.

反地理編碼:輸入經(jīng)緯度,輸出對(duì)應(yīng)位置的地理名稱

地理編碼步驟

  • 創(chuàng)建 CLGeocoder對(duì)象
  • 對(duì)地理名稱進(jìn)行地理編碼
  • 對(duì)閉包中的CLPlacemark數(shù)據(jù)就行解析(遍歷)
    一個(gè)地理名稱可能對(duì)應(yīng)多個(gè)地方,所以編碼后的到的結(jié)果是一個(gè)數(shù)組
  • 獲取數(shù)組中元素的地理位置(經(jīng)緯度)
  • 將經(jīng)緯度顯示到界面

反地理編碼步驟

  • 拿到用戶輸入的經(jīng)緯度
  • 對(duì)經(jīng)緯度進(jìn)行反地理編碼
  • 對(duì)閉包中的CLPlacemark數(shù)據(jù)就行解析(遍歷)
    一個(gè)經(jīng)緯度可能對(duì)應(yīng)多個(gè)位置(蘋(píng)果這么設(shè)計(jì)的) 所以編碼后返回一個(gè)數(shù)組
    一個(gè)位置包含多個(gè)信息(省/市/街道/國(guó)家/經(jīng)緯度/) 編碼后的結(jié)果是字典數(shù)組
  • 取出數(shù)組中的一個(gè)位置(字典),再獲取位置信息(取出字典的元素)
  • 把獲取到的地理名稱顯示到界面

關(guān)于地理編碼和反地理編碼的實(shí)例,放到區(qū)域監(jiān)聽(tīng)的demo里做一并說(shuō)明.

4.區(qū)域監(jiān)聽(tīng) region

當(dāng)用戶進(jìn)入或者離開(kāi)某個(gè)區(qū)域的時(shí)候,對(duì)應(yīng)進(jìn)行某些操作
實(shí)例:打卡

筆者仿照釘釘寫(xiě)的打卡的小demo,大概功能如下:
1.當(dāng)不在考勤范圍內(nèi)時(shí),打卡顯示外勤打卡,顏色區(qū)分顯示,并提示當(dāng)前打卡位置
2.當(dāng)位置更換,進(jìn)入考勤范圍時(shí),顏色改變,打卡顯示正常打卡,并提示當(dāng)前打卡位置

4.1區(qū)域監(jiān)聽(tīng)步驟:

  • 確定區(qū)域中心坐標(biāo)點(diǎn)
  • 確定區(qū)域半徑
  • 區(qū)域監(jiān)聽(tīng)方法,離開(kāi)某個(gè)區(qū)域和進(jìn)入某個(gè)區(qū)域時(shí)做相應(yīng)處理

4.2注意點(diǎn)

  • 當(dāng)之前添加過(guò)監(jiān)聽(tīng)區(qū)域時(shí),再次添加新的監(jiān)聽(tīng)區(qū)域,還會(huì)對(duì)之前的區(qū)域進(jìn)行監(jiān)聽(tīng)
  • 不想監(jiān)聽(tīng)之前的區(qū)域,必須通過(guò)代碼移除之前的區(qū)域
  • 使用前先判斷區(qū)域監(jiān)聽(tīng)是否可用
  • 注意監(jiān)聽(tīng)區(qū)域的個(gè)數(shù) (區(qū)域監(jiān)聽(tīng)個(gè)數(shù)有上限)
  • 注意區(qū)域半徑是否大于最大監(jiān)聽(tīng)半徑
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桐猬,隨后出現(xiàn)的幾起案子麦撵,更是在濱河造成了極大的恐慌,老刑警劉巖溃肪,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件免胃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惫撰,警方通過(guò)查閱死者的電腦和手機(jī)羔沙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厨钻,“玉大人扼雏,你說(shuō)我怎么就攤上這事『话颍” “怎么了诗充?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)诱建。 經(jīng)常有香客問(wèn)我蝴蜓,道長(zhǎng),這世上最難降的妖魔是什么俺猿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任励翼,我火速辦了婚禮,結(jié)果婚禮上辜荠,老公的妹妹穿的比我還像新娘。我一直安慰自己抓狭,他們只是感情好伯病,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著否过,像睡著了一般午笛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苗桂,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天药磺,我揣著相機(jī)與錄音,去河邊找鬼煤伟。 笑死癌佩,一個(gè)胖子當(dāng)著我的面吹牛木缝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播围辙,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼我碟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了姚建?” 一聲冷哼從身側(cè)響起矫俺,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掸冤,沒(méi)想到半個(gè)月后厘托,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稿湿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年铅匹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缎罢。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伊群,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出策精,到底是詐尸還是另有隱情舰始,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布咽袜,位于F島的核電站丸卷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏询刹。R本人自食惡果不足惜谜嫉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凹联。 院中可真熱鬧沐兰,春花似錦、人聲如沸蔽挠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澳淑。三九已至比原,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杠巡,已是汗流浹背量窘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氢拥,地道東北人蚌铜。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓锨侯,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親厘线。 傳聞我的和親對(duì)象是個(gè)殘疾皇子识腿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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