溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

001.Swift定位 CLLocationManager

發(fā)布時間:2020-02-24 06:16:34 來源:網(wǎng)絡 閱讀:1090 作者:光光ing 欄目:移動開發(fā)

引用:  import CoreLocation


    // 如果是ios8.0以后, 在想請求用戶的位置信息, 需要主動的請求授權, 系統(tǒng)不會再自動彈出一個窗口

    

    

    lazy var locationM: CLLocationManager = {

       let locationM = CLLocationManager()

        locationM.delegate = self

        

        

        // 請求的是前臺定位授權

        // 默認情況, 只能在前臺獲取用戶位置信息 如果想想要在后臺也獲取用戶位 那么必須勾選后臺模式location  updates


        // 效果 在后臺確實可以獲取到位置信息, 但是屏幕上方會出現(xiàn)一個藍色的橫幅, 不斷提醒用戶, 當前APP 正在使用你的位置

        if #available(iOS 8.0, *) {

            locationM.requestWhenInUseAuthorization()

            

            

            // 如果在ios9.0以后, 想要在后臺獲取用戶位置

            // 如果當前的授權狀態(tài)是前臺定位授權, 那么你需要勾選后臺模式 location updates, 還要額外的設置以下屬性為true

            // 注意: 如果設置這個屬性為true, 那么必須勾選后臺模式

            if #available(iOS 9.0, *) {

                locationM.allowsBackgroundLocationUpdates = true

            }

            

            // 前后臺定位授權

            // 如果當前的授權狀態(tài)是前后臺定位授權, 那么默認情況下, 就可以在后臺獲取用戶位置信息, 不需要勾選后臺模式location updates

            

//            locationM.requestAlwaysAuthorization()

        }

        

        

        // 設置過濾距離

        // 每隔100米定位一次

        // 1 111KM/100M

        // 如果最新的位置距離上一次的位置之間的物理距離, 大于這個值, 就會通過代理來告訴我們最新的位置數(shù)據(jù)

        locationM.distanceFilter = 100

        

        

        // 定位精確度

//         kCLLocationAccuracyBestForNavigation // 最適合導航

//         kCLLocationAccuracyBest; // 最好的

//         kCLLocationAccuracyNearestTenMeters; // 附近10

//         kCLLocationAccuracyHundredMeters; // 附近100

//         kCLLocationAccuracyKilometer; // 附近1000

//         kCLLocationAccuracyThreeKilometers; // 附近3000

        // 經(jīng)驗: 如果定位的精確度越高, 那么越耗電, 而且定位時間越長

        //

        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("已經(jīng)獲取到位置信息")

        

        // 獲取用戶當前所在的城市, 切換到奧對應城市 1

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

//        locationM.stopUpdatingLocation()

        

    }

    

    /**

     授權狀態(tài)發(fā)生改變時調(diào)用

     

     - parameter manager: 位置管理者

     - parameter status:  狀態(tài)

     */

    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("真正被拒絕")

                // 手動通過代碼, 來跳轉(zhuǎn)到設置界面

                if #available(iOS 8.0, *) {

                    

                    let url = NSURL(string: UIApplicationOpenSettingsURLString)

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

                        UIApplication.sharedApplication().openURL(url!)

                    }

                }

               

                

            }else {

                // 當我們在app內(nèi)部想要訪問用戶位置, 但是當前的定位服務是關閉狀態(tài), 那么系統(tǒng)會自動彈出一個窗口, 快捷跳轉(zhuǎn)到設置界面, 讓用戶設置

                print("定位服務應該打開")

            }

        default:

            print("none")

        }

    }


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI