IOS 8.0之前定位很简单只需要 让CLLocationManager对象请求,我们要在代理里面就可以 ,监听到位置的数据了
iOS 8之后使用位置服务要在info.plist,n里面添加洗面两个字典,并添加描述
Privacy - Location Always and When In Use Usage Description
Privacy - Location When In Use Usage Description
ios 9.0 之后还需要打开后台模式
lazy var locationM : CLLocationManager = {
let locationM = CLLocationManager()
locationM.delegate = self
// 如果是ios8.0以后, 在想请求用户的位置信息, 需要主动的请求授权, 系统不会再自动弹出一个窗口
// 请求的是前台定位授权
// 默认情况, 只能在前台获取用户位置信息 如果想想要在后台也获取用户位 那么必须勾选后台模式location updates
// 效果 在后台确实可以获取到位置信息, 但是屏幕上方会出现一个蓝色的横幅, 不断提醒用户, 当前APP 正在使用你的位置
if #available(iOS 8.0, *)
{
locationM.requestAlwaysAuthorization()
locationM.pausesLocationUpdatesAutomatically = false
if #available(iOS 9.0, *)
{
// 如果在ios9.0以后, 想要在后台获取用户位置,
// 如果当前的授权状态是前台定位授权, 那么你需要勾选后台模式 location updates, 还要额外的设置以下属性为true
// 注意: 如果设置这个属性为true, 那么必须勾选后台模式
manager.allowsBackgroundLocationUpdates = true
}
}
//其他参数的设置
// 设置过滤距离
// 每隔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>, with event: UIEvent?)
{
locationM.startUpdatingLocation()
print("开始定位")
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
print("获得位置")
}
///监听用户的授权状态
func locationManager(_ manager: CLLocationManager, didChangeAuthorization 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 = UIApplication.openSettingsURLString
if UIApplication.shared.canOpenURL(URL(string: url)!)
{
UIApplication.shared.openURL(URL(string: url)!)
}
}
}else
{
print("定位服务应该打开")
}
default:
print("none")
}
}
d定位的其他知识
标准定位服务 (gps/wifi/蓝牙/基站)具体使用哪种,苹果有自己规则)
优点: 定位精确度高
缺点: 程序关闭,就没法获取位置 ,而且耗电
locationM.startUpdatingLocation()2.显著位置变化定位服务
定位实现方案: (基于 基站 定位, 必须要求设备有电话模块)
优点: 当app被完全关闭时,也可以接收到位置通知,并让app进入到后台处理
缺点: 定位精度低
locationM.startMonitoringSignificantLocationChanges()
iOS9.0 新的API
-
只定位一次
//(1) 按照定位精确度从低到高进行排序,逐个进行定位.如果在有效时间内, 定位到了精确度最好的位置, 那么就把对应的位置通过代理告知外界.
//(2) 如果获取到的位置不是精确度最高的那个,也会在定位超时后,通过代理告诉外界.
//(1) 必须实现代理的-locationManager:didFailWithError:方法
//(2) 不能与startUpdatingLocation方法同时使用
if #available(iOS 9.0, *)
{
locationM.requestLocation()}