定位于定位优化(iOS)
定位于定位优化
1.定位的方案
最近在做项目, 遇到了一个问题就是如何让iOS7~~iOS9的定位.因为项目需求只是需要获取用户所在的城市, 而不用十分具体详细的精确定位, 服务端考虑用区号, 作为标识,但是看了百度的SDK, 不忍吐槽.最后决定用高德的SDK进行定位的开发.高德的定位SDK也是基于CoreLocation框架进行二次的开发, 但是其提供具体的区号, 十分方便与服务端进行相应的逻辑开发.如果用原生的, 在大陆可能存在各种各样的问题, 因为大陆的iphone手机有韩版, 日版, 欧版, 美版, 就差没非版了, 这些手机获取的定位信息会存在七七八八的非中文编码, 十分头疼.所以就采用高德的定位SDK进行统一的定位解决.
2.定位的逻辑
使用高德的SDK定位, 十分简单, 直接导入其框架的主头文件
import <AMapLocationKit/AMapLocationKit.h>
.不要问我框架的主头文件是啥.接着直接使用高德的一次性定位,
[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
if (!error) {
}
}];
在异步回调的block中就有相应的信息.如果出错error会有值, 不为空.
3.用户的体验:(跳转到开启定位服务)
我们知道当用户关闭定位服务, 或者禁止本程序进行定位的时候,最后是能在App中就直接跳转到相应的设置界面进行设置.这里为了程序的兼容和响应速度, 我采用CCLocationManager这个自带的类进行判断.为什么不使用高德的一次性定位, 进行间接的判断, 当error有值时候,提示开启定位服务.这里主要存在的问题是因为, 高德提供的一次性定位, 的定位速度不快, 我自己用起来都觉得很慢, 所以当用户点了定位, 还用等你去做定位请求后, 再通过这个定位结果判断是否开启定位服务, 是十分不合理的.所以我的思路便是采用CCLocationManager进行精确度最低的定位.
具体的逻辑就是
1.先判断定位服务是否开启
2.如果定位服务开启, 则判断当前程序的定位权限是否授权.我是直接通过CCLocationManager对象的startUpdatingLocation方法, 让其开始定位,然后在代理方法中进行判断,如果定位权限是开启的就会回调
locationManager:didUpdateLocations:
否则回调的是
locationManager:didFailWithError:
而当回调了didUpdateLocations时候我们就可以断定,定位服务是开启的,并且定位权限已经授权给应用程序, 则可以调用高德的SDK开始定位, 或者跳转到响应控制器中进行定位和具体的业务处理.
当然了, 不管是调用了上面哪个的代理方法, 都用调用定位管理器的stopUpdatingLocation, 停止定位.因为我们只是需要知道这个信息, 不需要再继续定位.
4.关于定位的优化:
在程序中关于定位我做了两重的优化.或者说是缓存.
第一级缓存: 一进入应用程序后, 如果定位服务是开启的, 则开一个优先级最高的线程进行高德的一次定位.如果定位成功, 则将缓存中的定位信息清空, 写入新的定位信息.
第二季缓存: 在经过响应的控制器进行定位之前, 先从一级缓存中取到定位信息.如果有定位信息, 则不再进行高德的一次性定位, 如果没有定位信息, 则继续进行高德的一次性定位, 如果定位成功, 将定位信息写入缓存.
经过这样的优化, 定位服务是十分快速的~具体工程代码不披露了.涉及到公司的业务.大概的技术思路就是这样.
后续会用空,我会封装适用于国内的一个定位的第三方框架.上传到github, 敬请关注
定位于定位优化(iOS)的更多相关文章
- 移动端底部fixed固定定位输入框ios下不兼容
简短记录下最近开发移动端项目碰到的小坑,产品需求做一个售后对话页面,底部固定输入框,和微信对话差不多,但是在ios下,fixed失效,输入框被虚拟键盘挡住,在安卓下是正常的. 尝试过网上说的很多方法, ...
- 微信H5页面嵌入百度地图---解决手机的webKit定位,ios系统对非https网站不提供支持问题
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=yGQt ...
- Mali GPU OpenGL ES 应用性能优化--測试+定位+优化流程
1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能測试,在Mali GPU驱动中激活性能測试对性能影响微不足道. 1.1 DS-5 Streamli ...
- 优化iOS程序性能的25个方法
1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自己主动引用计数)和iOS5一起公布.它避免了最常见的也就是常常是因为我们忘记释放内存所造成的内存泄露.它自己 ...
- 基于vue-cli项目打包慢的定位优化过程
入职一周后,上一个前端就离职了(超级坑爹的),留下了一个比较棘手的问题,就是基于vue-cli的项目打包超级慢,我接手项目的时候,打包需要45min(上个离职者也不知道原因),经过3个月之后,随着项目 ...
- unity3d优化IOS
1. using UnityEngine; class GarbageCollectManager : MonoBehaviour { public int frameFreq = 30; ...
- iOS定位原理和使用建议(转)
原文:http://ibbs.91.com/thread-1548870-1-1.html 看到很多网友讨论iOS设备定位的问题,这里将我们所了解的关于iPhone.iPad.iPod等的定位原理做详 ...
- iOS开发——高级篇——地理定位 CoreLocation
一.CoreLocation 在移动互联网时代,移动app能解决用户的很多生活琐事,比如周边:找餐馆.找KTV.找电影院等等导航:根据用户设定的起点和终点,进行路线规划,并指引用户如何到达 在上述应用 ...
- iOS定位服务编程详解
现在的移动设备很多都提供定位服务,使用iOS系统的iPhone.iPod Touch和iPad都可以提供位置服务,iOS设备能提供3种不同途径进行定位:Wifi, 蜂窝式移动电话基站, GPS卫星 i ...
随机推荐
- acdream:Andrew Stankevich Contest 3:Two Cylinders:数值积分
Two Cylinders Special JudgeTime Limit: 10000/5000MS (Java/Others)Memory Limit: 128000/64000KB (Java/ ...
- USB Video Class及其实现
1 Video Class 基础概念Usb协议中,除了通用的软硬件电气接口规范等,还包含了各种各样的Class协议,用来为不同的功能定义各自的标准接口和具体的总线上的数据交互格式和内容.这些Class ...
- spring 通过工厂方法配置Bean
概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静 ...
- silverlight 双坐标轴
public void CreateLine(Grid oGrid, string sTitle, string sTableName, bool ifGetSig, string sYUint, s ...
- Mysql常用命令记录
-- 导出数据库: mysqldump -u user_name -p database_name > import_file.sql -- 执行脚本 source database.sql
- ifstream中文路径问题分析
最近维护一个项目,遇到了ifstream在中文路径下打开文件失败的bug,我搜索了一下,最后整理成下文以后日后查阅. 一.问题重现 vs2008下创建一个简单win32工程. 使用ANSI编码方式:项 ...
- Oracle11g R2学习系列 之一安装篇
前言 最近想去前同事推荐的一个Oracle相关的岗位竞争一下,由于之前没有使用Oracle的相关经验,所以决定学习一下,就算最终岗位应聘不成,至少也有了一些Oracle经验了,说不定哪天就用上了.再说 ...
- JavaScript 作用域和闭包
作用域的嵌套将形成作用域链,函数的嵌套将形成闭包.闭包与作用域链是 JavaScript 区别于其它语言的重要特性之一. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个 ...
- javascript操作DOM的方法与属性
文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构. 将HTML代码分解为DOM节点层次图: ...
- C# .net Jquery ajax 简单示例
jquery中ajax相信大家都不陌生,这里只写个简单例子示意用法,详细后续再写. 在html中按钮事件中添加如下js var param = "data=" + escape($ ...