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)模式

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()}