最近項目要用到定位的功能,研究了一番百度地圖屡拨,需要接入很多第三方庫,還需要生成密鑰等等褥实,個人覺得比較麻煩呀狼,雖然百度地圖的功能已經(jīng)相當完善了,最后決定用系統(tǒng)地圖定位损离,系統(tǒng)自帶用的是高德地圖哥艇,AIP很清晰,下面是代碼實現(xiàn)僻澎。
首先import CoreLocation, 創(chuàng)建 OTTLocationManager類貌踏,繼承NSObject
// 創(chuàng)建CLLocationManager 對象
let manager = CLLocationManager()
// 保存當前定位:
var currentLocation: CLLocation?
// 檢測是否獲取到定位
// 反地理編碼,保存城市窟勃,地區(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
}
開啟定位服務的初始設定:
func getLatLon() {
if (CLLocationManager.locationServicesEnabled()) {
//使用應用程序期間允許訪問位置數(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] 定位服務未開啟")
}
}
實現(xiàn)代理方法,獲取定位經(jīng)緯度及反地理編碼:
extension OTTLocationManager: CLLocationManagerDelegate {
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
self.isLocation = true
//取得locations數(shù)組的最后一個:因定位一直在移動秉氧,所以取數(shù)組最后一個準確經(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)緯度轉換成城市眷昆,地區(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)") //詳細街道
}
}
// 停止定位服務
self.manager.stopUpdatingLocation()
}
//MARK:定位錯誤信息
func locationManager(manager: CLLocationManager, didFinishDeferredUpdatesWithError error: NSError?) {
print("[OTTLocationManager locationManager:didFinishDeferredUpdatesWithError] \(error)\(error?.description)")
}
//檢測是否獲取到定位
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
//如果未開啟定位服務或者獲取不到定位汁咏,會走此代理方法
self.manager.stopUpdatingLocation()
self.isLocation = false
print("[OTTLocationManager locationManager:didFailWithError] 無法獲取到定位")
}
}
啊哈亚斋,這樣就實現(xiàn)了簡單的定位功能.
模擬器運行,要在Debug->Location->CustomLocation 設置經(jīng)緯度攘滩,模擬移動端定位帅刊,否則不會執(zhí)行代理方法。
如果要實現(xiàn)地圖定位功能漂问,需要import MapKit,實現(xiàn) MKMapViewDelegate代理方法赖瞒,后續(xù)介紹女揭,敬請期待。