定位于定位优化(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 ...
随机推荐
- 为什么Nginx的性能要比Apache高很多?
为什么Nginx的性能要比Apache高很多? 这得益于Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的sele ...
- phpcms:六、频道页(category.html)
1.当前栏目的ID:{$catid}标题样式:{title_style($v[style])}(在添加内容或编辑内容的时候,标题右边 有一个选择颜色的块).{str_cut(strip_tags($v ...
- Struts2简单例子
Struts实现注册功能 ControlFilter.java package com.jikexueyuan.filter; import java.io.IOException; import j ...
- JavaScript 精髓整理篇之一(对象篇)postby:http://zhutty.cnblogs.com
废话篇头: 由于工作关系,所以写博文的时间有那么点~~,其实是输入法太懒了,都是输入法的错~~ 这一系列的博客将总结所有关于JavaScript语言的精髓,适合0基础到大师级别人物阅读. <Ja ...
- Android Support库百分比布局
之前写过一篇屏幕适配的文章Android 屏幕适配最佳实践,里面提到了类似百分比布局的东西,可是该方法缺点非常明显,就会添加非常多没用的数据,导致apk包变大. 而谷歌的support库中,添加了一个 ...
- Linux 常用系统命令-20160504
一.显示目录和文件的命令 1.ls(list) 功能说明: 列出目录内容. 语 法 : ls [-1aAbBcCdDfFgGhHiklLmnNopqQrRsStuUvxX][-I < 范 本 ...
- 将excel的.xlsx文件转成数据库文件.db的方法
1.下载好工具SQLite Expert Professional 3 ,晚上有很多,自行百度. 2.打开.xls文件,将文件另存为.csv文件.说明一下: 可以将xls文件看作是数据库里的一个表.所 ...
- WebApi2官网学习记录---Html Form Data
HTML Forms概述 <form action="api/values" method="post"> 默认的method是GET,如果使用GE ...
- Asp.Net EF Code First 简单入门
今天在上班期间花了点时间学习了一下微软的EntityFramework Code First技术,这篇文章只是简单的入门,不多废话,下面直入主题. 一.首先添加一个解决方案,接着添加一个web网站,D ...
- EasyUI layout动态设置Split属性
switch (rowData.ISREGISTERTASK) { case 0: 显示north分割线 $('#RightContent').la ...