其實(shí)蘋果自身的CLLocationManager挺好用的, 定位準(zhǔn)確, 就是每次使用的時候,要寫一堆東西.上個項(xiàng)目中,我有三處地方都用到了定位, 但是同樣的代碼我不想寫第二遍. 于是我把這個CLLocationManager再封裝了一層. 作為一個單例給外界使用.
首先要封裝,我們還是要使用CLLocationManager. 我們記得要現(xiàn)在info.plist中添加字段.(沒有這個字段的話,就定位不了)
字段二選一就好了:
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
然后為了更加方便的使用,再創(chuàng)建了一個城市類:
然后我們看單例的.h文件:
也很簡單,暴露出去的屬性只有一個代理.
然后是方法,一個返回單例,還有開始,結(jié)束,最后一個是currentPlaceMark返回當(dāng)前的地理編碼.
最后看代理:
只有一個方法,就是定位結(jié)果的回調(diào).有一個bool值告訴我們定位是成功還是失敗了.
最后看.m文件:
從屬性中可以看到,CLLocationManager是一個屬性, 我們就是用這個屬性去做定位的.然后是我們當(dāng)前的城市模型以及原始的地理編碼. 最后是一個updated屬性. 作用于是否停止定位.
然后是千篇一律的單例寫法, 我們在初始化的時候給locationManager創(chuàng)建了一個CLLocationManager對象. 最后記得判斷下當(dāng)前版本.如果是8.0以上的話, 需要設(shè)置requestWhenInUseAuthorization或者requestAlwaysAuthorization.才能正常使用定位功能.
然后是開始定位方法.最終會讓CLLocationManager對象發(fā)起定位,
定位成功會調(diào)用這個方法:
可以看到這段代碼很長. 但是我們真正需要的,只是在定位成功后,把城市獲取出來,然后就可以關(guān)閉定位,設(shè)置updated值為YES(由于定位會不斷執(zhí)行多次,而其實(shí)第一次的定位就已經(jīng)很準(zhǔn)確了,所以我們可以在獲得后馬上跳出循環(huán)).再通過代理方法,把城市返回出去.
定位失敗會調(diào)用這個方法:
其實(shí)我并沒有遇到定位失敗的情況啦. 但是我還是通過代理告訴外界定位失敗了.
最后剩下的是外界能調(diào)用的兩個方法:
一個是停止定位,另外一個是返回原始地理編碼.
以上就是我封裝的定位工具. 非常的簡單. 返回的地址,我只把城市返回出去. 有需要的同學(xué)可以給城市類多添加街道或者區(qū)域等更詳細(xì)的屬性.
控制器的調(diào)用也就幾行代碼:
github上有個小demo:https://github.com/byljbdh/ALNLocationTool