看看如此简单的使用方式吧
EPLocationManager.manager.aloneReGeocodeLocation()
if let model = EPLocationManager.manager.userLocationModel {
picker.selectProvince(model.province, city: model.city, area: model.area)
}
EPLocationManager.manager.aloneReGeocodeLocation { (model) in
print("province:\(model.province), city:\(model.city), area:\(model.area)")
}
EPLocationManager.manager.serialReGeocodeLocation { (model) in
print("province:\(model.province), city:\(model.city), area:\(model.area)")
}
EPLocationManager.manager.stopLocation()
那这个定位的实现是怎样?
import UIKit
import CoreLocation
class EPLocationManager: NSObject {
@objc public static let manager: EPLocationManager = { EPLocationManager() }()
private lazy var locationManager = CLLocationManager()
private var locationCompletionBlock: ((EPLocationModel) -> ())?
@objc public var userLocationModel: EPLocationModel?
private var isAloneLocaion: Bool=false
private override init() {
super.init()
configLocationManager()
}
deinit {
locationManager.delegate = nil
}
private func configLocationManager() {
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.requestWhenInUseAuthorization()
}
func stopLocation() {
locationManager.stopUpdatingLocation()
}
@objc func aloneReGeocodeLocation(_ completionBlock: ((EPLocationModel) -> ())?=nil) {
isAloneLocaion = true
serialReGeocodeLocation(completionBlock)
}
func serialReGeocodeLocation(_ completionBlock: ((EPLocationModel) -> ())?=nil) {
self.locationCompletionBlock = completionBlock
locationManager.stopUpdatingLocation()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
}
}
extension EPLocationManager: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
for location in locations {
HGLog("lat:\(location.coordinate.latitude); lon:\(location.coordinate.longitude); accuracy:\(location.horizontalAccuracy)m")
if location.coordinate.latitude > 0 && location.coordinate.longitude > 0 {
if isAloneLocaion {
stopLocation()
}
}
CLGeocoder().reverseGeocodeLocation(location) { (marks, error) in
if error != nil {
HGLog("geocoder fail \(error!.localizedDescription)")
}
guard let placemarks = marks else { return }
if placemarks.count > 0 {
let placemark = placemarks[0]
let model = EPLocationModel()
model.coordinate = location.coordinate
model.city = placemark.locality
model.province = placemark.administrativeArea
model.area = placemark.subLocality
model.address = placemark.name
self.userLocationModel = model
self.locationCompletionBlock?(model)
}
for placemark in placemarks {
HGLog("placemark:\(placemark.administrativeArea ?? "")-\(placemark.locality ?? "")-\(placemark.subLocality ?? "")-\(placemark.name ?? "")")
}
}
}
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
HGLog("location is fail \(error.localizedDescription)")
}
}
class EPLocationModel: NSObject {
@objc var coordinate : CLLocationCoordinate2D = CLLocationCoordinate2DMake(0, 0)
@objc var adcode : String?
@objc var citycode : String?
@objc var city : String?
@objc var area : String?
@objc var province : String?
@objc var address : String?
}