后台定位上传实践

前言


我现在做的是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阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,424评论 25 707
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,858评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,774评论 0 27
  • 坐我旁边的前端今天正好初学axure,然后我就顺便学了几招比较基础的,这里做个笔记先。 首先我安装的axure ...
    zhuyuansj阅读 435评论 2 3