定位於定位優化(iOS)

定位於定位優化

1.定位的方案

最近在作項目, 遇到了一個問題就是如何讓iOS7~~iOS9的定位.由於項目需求只是須要獲取用戶所在的城市, 而不用十分具體詳細的精肯定位, 服務端考慮用區號, 做爲標識,可是看了百度的SDK, 不忍吐槽.最後決定用高德的SDK進行定位的開發.高德的定位SDK也是基於CoreLocation框架進行二次的開發, 可是其提供具體的區號, 十分方便與服務端進行相應的邏輯開發.若是用原生的, 在大陸可能存在各類各樣的問題, 由於大陸的iphone手機有韓版, 日版, 歐版, 美版, 就差沒非版了, 這些手機獲取的定位信息會存在七七八八的非中文編碼, 十分頭疼.因此就採用高德的定位SDK進行統一的定位解決.git

2.定位的邏輯

使用高德的SDK定位, 十分簡單, 直接導入其框架的主頭文件github

import <AMapLocationKit/AMapLocationKit.h>

.不要問我框架的主頭文件是啥.接着直接使用高德的一次性定位,緩存

[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
                
                if (!error) {   
                    


                }
            }];

在異步回調的block中就有相應的信息.若是出錯error會有值, 不爲空.框架

3.用戶的體驗:(跳轉到開啓定位服務)

咱們知道當用戶關閉定位服務, 或者禁止本程序進行定位的時候,最後是能在App中就直接跳轉到相應的設置界面進行設置.這裏爲了程序的兼容和響應速度, 我採用CCLocationManager這個自帶的類進行判斷.爲何不使用高德的一次性定位, 進行間接的判斷, 當error有值時候,提示開啓定位服務.這裏主要存在的問題是由於, 高德提供的一次性定位, 的定位速度不快, 我本身用起來都以爲很慢, 因此當用戶點了定位, 還用等你去作定位請求後, 再經過這個定位結果判斷是否開啓定位服務, 是十分不合理的.因此個人思路即是採用CCLocationManager進行精確度最低的定位.iphone

具體的邏輯就是異步

1.先判判定位服務是否開啓優化

2.若是定位服務開啓, 則判斷當前程序的定位權限是否受權.我是直接經過CCLocationManager對象的startUpdatingLocation方法, 讓其開始定位,而後在代理方法中進行判斷,若是定位權限是開啓的就會回調編碼

locationManager:didUpdateLocations:

不然回調的是線程

locationManager:didFailWithError:

而當回調了didUpdateLocations時候咱們就能夠判定,定位服務是開啓的,而且定位權限已經受權給應用程序, 則能夠調用高德的SDK開始定位, 或者跳轉到響應控制器中進行定位和具體的業務處理.代理

固然了, 無論是調用了上面哪一個的代理方法, 都用調用定位管理器stopUpdatingLocation, 中止定位.由於咱們只是須要知道這個信息, 不須要再繼續定位.

4.關於定位的優化:

在程序中關於定位我作了兩重的優化.或者說是緩存.

第一級緩存: 一進入應用程序後, 若是定位服務是開啓的, 則開一個優先級最高的線程進行高德的一次定位.若是定位成功, 則將緩存中的定位信息清空, 寫入新的定位信息.

第二季緩存: 在通過響應的控制器進行定位以前, 先從一級緩存中取到定位信息.若是有定位信息, 則再也不進行高德的一次性定位, 若是沒有定位信息, 則繼續進行高德的一次性定位, 若是定位成功, 將定位信息寫入緩存.

通過這樣的優化, 定位服務是十分快速的~具體工程代碼不披露了.涉及到公司的業務.大概的技術思路就是這樣.

後續會用空,我會封裝適用於國內的一個定位的第三方框架.上傳到github, 敬請關注

相關文章
相關標籤/搜索