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)


相关推荐

  • C#中如何使用Parallel.For和Parallel.ForEach[通俗易懂]

    C#中如何使用Parallel.For和Parallel.ForEach[通俗易懂]如何在C#中使用Parallel.For和Parallel.ForEach利用C#中的无锁,线程安全的实现来最大化.NET或.NETCore应用程序的吞吐量。并行是在具有多个内核的系统上并行执行任务的能力。.NETFramework4中引入了对.NET中并行编程的支持。.NET中的并行编程使我们能够更有效地使用系统资源,并具有更好的编程控制能力。本文讨论了如何在.NETCore应用程序中使用并行性。若要使用本文提供的代码示例,您应该在系统中安装VisualStudio2019。在Visu

  • Mac使用Boot Camp安装win10(不用U盘)

    Mac使用Boot Camp安装win10(不用U盘)原文在https://bbs.feng.com/forum.php?mod=viewthread&tid=10748184&page=1&mobile=no大概的步骤:1、从微软官网下载win10专业版本iso文件(文件有4.6G,官网白天下载很慢,晚上下载快点);2、使用MacOS自带的BootCamp(新兵训练营?)安装win10,BootCamp安装时会从官网服务器下载支

  • mybatis rowbound_mybatis基本步骤

    mybatis rowbound_mybatis基本步骤其实说白了就是一个用java代替了sql查询的一个方法在java里面写入方法getUserByRowBounds:List<User>getUserByRowBounds();配置文件里写入:<selectid=”getUserByRowBounds”resultMap=”userMap”>select*frommybaties.user;</select>测试类里编写rowBounds进行分页:

  • visdom总结[通俗易懂]

    visdom总结[通俗易懂]1叫做env=environment2叫做win=window

  • wireshark抓包使用教程

    wireshark抓包使用教程Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程各种问题定位。本文主要内容包括:1、Wireshark软件下载和安装以及Wireshark主界面介绍。2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。3、Wireshark过滤器使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。Wireshark软件安装软件下载路径:w…

  • RTP协议全解析(H264码流和PS流)「建议收藏」

    RTP协议全解析(H264码流和PS流)「建议收藏」1RTPHeader解析2、RTP荷载H264码流2.1、单个NAL单元包2.2、分片单元(FU-A)3、RTP荷载PS流3.1、PS包头3.2、系统标题3.3、节目映射流3.4、PES分组头部

发表回复

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

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