iOS中的定位功能

iOS中的定位功能

CoreLocation框架(CoreLocation.framework)可用于定位設(shè)備當前的經(jīng)緯度,通過該框架,應(yīng)用程序可通過附近的蜂窩基站、WIFI信號或者GPS等信息計算用戶位置。
iOS SDK提供了CLLocationManager、CLLocationManagerDelegate來處理設(shè)備的定位信息,包括獲取設(shè)備的方向以及進行方向檢測等。

iOS開發(fā)者使用CoreLocation.framework框架進行定位非常簡單,CoreLocation框架的常用API主要有如下幾個:

  • CLLocationManager:定位管理器類;
  • CLLocationManagerDelegate:該協(xié)議代表定位管理器的delegate協(xié)議。實現(xiàn)該協(xié)議的對象可負責處理CLLocationManager的定位事件;
  • CLLocation:該對象代表位置。該對象包含了當前設(shè)備的經(jīng)度、緯度、高度、速度、路線等信息,還包含了該定位信息的水平精確度、垂直精確度以及時間戳信息;
  • CLHeading:該對象代表設(shè)備的移動方向;
  • CLRegion:該對象代表一個區(qū)域。一般程序不會直接使用該類,而是使用它的兩個子類,即CLCircularRegion(圓形區(qū)域)和CLBeaconRegion(藍牙信號區(qū));
    除此之外,CoreLocation框架還涉及一個CLLocationCoordinate2D結(jié)構(gòu)體變量,該結(jié)構(gòu)體變量包含經(jīng)度、緯度兩個值,其中CLLocation對象的coordinate屬性就是一個CLLocationCoordinate2D結(jié)構(gòu)體變量。

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

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

1.定位常用屬性和方法

1.0請求定位步驟

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

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

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

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

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

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

精確度desiredAccuracy

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

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

距離過濾distanceFilter

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

1.3位置信息的獲取

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

cllocation.png

1.3后臺持續(xù)定位

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

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

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

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

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

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

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

  • 精度
  • 過濾距離范圍
  • 定時
  • 重大位置變化比如方向等

耗電測試:
1.位置相對固定時,自動更新位置和交替精度(精度非常精確和寬泛時定時切換)的對比實驗;
2.位置更新比較頻繁情況下,二者的對比

第一種情況下,自動更新位置能堅持8個小時左右,交替精度大概在6小時;
第二種情況下,由于位置變動時間只在一個小時左右,差別不太明顯;

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

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

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

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

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

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

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

地理編碼步驟

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

反地理編碼步驟

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

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

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

當用戶進入或者離開某個區(qū)域的時候,對應(yīng)進行某些操作
實例:打卡

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

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

  • 確定區(qū)域中心坐標點
  • 確定區(qū)域半徑
  • 區(qū)域監(jiān)聽方法,離開某個區(qū)域和進入某個區(qū)域時做相應(yīng)處理

4.2注意點

  • 當之前添加過監(jiān)聽區(qū)域時,再次添加新的監(jiān)聽區(qū)域,還會對之前的區(qū)域進行監(jiān)聽
  • 不想監(jiān)聽之前的區(qū)域,必須通過代碼移除之前的區(qū)域
  • 使用前先判斷區(qū)域監(jiān)聽是否可用
  • 注意監(jiān)聽區(qū)域的個數(shù) (區(qū)域監(jiān)聽個數(shù)有上限)
  • 注意區(qū)域半徑是否大于最大監(jiān)聽半徑
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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