




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
后台定位上传的代码实践前言之前的文章说过 我现在做的是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的子类 并根据需求中的几点定义三个变量interfaceMMLocationManager:CLLocationManager+(instancetype)sharedManager;property(nonatomic,assign)CGFloatminSpeed;/最小速度property(nonatomic,assign)CGFloatminFilter;/最小范围property(nonatomic,assign)CGFloatminInteval;/更新间隔end这里解释一下这几个参数minSpeed如果当前运动速度大于此值 则满足需求(1) 以时间为更新依据(minFilter) 如果当前运动速度小于此值 则满足需求(2) 以范围为更新依据(minInteval) minFilter最小的触发范围 用于需求(1) minInteval更新间隔 用于需求(2) 接下来是初始化函数-(instancetype)initself=superinit;if(self)self.minSpeed=3;self.minFilter=50;self.minInteval=10;self.delegate=self;self.distanceFilter=self.minFilter;self.desiredAccuracy=kCLLocationAccuracyBest;returnself;这里的默认值可以根据需求来调整然后是位置更新后的处理逻辑 其实也非常的简单、-(void)locationManager:(CLLocationManager*)managerdidUpdateLocations:(NSArray*)locationsCLLocation*location=locations0;NSLog(%,location);/根据实际情况来调整触发范围selfadjustDistanceFilter:location;/上传数据selfuploadLocation:location;而这个adjustDistanceFilter函数 就是整个代码的核心 会根据当前速度来动态的调整distanceFilter这个参数 以满足我们的需求/*规则:如果速度小于minSpeedm/s则把触发范围设定为50m*否则将触发范围设定为minSpeed*minInteval*此时若速度变化超过10%则更新当前的触发范围(这里限制是因为不能不停的设置distanceFilter,*否则uploadLocation会不停被触发)*/-(void)adjustDistanceFilter:(CLLocation*)location/NSLog(adjust:%f,location.speed);if(location.speed0.1f)self.distanceFilter=self.minFilter;elseCGFloatlastSpeed=self.distanceFilter/self.minInteval;if(fabs(lastSpeed-location.speed)/lastSpeed0.1f)|(lastSpeedLocation-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 its 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 stateneither idle nor activewhen the device isnt 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 users battery drains faster.据我简单的了解 这个*Low Power State”只有在黑屏的状态下(不只是锁屏)才有可能触发 只要有任何电量屏幕的操作(就连推送也算) 都会使APP退出这个状态 同时 如果在充电状态下 也是无法进入的我尝试在真机和模拟器上使用这个API 但结果APP还是以1HZ的频率在定位(设置了kCLDistanceFilterNone的原因)虽然locationManager:didFinishDeferredUpdatesWithError:在指定的时间后成功的回调了 但是结果还是没有deffer 于是我查了一下 原来这个函数无法直接进行调试的 因为:不支持模拟器deferredLocationUpdatesAvailable用于检测设备是否支持 模拟器会返回NO 不支持真机调试 因为调试时Xcode会阻止程序休眠 导致程序无法进入低功耗状态 结论就是这个东西连调试都没办法 所以我也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 咸阳经开城市发展集团有限公司招聘考试真题2024
- 达州市教育局部属公费师范生招聘考试真题2024
- 高血压健康管理试题(带答案)
- 劳动合同与社会保险法律制度测试试题(附答案)
- 初级美发师模拟试题及答案
- 2025年度隧道盾构施工项目合同
- 2025年度清洁煤炭绿色采购与供应链管理合同
- 2025保密协议范本:物流行业货物信息保密
- 2025年美妆行业个性化定制服务模式下的行业规范研究报告
- 2025版绿色建筑节能改造合同标准文本
- 2025年科研项目经理专业知识考试题目答案解析
- 2025广东肇庆市怀集县卫生事业单位招聘102人笔试模拟试题及答案解析
- 青马考试题目及答案
- 算力中心计算任务优化方案
- 劳务派遣工作知识培训课件
- AutoCAD电气工程制图 课件 项目1 低压配电柜的绘制与识图
- 无人机反制设备原理课件
- 2024年全国工会财务知识大赛备赛试题库500(含答案)
- 《采购4 0 采购系统升级 降本 增效实用指南 第2版 》读书笔记思维导图PPT模板下载
- 《卷烟原料配方设计》配套教学课件
- 《新能源汽车驱动电机系统检测与维修习题册》 习题参考答案(劳动)
评论
0/150
提交评论