swift ios 系統(tǒng)定位和反地理編碼

最近項(xiàng)目要用到定位的功能,研究了一番百度地圖,需要接入很多第三方庫(kù),還需要生成密鑰等等,個(gè)人覺(jué)得比較麻煩,雖然百度地圖的功能已經(jīng)相當(dāng)完善了,最后決定用系統(tǒng)地圖定位,系統(tǒng)自帶用的是高德地圖,AIP很清晰,下面是代碼實(shí)現(xiàn)。
首先import CoreLocation, 創(chuàng)建 OTTLocationManager類,繼承NSObject

// 創(chuàng)建CLLocationManager 對(duì)象
let manager = CLLocationManager()
// 保存當(dāng)前定位:
var currentLocation: CLLocation?
// 檢測(cè)是否獲取到定位
// 反地理編碼,保存城市,地區(qū)
var subLocality: String?
var locality: String?

創(chuàng)建單例,方便ViewController使用:

//singleton manager
class var defaultManager: OTTLocationManager {
struct Static {
static let locManager = OTTLocationManager()
}
return Static.locManager
}
開(kāi)啟定位服務(wù)的初始設(shè)定:

func getLatLon() {
   
    if (CLLocationManager.locationServicesEnabled()) {
        
        //使用應(yīng)用程序期間允許訪問(wèn)位置數(shù)據(jù)
        self.manager.requestWhenInUseAuthorization()
        self.manager.delegate = self
        self.manager.desiredAccuracy = kCLLocationAccuracyBest
        self.manager.distanceFilter = kCLLocationAccuracyHundredMeters
        self.manager.startUpdatingLocation()
    } else {
        CLLocationManager.authorizationStatus()
        print("[OTTLocationManager getLatLon] 定位服務(wù)未開(kāi)啟")
    }

}

實(shí)現(xiàn)代理方法,獲取定位經(jīng)緯度及反地理編碼:
extension OTTLocationManager: CLLocationManagerDelegate {

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
    self.isLocation = true
    //取得locations數(shù)組的最后一個(gè):因定位一直在移動(dòng),所以取數(shù)組最后一個(gè)準(zhǔn)確經(jīng)緯度
    let location: CLLocation = locations[locations.count - 1]
    if location.horizontalAccuracy > 0 {
        let lat = Float(location.coordinate.latitude)
        let lon = Float(location.coordinate.longitude)
        
        self.currentLocation = location
        print("[OTTLocationManager locationManager:didUpdateLocations] lat = \(lat),  lon = \(lon)")
        
        //反地理編碼:將經(jīng)緯度轉(zhuǎn)換成城市,地區(qū),街道
        CLGeocoder().reverseGeocodeLocation(location) { (placemakes: [CLPlacemark]?, error: NSError?) -> Void in
            guard let placemark = placemakes?.first else {
                return
            }
            
           // 城市
            self.locality = placemark.locality
           // 地區(qū)
            self.subLocality = placemark.subLocality
            print("[OTTLocationManager locationManager:didUpdateLocations] locality = \(placemark.locality), sublocality = \(placemark.subLocality), subthoroughfare = \(placemark.subThoroughfare), self.subLocality = \(self.subLocality)")  //詳細(xì)街道
        }
    }
    // 停止定位服務(wù)
    self.manager.stopUpdatingLocation()
}

//MARK:定位錯(cuò)誤信息
func locationManager(manager: CLLocationManager, didFinishDeferredUpdatesWithError error: NSError?) {
    
    print("[OTTLocationManager locationManager:didFinishDeferredUpdatesWithError] \(error)\(error?.description)")
}

//檢測(cè)是否獲取到定位
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
    //如果未開(kāi)啟定位服務(wù)或者獲取不到定位,會(huì)走此代理方法
    self.manager.stopUpdatingLocation()
    self.isLocation = false
    print("[OTTLocationManager locationManager:didFailWithError] 無(wú)法獲取到定位")
}

}

啊哈,這樣就實(shí)現(xiàn)了簡(jiǎn)單的定位功能.
模擬器運(yùn)行,要在Debug->Location->CustomLocation 設(shè)置經(jīng)緯度,模擬移動(dòng)端定位,否則不會(huì)執(zhí)行代理方法。
如果要實(shí)現(xiàn)地圖定位功能,需要import MapKit,實(shí)現(xiàn) MKMapViewDelegate代理方法,后續(xù)介紹,敬請(qǐng)期待。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容