iOS - Core Location

定位权限是否可以使用

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 }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容