定位于定位优化(iOS)

定位于定位优化

1.定位的方案

最近在作项目, 遇到了一个问题就是如何让iOS7~~iOS9的定位.由于项目需求只是须要获取用户所在的城市, 而不用十分具体详细的精肯定位, 服务端考虑用区号, 做为标识,可是看了百度的SDK, 不忍吐槽.最后决定用高德的SDK进行定位的开发.高德的定位SDK也是基于CoreLocation框架进行二次的开发, 可是其提供具体的区号, 十分方便与服务端进行相应的逻辑开发.若是用原生的, 在大陆可能存在各类各样的问题, 由于大陆的iphone手机有韩版, 日版, 欧版, 美版, 就差没非版了, 这些手机获取的定位信息会存在七七八八的非中文编码, 十分头疼.因此就采用高德的定位SDK进行统一的定位解决.git

2.定位的逻辑

使用高德的SDK定位, 十分简单, 直接导入其框架的主头文件github

import <AMapLocationKit/AMapLocationKit.h>

.不要问我框架的主头文件是啥.接着直接使用高德的一次性定位,缓存

[self.locationManager requestLocationWithReGeocode:YES completionBlock:^(CLLocation *location, AMapLocationReGeocode *regeocode, NSError *error) {
                
                if (!error) {   
                    


                }
            }];

在异步回调的block中就有相应的信息.若是出错error会有值, 不为空.框架

3.用户的体验:(跳转到开启定位服务)

咱们知道当用户关闭定位服务, 或者禁止本程序进行定位的时候,最后是能在App中就直接跳转到相应的设置界面进行设置.这里为了程序的兼容和响应速度, 我采用CCLocationManager这个自带的类进行判断.为何不使用高德的一次性定位, 进行间接的判断, 当error有值时候,提示开启定位服务.这里主要存在的问题是由于, 高德提供的一次性定位, 的定位速度不快, 我本身用起来都以为很慢, 因此当用户点了定位, 还用等你去作定位请求后, 再经过这个定位结果判断是否开启定位服务, 是十分不合理的.因此个人思路即是采用CCLocationManager进行精确度最低的定位.iphone

具体的逻辑就是异步

1.先判判定位服务是否开启优化

2.若是定位服务开启, 则判断当前程序的定位权限是否受权.我是直接经过CCLocationManager对象的startUpdatingLocation方法, 让其开始定位,而后在代理方法中进行判断,若是定位权限是开启的就会回调编码

locationManager:didUpdateLocations:

不然回调的是线程

locationManager:didFailWithError:

而当回调了didUpdateLocations时候咱们就能够判定,定位服务是开启的,而且定位权限已经受权给应用程序, 则能够调用高德的SDK开始定位, 或者跳转到响应控制器中进行定位和具体的业务处理.代理

固然了, 无论是调用了上面哪一个的代理方法, 都用调用定位管理器stopUpdatingLocation, 中止定位.由于咱们只是须要知道这个信息, 不须要再继续定位.

4.关于定位的优化:

在程序中关于定位我作了两重的优化.或者说是缓存.

第一级缓存: 一进入应用程序后, 若是定位服务是开启的, 则开一个优先级最高的线程进行高德的一次定位.若是定位成功, 则将缓存中的定位信息清空, 写入新的定位信息.

第二季缓存: 在通过响应的控制器进行定位以前, 先从一级缓存中取到定位信息.若是有定位信息, 则再也不进行高德的一次性定位, 若是没有定位信息, 则继续进行高德的一次性定位, 若是定位成功, 将定位信息写入缓存.

通过这样的优化, 定位服务是十分快速的~具体工程代码不披露了.涉及到公司的业务.大概的技术思路就是这样.

后续会用空,我会封装适用于国内的一个定位的第三方框架.上传到github, 敬请关注

相关文章
相关标签/搜索