最近項(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)期待。