后臺定位上傳實踐

前言


我現在做的是LBS定位的社交APP 其中主要的一個功能就是能夠實時定位社交圈中各個成員的位置后臺實時上傳位置則是非常重要的一個技術點 接下來就來說說我關于這方面的實踐經驗


需求

先來看看實現這個功能的具體需求是什么 由于我們是實時定位的生活類社交APP 所以我們需要做到一下幾點

1. 如果用戶的位置在持續變化 則隔一段時間上報一次

由于我們希望能夠實時的將用戶的位置變化反饋在APP里 所以定時的上報是剛需

2. 如果用戶的移動速度很慢 則隔一段距離上報一次

如果用戶是低速率的狀態(比如步行的移動速度大概就是1m/s左右) 這個時候如果還按(1)中的方式來上報的話 由于變化太小 地圖上的點會非常的密集 這種數據的意義不大(而且如果要做軌跡服務的話 這些密集點都是必須優化掉的) 所以這時候我們按照距離間隔來上報

3. 如果用戶的位置在到達某處后沒有變化 則不繼續上報

我們只關心位置的變化 如果用戶的位置沒有變化或者變化很小 其實是不需要上報其位置的(比如進入的公司 或者等一個很長時間的紅燈) 這時候我們就不上報(以達到省電的目的)

4. 切換到后臺也要能定位上報

后臺上報是必須的 用戶不可能一直運行著我們的APP (iOS4開始就支持了)

5. APP因各種原因終止運行后(用戶主動關閉, 系統殺掉) 也要能定位上報

用戶主動關閉APP的幾率不大 但是因系統調度被殺掉的情況是很普遍的 這個時候我們也要能夠上報 (iOS7開始已支持被殺掉后喚醒)

分析完需求 接下來就開始介紹如何實現



準備

首先做一些準備工作

在target的Capabilities選項中打開Background Modes并勾選Location updates



然后在plist中添加NSLocationAlawaysUsageDescription的鍵 在value中隨便鍵入任何內容

完成這兩步 我們的前期工作就完成了Background Modes是iOS7帶入的新功能 而NSLocationAlawaysUsageDescription為了增強權限機制引入的提示描述 不添加這個的話 定位功能可是使用不了的 之后我們要調用requestAlwaysAuthorization提示中就會顯示這個描述

在評論中有朋友問起 為什么要使用requestAlwaysAuthorization而不使用requestWhenInUseAuthorization呢 我借用一張圖來說明一下

簡單來說 兩者的區別在于前者支持Region MonitoringSignificant Location Changes而后者不支持


但其實還有一個非常重要的區別 就是前者支持程序被殺掉后的系統自動喚醒而后者不支持 這是非常重要的一個區別

定位肯定要跟CLLocationManager打交道 所以我們先定義一個CLLocationManager的子類 并根據需求中的幾點定義三個變量

這里解釋一下這幾個參數

minSpeed如果當前運動速度大于此值 則滿足需求(1) 以時間為更新依據(minFilter) 如果當前運動速度小于此值 則滿足需求(2) 以范圍為更新依據(minInteval)

minFilter最小的觸發范圍 用于需求(1)

minInteval更新間隔 用于需求(2)

接下來是初始化函數

這里的默認值可以根據需求來調整

然后是位置更新后的處理邏輯 其實也非常的簡單

而這個adjustDistanceFilter函數 就是整個代碼的核心 會根據當前速度來動態的調整distanceFilter這個參數 以滿足我們的需求


這里要注意到的是distanceFilter這個參數不能一直進行設置 因為每次設置完以后 再接下來的一秒以后 會立即觸發didUpdateLocations回調(系統的標準最短更新間隔是1秒 即更新頻率為1hz) 所以這里只有當變化超過10%的時候才會重置distanceFilter

接下來 為了能夠正確的在被殺掉的情況下被喚醒 我們還要做最后一步操作 在AppDelegate的didFinishLaunchingWithOptions中加入下面的代碼




接下來我們會討論一下相關的幾個問題

討論

為什么不用定時器來控制定位間隔

網上有很多教程是用NSTimer來實現的 但是其實這樣不是很好 雖然定位的間隔是固定的 但是耗電的問題無法解決 后臺會持續的更新定位 無論當前的位置是否在更新 當然 如果你的使用場景就是要每隔一段時間來上傳 就可以使用定時器來處理

使用distanceFilter來處理 會有些什么問題

由于distanceFilter=currentSpeed*minInteval 那么間隔的時間因為速度的變化而會有波動 但是這個波動是在可接受范圍的 如果速度加快或者變慢 那么下一次的更新時間則會相應的縮短或者變長 但是因為我們是在真實生活環境中 速度的變化不可能那么快 所以這個誤差是可以接受的 另外我們對distanceFilter針對速度進行矯正 因而總體來說 間隔還是會保持在我們與其的范圍內的

為什么不使用allowDeferredLocationUpdatesUntilTraveled:timeout:

allowDeferredLocationUpdatesUntilTraveled是iOS6推出的一個新的API 看名字我們可以知道這個函數的作用是延遲位置更新 直到移動了xx米或者時間超過了xx秒 那么這個函數不正好滿足了我們的所有要求么? 可是萬萬沒想到 事情并不是這樣的 這個函數并不好用

接下來是吐槽時間 ?(????)

為什么說這個函數不好用呢? 首先 這個函數的要求很多 我們來看看要這個函數起作用要滿足哪些條件



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,606評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,582評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,540評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,028評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,801評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,223評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,294評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,442評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,976評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,800評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,996評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,543評論 5 360
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,233評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,926評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,702評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,662評論 25 708
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,056評論 6 13
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,785評論 18 139
  • 一、溫故而知新 1. 內存不夠怎么辦 內存簡單分配策略的問題地址空間不隔離內存使用效率低程序運行的地址不確定 關于...
    SeanCST閱讀 7,857評論 0 27
  • 坐我旁邊的前端今天正好初學axure,然后我就順便學了幾招比較基礎的,這里做個筆記先。 首先我安裝的axure ...
    zhuyuansj閱讀 448評論 2 3