定位权限是否可以使用
CLLocationManager.locationServicesEnabled()
定位权限授权状态
// CLAuthorizationStatus
kCLAuthorizationStatusNotDetermined // 用户尚未对应用程序做出决定
kCLAuthorizationStatusRestricted // 此应用程序无位置服务,用户无法更改
kCLAuthorizationStatusDenied // 用户明确拒绝该定位服务,或者在设置中已禁用
kCLAuthorizationStatusAuthorizedAlways // 允许在任何时候进行位置定位
kCLAuthorizationStatusAuthorizedWhenInUse // 仅允许在用户使用应用程序时使用
// 获取当前应用程序授权状态
CLLocationManager.authorizationStatus()
定位授权状态请求
下面两个方法只有在 authorizationStatus == kCLAuthorizationStatusNotDetermined
条件下调用才有作用
/*
在 info.plist 中添加
NSLocationAlwaysAndWhenInUseUsageDescription
NSLocationWhenInUseUsageDescription
*/
locationManager.requestAlwaysAuthorization()
/*
在 info.plist 中添加
NSLocationWhenInUsageDescription
*/
locationManager.requestWhenInUseAuthorization()
初始化定位管理对象
let locationManager = CLLocationManager.init()
locationManager.delegate = self
locationManager.allowsBackgroundLocationUpdates = true /// 后台定位
/*
kCLLocationAccuracyBestForNavigation // 使用附加传感器来促进导航应用程序的最高可能精度
kCLLocationAccuracyBest // 最佳精度水平
kCLLocationAccuracyNearestTenMeters // 精确到所需目标的十米以内
kCLLocationAccuracyHundredMeters // 精确到百米以内
kCLLocationAccuracyKilometer // 精确到最近的一公里
kCLLocationAccuracyThreeKilometers // 精确到最近的三公里
*/
locationManager.desiredAccuracy = kCLLocationAccuracyBest
/// 以米为单位指定最小更新距离
locationManager.distanceFilter = 5.0
/// 开始定位
locationManager.startUpdatingLocation()
停止定位
locationManager.stopUpdatingLocation()
定位回调 CLLocationManagerDelegate
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
/// 定位失败
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
}
获取经纬度
CLLocation
// 获取当前的经纬度
curLocation.coordinate.longitude // 经度
curLocation.coordinate.latitude // 纬度
// 两个经纬度之间的距离, 单位 m
lastLocation.distance(from: curLocation)
// 获取海拔高度
curLocation.altitude
过滤无效数据
location.horizontalAccuracy /// 水平精度,负数无效
location.verticalAccuracy /// 垂直精度,负数无效
// 无效数据过滤
let distanceInM = lastLocation.distance(from: curLocation)
if distanceInM < curLocation.horiontalAccuracy * 0.5 { return }
网友评论