精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

后臺定位上傳的代碼實踐

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

[[142068]]

前言

之前的文章說過 我現在做的是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為了增強權限機制引入的提示描述 不添加這個的話 定位功能可是使用不了的

代碼

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

  1. @interface MMLocationManager : CLLocationManager 
  2. + (instancetype)sharedManager; 
  3. @property (nonatomic, assign) CGFloat minSpeed; //最小速度 
  4. @property (nonatomic, assign) CGFloat minFilter; //最小范圍 
  5. @property (nonatomic, assign) CGFloat minInteval; //更新間隔 
  6. @end 

這里解釋一下這幾個參數

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

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

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

接下來是初始化函數

  1. - (instancetype)init 
  2. self = [super init]; 
  3. if ( self ) 
  4. self.minSpeed = 3
  5. self.minFilter = 50
  6. self.minInteval = 10
  7. self.delegate = self; 
  8. self.distanceFilter = self.minFilter; 
  9. self.desiredAccuracy = kCLLocationAccuracyBest; 
  10. return self; 

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

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

  1. - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
  2. CLLocation *location = locations[0]; 
  3. NSLog(@"%@",location); 
  4. //根據實際情況來調整觸發范圍 
  5. [self adjustDistanceFilter:location]; 
  6. //上傳數據 
  7. [self uploadLocation:location]; 

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

  1. /** 
  2. * 規則: 如果速度小于minSpeed m/s 則把觸發范圍設定為50m 
  3. * 否則將觸發范圍設定為minSpeed*minInteval 
  4. * 此時若速度變化超過10% 則更新當前的觸發范圍(這里限制是因為不能不停的設置distanceFilter, 
  5. * 否則uploadLocation會不停被觸發) 
  6. */ 
  7. - (void)adjustDistanceFilter:(CLLocation*)location 
  8. // NSLog(@"adjust:%f",location.speed); 
  9.  
  10. if ( location.speed < self.minSpeed ) 
  11. if ( fabs(self.distanceFilter-self.minFilter) > 0.1f ) 
  12. self.distanceFilter = self.minFilter; 
  13. else 
  14. CGFloat lastSpeed = self.distanceFilter/self.minInteval; 
  15.  
  16. if ( (fabs(lastSpeed-location.speed)/lastSpeed > 0.1f) || (lastSpeed < 0) ) 
  17. CGFloat newSpeed = (int)(location.speed+0.5f); 
  18. CGFloat newFilter = newSpeed*self.minInteval; 
  19.  
  20. self.distanceFilter = newFilter; 

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

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

  1. if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { 
  2.  
  3. if ( [[MMLocationManager sharedManager] respondsToSelector:@selector(requestAlwaysAuthorization)] ) 
  4. [[MMLocationManager sharedManager] requestAlwaysAuthorization]; 
  5. //這是iOS9中針對后臺定位推出的新屬性 不設置的話 可是會出現頂部藍條的哦(類似熱點連接) 
  6. if ( [self respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) 
  7. [MMLocationManager sharedManager].allowsBackgroundLocationUpdates = YES; 
  8. [[MMLocationManager sharedManager] startUpdatingLocation]; 

這是因為被殺掉的APP 在后臺被系統喚醒時 launchOptions會包含UIApplicationLaunchOptionsLocationKey**字段來進行標識 這時我們再重新啟動定位功能即可

至此 滿足我們需求的定位功能就完成了 為此我寫了一個demo來驗證(使用模擬器 然后選擇Debug->Location->Freeway Drive) 結果如下

 

 

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

討論

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

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

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

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

為什么不使用allowDeferredLocationUpdatesUntilTraveled:timeout:

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

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

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

必須iPhone5以及之后的硬件設備才支持

desiredAccuracy必須設置為kCLLocationAccuracyBest或者kCLLocationAccuracyBestForNavigation

distanceFilter必須設置為kCLDistanceFilterNone

只在APP運行在后臺時生效 前臺運行時是不會進行延遲處理的

只有系統在低功耗(Low Power State)的時候才有可能生效

關于Low Power State在iOS中的描述 我只在蘋果官網的文檔中找到部分定義

iOS is very good at getting a device into a low power state when it’s not being used. At idle, very little power is drawn and energy impact is low. When tasks are actively occurring, system resources are being used and those resources require energy. However, sporadic tasks can cause the device to enter an intermediate state—neither idle nor active—when the device isn’t doing anything. There may not be enough time during these intermediate states for the device to reach absolute idle before the next task executes. When this occurs, energy is wasted and the user’s battery drains faster.

據我簡單的了解 這個**Low Power State”只有在黑屏的狀態下(不只是鎖屏)才有可能觸發 只要有任何電量屏幕的操作(就連推送也算) 都會使APP退出這個狀態 同時 如果在充電狀態下 也是無法進入的

我嘗試在真機和模擬器上使用這個API 但結果APP還是以1HZ的頻率在定位(設置了kCLDistanceFilterNone的原因)

雖然locationManager:didFinishDeferredUpdatesWithError:在指定的時間后成功的回調了 但是結果還是沒有deffer 于是我查了一下 原來這個函數無法直接進行調試的 因為:

不支持模擬器 deferredLocationUpdatesAvailable用于檢測設備是否支持 模擬器會返回NO

不支持真機調試 因為調試時Xcode會阻止程序休眠 導致程序無法進入低功耗狀態

結論就是…這個東西連調試都沒辦法 所以我也沒有那么多時間跑到外面去測試這個東西… 況且使用我上述的方法已經基本可以滿足需求… 所以我已放棄繼續研究這個API了 因為就算使用了這個東西 也僅僅是錦上添花而已

如果有哪些同學知道如何正確的使用這個東西 請留言告訴我 萬分感謝!

小結

文中的demo可以在這里找到 另外demo中用到了Realm來存儲數據(模擬上傳操作) 有興趣的同學可以看一下

責任編輯:chenqingxiang 來源: 里脊串的開發隨筆
相關推薦

2015-07-23 10:09:45

后臺定位代碼

2023-11-06 09:56:10

研究代碼

2012-09-29 10:09:19

網站架構后臺構建架構

2023-01-05 07:54:49

vivo故障定位

2018-01-16 16:32:12

架構前臺后臺

2022-05-24 16:14:01

CSS實踐

2015-06-24 10:06:09

iOS 9適配后臺

2020-03-09 14:10:48

代碼開發工具

2023-04-28 08:06:04

低代碼AI智能

2014-10-29 13:52:38

程序員

2021-09-08 09:37:54

工具代碼Python

2012-08-09 09:10:56

代碼審查代碼

2015-09-23 10:14:48

iOS 代碼實踐

2020-05-25 11:14:59

代碼程序開發

2017-05-12 09:24:21

Python代碼Logger

2015-01-29 09:52:43

Swift 開源蘋果

2025-11-21 08:02:39

2018-01-12 14:37:34

Java代碼實踐

2018-05-10 15:06:43

Java Web分層實踐

2015-08-13 09:39:41

點贊
收藏

51CTO技術棧公眾號

欧美一级视频| 美女亚洲一区| 亚洲成人动漫一区| 欧美精品成人一区二区在线观看| 毛片在线免费播放| 亚洲一区色图| 精品调教chinesegay| 色一情一区二区| av女在线播放| 国产精品大尺度| 久久久久久一区| 国产乱码一区二区| 视频一区二区中文字幕| 欧美精品一二区| 337人体粉嫩噜噜噜| 高清精品视频| 欧美军同video69gay| 日本中文字幕网址| 精品欧美色视频网站在线观看| 97精品电影院| 99re资源| 国产一区二区麻豆| 天堂久久久久va久久久久| 欧美日韩电影在线观看| 亚洲不卡的av| 精品久久久久久久| 亚洲精品美女久久久久| 不许穿内裤随时挨c调教h苏绵| 成人午夜一级| 一本一本久久a久久精品综合麻豆| 欧美 亚洲 视频| 三区四区在线视频| 久久久久99精品国产片| 国产专区一区二区三区| 国产高清视频免费| 激情文学综合插| 国产精品视频一区国模私拍| 在线观看中文字幕视频| 在线国产精品一区| 欧美日韩国产va另类| 艳妇荡乳欲伦69影片| 不卡在线一区二区| 国产一区二区三区高清在线观看| 男生裸体视频网站| 香蕉久久99| 精品视频久久久久久久| a视频免费观看| 日韩精品福利一区二区三区| 亚洲精品456在线播放狼人| 精品人妻一区二区免费| 中文无码日韩欧| 精品av综合导航| 中文字幕天堂av| 玖玖玖免费嫩草在线影院一区| 亚洲大胆人体在线| 国产高潮视频在线观看| 全国精品免费看| 亚洲另类欧美自拍| 亚洲精品91在线| 日本不卡电影| 美女视频久久黄| 欧美片一区二区| 亚洲黄色视屏| 日韩av手机在线| 中文字幕有码视频| 狠狠色综合色综合网络| 1区1区3区4区产品乱码芒果精品| 午夜精品久久久久久久99热黄桃| 成人免费视频视频在线观看免费| 狠狠干一区二区| 九色国产在线观看| 国产精品情趣视频| 久久亚洲a v| 黄视频免费在线看| 在线精品观看国产| 中文 日韩 欧美| 风间由美性色一区二区三区四区 | 国产又大又粗又硬| 国产成人免费在线| 久久超碰亚洲| 在线观看完整版免费| 亚洲激情av在线| 欧美一级在线看| 欧美黄色a视频| 日韩精品一区二区三区蜜臀| 激情综合丁香五月| 日韩国产综合| 欧美福利视频网站| 神马久久久久久久| 国产一区二区成人久久免费影院| 成人av影视在线| 九色网友自拍视频手机在线| 国产精品成人一区二区三区夜夜夜| www.激情网| 日本电影欧美片| 欧美一区二区三区四区在线观看| 欧美肉大捧一进一出免费视频| 欧美精品乱码| 国外成人在线播放| 亚洲天堂网在线视频| 成人一级片网址| 亚洲精品二区| 春色校园综合激情亚洲| 欧美日韩高清影院| 国产男女猛烈无遮挡a片漫画| 日韩精品一卡| 97国产精品免费视频| 91麻豆成人精品国产免费网站| 成a人片国产精品| 影音先锋欧美资源| 亚洲天堂电影| 精品国产乱子伦一区| 久久久免费看片| 性久久久久久| 国产伦理久久久| 尤物视频在线看| 欧美性生活久久| 在线精品一区二区三区| 欧美一区91| 国产精品一香蕉国产线看观看| 天天干视频在线| 亚洲品质自拍视频| 色综合天天色综合| 九九久久精品| 98视频在线噜噜噜国产| 午夜精品久久久久久久91蜜桃| 国产精品三级在线观看| 别急慢慢来1978如如2| 精品欠久久久中文字幕加勒比| 欧美成人中文字幕| 国产日韩欧美视频在线观看| 日本一区二区三区在线不卡| 日批视频在线免费看| 美日韩黄色大片| 久久人人爽人人爽人人片av高请 | 久久婷婷一区二区| 国产一区久久久| 一区二区高清视频| 成人午夜一级| 日韩在线观看网站| 中文字幕欧美在线观看| 久久久久99精品一区| 99色精品视频| 久久99国内| 国产97人人超碰caoprom| 亚洲欧美色视频| 高跟丝袜欧美一区| 在线观看av中文字幕| 国产欧美高清| 欧美成人综合一区| 三级成人在线| 中文字幕国产精品| 一二三四区在线| 国产精品盗摄一区二区三区| 欧美特黄aaa| 亚洲二区三区不卡| 成人免费网站在线| 性欧美videoshd高清| 日韩视频免费直播| 久久婷婷一区二区| 91亚洲资源网| 97公开免费视频| 色爱综合网欧美| 亚洲一区二区久久久久久| 天堂av在线电影| 日韩精品免费看| 免费精品一区二区| 成人欧美一区二区三区视频网页 | 亚洲第一区av| ...中文天堂在线一区| 日本55丰满熟妇厨房伦| 亚洲视频狠狠| 91麻豆精品秘密入口| av成人 com a| 国产亚洲精品成人av久久ww| 一二三四区在线| 亚洲国产综合91精品麻豆| 日韩av手机在线播放| 久久亚洲一区| 熟女熟妇伦久久影院毛片一区二区| 免费一级欧美在线大片| 午夜美女久久久久爽久久| 可以在线观看的av| 在线综合视频播放| 国产超碰人人爽人人做人人爱| 欧美激情在线看| 日本wwwxx| 免费视频一区二区三区在线观看| 一区二区三区视频在线播放| 99re6热只有精品免费观看| 777777777亚洲妇女| 色开心亚洲综合| 亚洲国产三级网| 亚洲性生活大片| 婷婷一区二区三区| 欧美老女人性生活视频| 国产99久久久国产精品潘金| 欧美激情国产精品日韩| 最新精品国产| 午夜免费电影一区在线观看| 视频在线一区| 国产精品久久久久久久9999| 婷婷在线播放| 在线电影av不卡网址| 内射无码专区久久亚洲| 欧美男生操女生| 日日夜夜狠狠操| 一区二区三区在线播放| 肉色超薄丝袜脚交69xx图片 | 永久免费av无码网站性色av| 国产jizzjizz一区二区| 五月婷婷激情久久| 性高湖久久久久久久久| 欧洲精品视频在线| 欧美天天综合| 久久亚洲高清| 91在线一区| 欧美日韩和欧美的一区二区| 亚洲一区二区不卡视频| 国产精品chinese在线观看| 国产一区二区视频在线观看| 中文字幕成在线观看| 欧美日韩国产第一页| 91在线品视觉盛宴免费| 亚洲欧美日韩一区二区在线| 色婷婷av一区二区三区之红樱桃 | 午夜啪啪小视频| 性色一区二区三区| 人体内射精一区二区三区| 1024精品久久久久久久久| 亚洲精品9999| 国产亚洲欧美日韩在线观看一区二区| 精品国产免费一区二区三区 | 美腿丝袜在线亚洲一区| 欧洲av无码放荡人妇网站| 亚洲午夜伦理| 欧美高清中文字幕| 欧美精品成人| av电影一区二区三区| 午夜精品毛片| 一区不卡字幕| 99精品全国免费观看视频软件| 午夜免费电影一区在线观看| 国产亚洲电影| 日韩av高清| 凹凸成人精品亚洲精品密奴| 性欧美.com| 日韩一区电影| 在线丝袜欧美日韩制服| 97偷自拍亚洲综合二区| 一区二区三区我不卡| 婷婷精品进入| 水蜜桃在线免费观看| 伊人色**天天综合婷婷| 第九区2中文字幕| 欧美一区影院| 男人插女人视频在线观看| 伊人久久亚洲美女图片| 国产精彩视频一区二区| 夜久久久久久| 成人羞羞国产免费网站| 日韩在线观看一区二区| 色综合手机在线| 麻豆精品视频在线| 深爱五月综合网| 国产白丝网站精品污在线入口| 李丽珍裸体午夜理伦片| 97久久超碰精品国产| 第一次破处视频| 亚洲欧洲在线观看av| 久久久综合久久久| 都市激情亚洲色图| 人妻中文字幕一区二区三区| 欧美日韩成人综合天天影院 | 亚洲天堂男人天堂| 一区二区三区视频在线观看视频| 久久久精品在线观看| 成人三级小说| 国产99久久精品一区二区永久免费 | 婷婷色综合网| 日韩小视频网站| 日日夜夜免费精品| 超碰中文字幕在线观看| av在线不卡免费看| 18啪啪污污免费网站| 亚洲自拍偷拍网站| 久久精品视频2| 91精品国产综合久久婷婷香蕉| 亚州精品国产精品乱码不99按摩| 伊人久久精品视频| 免费在线看电影| 国产精品一区二区久久| 国产精品网在线观看| 一区二区三区免费看| 日韩午夜在线| 天堂在线一区二区三区| 91亚洲永久精品| 国产精品九九九九九九| 欧美日韩在线看| 国产特级黄色片| 亚洲奶大毛多的老太婆| 在线网址91| 国产精品视频免费观看www| 久久精品国产亚洲5555| 一本色道久久综合亚洲精品婷婷 | 中文字幕一区二区三区不卡在线| 日韩福利片在线观看| 91精品黄色片免费大全| 国产视频在线看| 久久欧美在线电影| 国产情侣一区在线| 水蜜桃一区二区| 小嫩嫩精品导航| av电影在线播放| 亚洲欧洲综合另类| 在线免费观看一级片| 日韩极品精品视频免费观看| 在线免费观看的av| 国产精品久久久久久久久久新婚| 精品五月天堂| 欧美做暖暖视频| 极品美女销魂一区二区三区免费| a毛片毛片av永久免费| 性久久久久久久久久久久| 又骚又黄的视频| 亚洲欧美在线磁力| 草草视频在线| 国产98在线|日韩| 欧美91精品| 一级黄色片国产| 中文在线资源观看网站视频免费不卡| 国产91精品看黄网站在线观看| 亚洲国产成人91精品| 日本在线观看大片免费视频| 91精品在线国产| 香蕉国产精品| 成人亚洲免费视频| 自拍偷拍国产精品| 91免费视频播放| 精品国产一区二区三区久久狼黑人| 在线一区视频观看| 日本一区二区三区免费看| 午夜在线a亚洲v天堂网2018| 青青草视频播放| 欧美色另类天堂2015| 四虎影视精品成人| 欧美在线免费看| 国产永久精品大片wwwapp| 国产一级不卡毛片| 中文av字幕一区| 一级黄色片在线播放| 久久综合伊人77777蜜臀| crdy在线观看欧美| 亚洲av首页在线| 丁香六月综合激情| 动漫精品一区一码二码三码四码| 亚洲电影免费观看高清| 黄色软件视频在线观看| 久久成人资源| 日韩福利视频导航| 国产真人真事毛片视频| 91精品黄色片免费大全| 日本性爱视频在线观看| 国产伦精品一区二区三区四区免费 | 手机av在线网| 亚洲综合一区二区三区| 少妇又色又爽又黄的视频| 91精品国产777在线观看| 免费看成人哺乳视频网站| 九九热免费精品视频| 亚洲免费观看视频| 亚洲精品无码专区| 秋霞av国产精品一区| 成人羞羞动漫| 国产人妻精品久久久久野外| 亚洲成av人片在www色猫咪| 三级做a全过程在线观看| 国产精品手机播放| 亚洲一级二级| 91网站免费视频| 91精品婷婷国产综合久久性色| free性m.freesex欧美| 欧美自拍资源在线| 国产精品99久久久久久有的能看| 日韩伦理在线视频| 中文字幕国产日韩| 6080成人| 亚欧美在线观看| 亚洲成人资源在线| 性开放的欧美大片| 好吊色欧美一区二区三区四区| 青青草视频一区| 国产精品成人av久久| 中文字幕亚洲一区在线观看| 99a精品视频在线观看| 激情五月婷婷久久| 亚洲国产综合人成综合网站| 在线视频91p| 精品综合在线| 极品美女销魂一区二区三区 |