温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

001.Swift定位 CLLocationManager

发布时间:2020-02-24 06:16:34 来源:网络 阅读:1095 作者:光光ing 栏目:移动开发

引用:  import CoreLocation


    // 如果是ios8.0以后, 在想请求用户的位置信息, 需要主动的请求授权, 系统不会再自动弹出一个窗口

    

    

    lazy var locationM: CLLocationManager = {

       let locationM = CLLocationManager()

        locationM.delegate = self

        

        

        // 请求的是前台定位授权

        // 默认情况, 只能在前台获取用户位置信息 如果想想要在后台也获取用户位 那么必须勾选后台模式location  updates


        // 效果 在后台确实可以获取到位置信息, 但是屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置

        if #available(iOS 8.0, *) {

            locationM.requestWhenInUseAuthorization()

            

            

            // 如果在ios9.0以后, 想要在后台获取用户位置

            // 如果当前的授权状态是前台定位授权, 那么你需要勾选后台模式 location updates, 还要额外的设置以下属性为true

            // 注意: 如果设置这个属性为true, 那么必须勾选后台模式

            if #available(iOS 9.0, *) {

                locationM.allowsBackgroundLocationUpdates = true

            }

            

            // 前后台定位授权

            // 如果当前的授权状态是前后台定位授权, 那么默认情况下, 就可以在后台获取用户位置信息, 不需要勾选后台模式location updates

            

//            locationM.requestAlwaysAuthorization()

        }

        

        

        // 设置过滤距离

        // 每隔100米定位一次

        // 1 111KM/100M

        // 如果最新的位置距离上一次的位置之间的物理距离, 大于这个值, 就会通过代理来告诉我们最新的位置数据

        locationM.distanceFilter = 100

        

        

        // 定位精确度

//         kCLLocationAccuracyBestForNavigation // 最适合导航

//         kCLLocationAccuracyBest; // 最好的

//         kCLLocationAccuracyNearestTenMeters; // 附近10

//         kCLLocationAccuracyHundredMeters; // 附近100

//         kCLLocationAccuracyKilometer; // 附近1000

//         kCLLocationAccuracyThreeKilometers; // 附近3000

        // 经验: 如果定位的精确度越高, 那么越耗电, 而且定位时间越长

        //

        locationM.desiredAccuracy = kCLLocationAccuracyBest

        

        return locationM

    }()

    

    

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

        locationM.startUpdatingLocation()

    }


}



extension ViewController: CLLocationManagerDelegate {

    

    

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

        print("已经获取到位置信息")

        

        // 获取用户当前所在的城市, 切换到奥对应城市 1

        // 如果想要定位一次, 那么可以在定位到之后, 停止定位

//        locationM.stopUpdatingLocation()

        

    }

    

    /**

     授权状态发生改变时调用

     

     - parameter manager: 位置管理者

     - parameter status:  状态

     */

    func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {

        switch status {

        case .NotDetermined:

            print("用户没有决定")

        case .Restricted:

            print("受限制")

        case .AuthorizedWhenInUse:

            print("前台定位授权")

        case .AuthorizedAlways:

            print("前后台定位授权")

        case .Denied:

//            print("拒绝")

            // 判断当前设备是否支持定位, 并且定位服务是否开启

            if CLLocationManager.locationServicesEnabled() {

                print("真正被拒绝")

                // 手动通过代码, 来跳转到设置界面

                if #available(iOS 8.0, *) {

                    

                    let url = NSURL(string: UIApplicationOpenSettingsURLString)

                    if UIApplication.sharedApplication().canOpenURL(url!) {

                        UIApplication.sharedApplication().openURL(url!)

                    }

                }

               

                

            }else {

                // 当我们在app内部想要访问用户位置, 但是当前的定位服务是关闭状态, 那么系统会自动弹出一个窗口, 快捷跳转到设置界面, 让用户设置

                print("定位服务应该打开")

            }

        default:

            print("none")

        }

    }


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI