地图定位

import UIKit

@objc public protocol ADLocationProtocol {
    //得到经纬度
    @objc optional func locationManager(latitude: Double, longitude: Double)

    //获取城市信息
    @objc optional func locationCityInfo(cityName: String)
    
    /// 定位城市失败
    @objc optional func locationCityFail()

}

class ADLocation: NSObject {

    public weak var delegate: ADLocationProtocol?
    
    public static let shared = ADLocation.init()
        
    private var locationManager: CLLocationManager?
    
    
    public func didUpdateLocation(_ vc: UIViewController){
    
        self.delegate = vc as? ADLocationProtocol
       
        self.requestLocationService()
        
    }
    
    //初始化定位
    private func requestLocationService(){
        if self.locationManager == nil {
            self.locationManager = CLLocationManager()
            self.locationManager?.delegate = self
        }
        
        
        self.locationManager?.requestWhenInUseAuthorization()
//        self.locationManager?.startUpdatingLocation()
        
        if CLLocationManager.authorizationStatus() == .denied {
            //定位服务未开启
            self.alert()
        }else if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.notDetermined {
            //未知错误
            locationManager?.requestWhenInUseAuthorization()
        }else if CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways {
            locationManager?.desiredAccuracy = kCLLocationAccuracyBest
            let distance: CLLocationDistance = 100
            locationManager?.distanceFilter = distance
            locationManager?.startUpdatingLocation()
        }
    }
    
    //获取定位代理返回状态进行处理
    private func reportLocationServicesAuthorizationStatus(status: CLAuthorizationStatus) {
        if status == .notDetermined {
            //未知,继续请求授权
            requestLocationService()
        }else if(status == .restricted || status == .denied){
            //受限制,提示授权
            self.alert()
            
            guard let delegate = self.delegate else { return }
            delegate.locationCityFail?()
        }else {
            //重新请求
            requestLocationService()
        }
    }
    
    private func alert(){
        ADAlert.alertTitle(title: "定位权限未开启", content: "请在设置中开启appName定位权限", textAlignment: .center, leftTitle: "暂不", rightTitle: "去设置") { (result) in
            if result {
                let url = NSURL.init(string: UIApplication.openSettingsURLString)!
                if UIApplication.shared.canOpenURL(url as URL) {
                    UIApplication.shared.open(url as URL, options: [:], completionHandler: nil)
                }
            }
        }
    }
}


extension ADLocation: CLLocationManagerDelegate{
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        //停止定位
        self.locationManager?.stopUpdatingLocation()
        
        let location = locations.last ?? CLLocation.init()
        let coordinate = location.coordinate
        
        let latitude: Double = coordinate.latitude
        let longitude: Double = coordinate.longitude
        
        delegate?.locationManager?(latitude: latitude, longitude: longitude)
        
        let geocoder = CLGeocoder.init()
        geocoder.reverseGeocodeLocation(location) { (placemarkList, error) in
            guard let placemarkList = placemarkList else { return }
            if placemarkList.count > 0 {
                guard let placemark = placemarkList.first else { return  }
                var city = placemark.locality
                if city == nil {
                    city = placemark.administrativeArea
                }
                debugPrint("city \(city)")
                
                guard let delegate = self.delegate else { return }
                delegate.locationCityInfo?(cityName: city ?? "")
            }
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        debugPrint("权限改变")
        reportLocationServicesAuthorizationStatus(status: status)
    }
    
    
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        debugPrint("定位失败")
        guard let delegate = self.delegate else { return }
        delegate.locationCityFail?()
        
        self.locationManager?.stopUpdatingLocation()
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容