其实苹果自身的CLLocationManager挺好用的, 定位准确, 就是每次使用的时候,要写一堆东西.上个项目中,我有三处地方都用到了定位, 但是同样的代码我不想写第二遍. 于是我把这个CLLocationManager再封装了一层. 作为一个单例给外界使用.
首先要封装,我们还是要使用CLLocationManager. 我们记得要现在info.plist中添加字段.(没有这个字段的话,就定位不了)
字段二选一就好了:
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
然后为了更加方便的使用,再创建了一个城市类:
然后我们看单例的.h文件:
也很简单,暴露出去的属性只有一个代理.
然后是方法,一个返回单例,还有开始,结束,最后一个是currentPlaceMark返回当前的地理编码.
最后看代理:
只有一个方法,就是定位结果的回调.有一个bool值告诉我们定位是成功还是失败了.
最后看.m文件:
从属性中可以看到,CLLocationManager是一个属性, 我们就是用这个属性去做定位的.然后是我们当前的城市模型以及原始的地理编码. 最后是一个updated属性. 作用于是否停止定位.
然后是千篇一律的单例写法, 我们在初始化的时候给locationManager创建了一个CLLocationManager对象. 最后记得判断下当前版本.如果是8.0以上的话, 需要设置requestWhenInUseAuthorization或者requestAlwaysAuthorization.才能正常使用定位功能.
然后是开始定位方法.最终会让CLLocationManager对象发起定位,
定位成功会调用这个方法:
可以看到这段代码很长. 但是我们真正需要的,只是在定位成功后,把城市获取出来,然后就可以关闭定位,设置updated值为YES(由于定位会不断执行多次,而其实第一次的定位就已经很准确了,所以我们可以在获得后马上跳出循环).再通过代理方法,把城市返回出去.
定位失败会调用这个方法:
其实我并没有遇到定位失败的情况啦. 但是我还是通过代理告诉外界定位失败了.
最后剩下的是外界能调用的两个方法:
一个是停止定位,另外一个是返回原始地理编码.
以上就是我封装的定位工具. 非常的简单. 返回的地址,我只把城市返回出去. 有需要的同学可以给城市类多添加街道或者区域等更详细的属性.
控制器的调用也就几行代码:
github上有个小demo:https://github.com/byljbdh/ALNLocationTool