Swift定位

IOS 8.0之前定位很簡(jiǎn)單只需要 讓CLLocationManager對(duì)象請(qǐng)求,我們要在代理里面就可以 ,監(jiān)聽(tīng)到位置的數(shù)據(jù)了
iOS 8之后使用位置服務(wù)要在info.plist,n里面添加洗面兩個(gè)字典,并添加描述

Privacy - Location Always and When In Use Usage Description

Privacy - Location When In Use Usage Description

ios 9.0 之后還需要打開(kāi)后臺(tái)模式


Xcode
 lazy var locationM : CLLocationManager = {
       let locationM = CLLocationManager()
        locationM.delegate = self

        // 如果是ios8.0以后, 在想請(qǐng)求用戶的位置信息, 需要主動(dòng)的請(qǐng)求授權(quán), 系統(tǒng)不會(huì)再自動(dòng)彈出一個(gè)窗口
        // 請(qǐng)求的是前臺(tái)定位授權(quán)
        // 默認(rèn)情況, 只能在前臺(tái)獲取用戶位置信息 如果想想要在后臺(tái)也獲取用戶位 那么必須勾選后臺(tái)模式location  updates

        // 效果 在后臺(tái)確實(shí)可以獲取到位置信息, 但是屏幕上方會(huì)出現(xiàn)一個(gè)藍(lán)色的橫幅, 不斷提醒用戶, 當(dāng)前APP 正在使用你的位置
        if #available(iOS 8.0, *)
        {
            locationM.requestAlwaysAuthorization()
            locationM.pausesLocationUpdatesAutomatically = false
 if #available(iOS 9.0, *)
            {
                // 如果在ios9.0以后, 想要在后臺(tái)獲取用戶位置,
               // 如果當(dāng)前的授權(quán)狀態(tài)是前臺(tái)定位授權(quán), 那么你需要勾選后臺(tái)模式 location updates, 還要額外的設(shè)置以下屬性為true
               // 注意: 如果設(shè)置這個(gè)屬性為true, 那么必須勾選后臺(tái)模式
                manager.allowsBackgroundLocationUpdates = true
            }
        }
        //其他參數(shù)的設(shè)置
        // 設(shè)置過(guò)濾距離  
        // 每隔100米定位一次
        // 1 111KM/100M
        // 如果最新的位置距離上一次的位置之間的物理距離, 大于這個(gè)值, 就會(huì)通過(guò)代理來(lái)告訴我們最新的位置數(shù)據(jù)
        locationM.distanceFilter = 100
// 定位精確度
//         kCLLocationAccuracyBestForNavigation // 最適合導(dǎo)航
//         kCLLocationAccuracyBest; // 最好的
//         kCLLocationAccuracyNearestTenMeters; // 附近10米
//         kCLLocationAccuracyHundredMeters; // 附近100米
//         kCLLocationAccuracyKilometer; // 附近1000米
//         kCLLocationAccuracyThreeKilometers; // 附近3000米
        // 經(jīng)驗(yàn): 如果定位的精確度越高, 那么越耗電, 而且定位時(shí)間越長(zhǎng)
        //
        locationM.desiredAccuracy = kCLLocationAccuracyBest
        return locationM
    }()


 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    {
        locationM.startUpdatingLocation()
        print("開(kāi)始定位")
    }


func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {
        print("獲得位置")
    }

  ///監(jiān)聽(tīng)用戶的授權(quán)狀態(tài)
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
    {
        switch status {
        case .notDetermined:
            print("用戶還沒(méi)決定")
        case .restricted:
            print("受限制")
        case .authorizedWhenInUse:
            print("前臺(tái)使用允許")
        case .authorizedAlways:
            print("允許后臺(tái)定位")
        case .denied:
            print("用戶拒絕")
            // 判斷當(dāng)前設(shè)備是否支持定位, 并且定位服務(wù)是否開(kāi)啟
            if CLLocationManager.locationServicesEnabled()
            {
                print("真正被拒絕")
                
                if #available(iOS 8.0, *)
                {
                    let url = UIApplication.openSettingsURLString
                    
                    if UIApplication.shared.canOpenURL(URL(string: url)!)
                    {
                        UIApplication.shared.openURL(URL(string: url)!)
                    }
                    
                }
            }else
            {
                print("定位服務(wù)應(yīng)該打開(kāi)")
            }
            
        default:
         
            print("none")
        }
        
    }

d定位的其他知識(shí)

  • 標(biāo)準(zhǔn)定位服務(wù) (gps/wifi/藍(lán)牙/基站)具體使用哪種,蘋果有自己規(guī)則)
    優(yōu)點(diǎn): 定位精確度高
    缺點(diǎn): 程序關(guān)閉,就沒(méi)法獲取位置 ,而且耗電
    locationM.startUpdatingLocation()

  • 2.顯著位置變化定位服務(wù)
    定位實(shí)現(xiàn)方案: (基于 基站 定位, 必須要求設(shè)備有電話模塊)
    優(yōu)點(diǎn): 當(dāng)app被完全關(guān)閉時(shí),也可以接收到位置通知,并讓app進(jìn)入到后臺(tái)處理
    缺點(diǎn): 定位精度低
    locationM.startMonitoringSignificantLocationChanges()

iOS9.0 新的API

  • 只定位一次
    //(1) 按照定位精確度從低到高進(jìn)行排序,逐個(gè)進(jìn)行定位.如果在有效時(shí)間內(nèi), 定位到了精確度最好的位置, 那么就把對(duì)應(yīng)的位置通過(guò)代理告知外界.
    //(2) 如果獲取到的位置不是精確度最高的那個(gè),也會(huì)在定位超時(shí)后,通過(guò)代理告訴外界.
    //(1) 必須實(shí)現(xiàn)代理的-locationManager:didFailWithError:方法
    //(2) 不能與startUpdatingLocation方法同時(shí)使用
    if #available(iOS 9.0, *)
    {
    locationM.requestLocation()

     }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容