CLLocation定位

CLLocation定位importUIKitimportCoreLocationimportAlamofiretypealiasLocationClosure=((_sheng:String,_shi:String,_qu:String)->Void)classCLLocationTool:NSObject{publicstaticlet`default`=CLLocationTool.init()///定…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

import UIKit

import CoreLocation

typealias LocationClosure = ((_ sheng: String, _ shi: String, _ qu: String)->Void)

class CLLocationTool: NSObject {

    

    public static let `default` = CLLocationTool.init()

    

    /// 定位

    var locationManager: CLLocationManager = CLLocationManager()

    var currLocation: CLLocation!

    var longitude: Double = 0

    var latitude: Double = 0

    

    /// 省

    var sheng: String = “”

    /// 市

    var shi: String = “”

    /// 区

    var qu: String = “”

    var locationClosure: LocationClosure?

    

    override init() {

        super.init()

        NotificationCenter.default.addObserver(self, selector: #selector(enterFore), name: UIApplication.willEnterForegroundNotification, object: nil)

    }

    

    @objc func enterFore() {

        setupManager()

    }

    

    deinit {

        print(“deinit”)

        NotificationCenter.default.removeObserver(self)

    }

        

    class func showLocate(_ locationClosure: LocationClosure?) {

        let location = CLLocationTool.default

        location.setupManager()

        location.locationClosure = { (sheng, shi, qu)->Void in

            locationClosure?(sheng, shi, qu)

        }

    }

    

    /// 用户权限提醒框

    func showAuthAlert() {

        let alertVC = UIAlertController.init(title: “定位服务未开启”, message: “打开定位开关以享受更精准服务\n请进入系统设置>隐私>定位服务中打开开关,并允许App使用定位服务”, preferredStyle: .alert)

        let settingAction = UIAlertAction(title: “设置”, style: .default) { [weak self] action in

            self?.openAppSetting()

            print(“去打开定位权限”)

        }

        alertVC.addAction(settingAction)

        let cancelAction = UIAlertAction(title: “取消”, style: .cancel) { [weak self] action in

            guard let weakSelf = self else {return}

            weakSelf.locationClosure?(“空”, “空”, “空”)

        }

        alertVC.addAction(cancelAction)

        getCurrentVCBS2().present(alertVC, animated: true, completion: nil)

    }

    

    /// 打开页面的设置页面

    func openAppSetting() {

        if let openUrl = URL.init(string: UIApplication.openSettingsURLString) {

            if UIApplication.shared.canOpenURL(openUrl) {

                if UIApplication.shared.canOpenURL(openUrl) {

                    if #available(iOS 10.0, *) {

                        UIApplication.shared.open(openUrl, options: [:]) { (result) in

                            print(“result—-\(result)”)

                        }

                    } else {

                        UIApplication.shared.openURL(openUrl)

                    }

                }

                

            }

        }

    }

    

}

extension CLLocationTool: CLLocationManagerDelegate {

    func setupManager() {

        let status = CLLocationManager.authorizationStatus()

        if (CLLocationManager.locationServicesEnabled() == false) || (status == .denied) || (status == .restricted) {

            showAuthAlert()

            return

        }

        locationManager.requestAlwaysAuthorization()

        locationManager.desiredAccuracy = kCLLocationAccuracyBest

        locationManager.distanceFilter = 1000

        locationManager.requestAlwaysAuthorization()

        locationManager.requestWhenInUseAuthorization()

        locationManager.delegate = self

        locationManager.startUpdatingLocation()

    }

    

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        let location: CLLocation = locations.last!

        longitude = location.coordinate.longitude

        latitude = location.coordinate.latitude

        if location.horizontalAccuracy > 0 {

            lonlatToCity(location)

            locationManager.stopUpdatingLocation()

        }

    }

    

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {

        if let clError = error as? CLError {

            let status = CLLocationManager.authorizationStatus()

            if (CLLocationManager.locationServicesEnabled() == false) || (status == .denied)/* || (status == .restricted)*/ {

                locationClosure?(“空”, “空”, “空”)

            }

        }

        

        

    }

    

    func locationManager(_ manager: CLLocationManager, monitoringDidFailFor region: CLRegion?, withError error: Error) {

        print(“error—\(error)”)

    }

    

    @available(iOS 14.0, *)

    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {

        let status = CLLocationManager.authorizationStatus().rawValue

        let status1 = manager.authorizationStatus.rawValue

        print(“locationManagerDidChangeAuthorization—\(status)–\(status1)”)

    }

    

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {

        print(“didChangeAuthorization—\(status.rawValue)”)

    }

    

    func lonlatToCity(_ location: CLLocation) {

        let geocoder: CLGeocoder = CLGeocoder()

        geocoder.reverseGeocodeLocation(location) { [weak self](placemarks, error) in

            

            guard let weakSelf = self, let tempMark = placemarks else { return }

//            if tempMark.count > 0 && (error == nil) {

//                let mark = tempMark.last

//                var sheng = mark?.administrativeArea ?? “”

//                // 四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)

//                var shi = mark?.locality ?? “”

//                let qu = mark?.subLocality ?? “”

//

//                if let city = mark?.locality {

//                    shi = city

//                } else {

//                    sheng = “”

//                    shi = mark?.administrativeArea ?? “”

//                }

//                print(“\(sheng)\(shi)\(qu)”)

//

//            } else if error == nil && tempMark.count == 0 {

//                print(“没有解析到地理位置信息”)

//            } else if error != nil {

//                print(“error—\(String(describing: error))”)

//            }

//

            if error == nil {

                

                let mark = placemarks?.last

                

                weakSelf.sheng = mark?.administrativeArea ?? “”

                // 四大直辖市的城市信息无法通过locality获得,只能通过获取省份的方法来获得(如果city为空,则可知为直辖市)

                weakSelf.shi = mark?.locality ?? “”

                weakSelf.qu = mark?.subLocality ?? “”

                

                if let city = mark?.locality {

                    weakSelf.shi = city

                } else {

                    weakSelf.shi = mark?.administrativeArea ?? “”

                }

                print(“\(weakSelf.sheng)\(weakSelf.shi)\(weakSelf.qu)”)

            } else {

                print(“位置转换失败–“)

            }

            weakSelf.locationClosure?(weakSelf.sheng, weakSelf.shi, weakSelf.qu)

        }

    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158804.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号