后臺定位上傳實踐

前言


我現(xiàn)在做的是LBS定位的社交APP 其中主要的一個功能就是能夠?qū)崟r定位社交圈中各個成員的位置后臺實時上傳位置則是非常重要的一個技術(shù)點 接下來就來說說我關(guān)于這方面的實踐經(jīng)驗


需求

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

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

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

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

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

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

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

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

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

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

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

分析完需求 接下來就開始介紹如何實現(xiàn)



準備

首先做一些準備工作

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



然后在plist中添加NSLocationAlawaysUsageDescription的鍵 在value中隨便鍵入任何內(nèi)容

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

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

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


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

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

這里解釋一下這幾個參數(shù)

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

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

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

接下來是初始化函數(shù)

這里的默認值可以根據(jù)需求來調(diào)整

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

而這個adjustDistanceFilter函數(shù) 就是整個代碼的核心 會根據(jù)當前速度來動態(tài)的調(diào)整distanceFilter這個參數(shù) 以滿足我們的需求


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

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




接下來我們會討論一下相關(guān)的幾個問題

討論

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

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

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

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

為什么不使用allowDeferredLocationUpdatesUntilTraveled:timeout:

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

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

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



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末有送,一起剝皮案震驚了整個濱河市式散,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疹瘦,老刑警劉巖生蚁,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噩翠,死亡現(xiàn)場離奇詭異,居然都是意外死亡邦投,警方通過查閱死者的電腦和手機伤锚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來志衣,“玉大人屯援,你說我怎么就攤上這事∧罡” “怎么了狞洋?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绿店。 經(jīng)常有香客問我吉懊,道長,這世上最難降的妖魔是什么假勿? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任惕它,我火速辦了婚禮,結(jié)果婚禮上废登,老公的妹妹穿的比我還像新娘淹魄。我一直安慰自己,他們只是感情好堡距,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布甲锡。 她就那樣靜靜地躺著兆蕉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缤沦。 梳的紋絲不亂的頭發(fā)上虎韵,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音缸废,去河邊找鬼包蓝。 笑死,一個胖子當著我的面吹牛企量,可吹牛的內(nèi)容都是我干的测萎。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼届巩,長吁一口氣:“原來是場噩夢啊……” “哼硅瞧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恕汇,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤腕唧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘾英,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枣接,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年缺谴,在試婚紗的時候發(fā)現(xiàn)自己被綠了但惶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓣赂,死狀恐怖榆骚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煌集,我是刑警寧澤妓肢,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站苫纤,受9級特大地震影響碉钠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卷拘,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一喊废、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栗弟,春花似錦污筷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽陆蟆。三九已至,卻和暖如春惋增,著一層夾襖步出監(jiān)牢的瞬間叠殷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工诈皿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留林束,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓稽亏,卻偏偏與公主長得像壶冒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子措左,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,789評論 25 707
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,930評論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理依痊,服務(wù)發(fā)現(xiàn)避除,斷路器怎披,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,784評論 0 27
  • 坐我旁邊的前端今天正好初學(xué)axure瓶摆,然后我就順便學(xué)了幾招比較基礎(chǔ)的凉逛,這里做個筆記先。 首先我安裝的axure ...
    zhuyuansj閱讀 435評論 2 3