获取用户位置
使用 CLLocationManager 接收位置更新。
获取用户位置 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。
开始位置更新
获得授权后,请调用 startUpdatingLocation(),开始接收连续的位置更新。manager 会通过代理传递这些更新。不再需要时,请始终调用 stopUpdatingLocation(),以节省电量。
manager.startUpdatingLocation()
// ... later
manager.stopUpdatingLocation()在代理中接收位置
新的定位结果会在 locationManager(_:didUpdateLocations:) 中到达。数组按从旧到新的顺序排列,因此最后一个元素是最新的位置。
func locationManager(_ m: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let latest = locations.last else { return }
print(latest.coordinate.latitude, latest.coordinate.longitude)
}CLLocation 对象
每个定位结果都是一个 CLLocation,其中包含的不只是坐标:还有 coordinate、altitude、speed、course、timestamp 以及各种精度值。请检查这些信息,以判断定位结果是否足够准确。
func describe(_ loc: CLLocation) {
print("lat:", loc.coordinate.latitude)
print("lon:", loc.coordinate.longitude)
print("alt:", loc.altitude)
print("when:", loc.timestamp)
}所需精度
设置 desiredAccuracy 来告诉 Core Location 您需要多精确的定位结果。精度越高,耗电量越大。可用的常量包括 kCLLocationAccuracyBest、kCLLocationAccuracyNearestTenMeters、kCLLocationAccuracyHundredMeters 和 kCLLocationAccuracyKilometer。
manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters距离筛选器
使用 distanceFilter,让设备至少移动指定的米数后才接收更新。对于不需要记录每一次细微移动的场景,这样可以减少噪声并节省电量。
manager.distanceFilter = 50 // meters判断定位结果质量
horizontalAccuracy 属性表示置信半径,单位为米。负数表示定位结果无效。您还应检查 timestamp 的时间,拒绝过期的定位结果。
func isUsable(_ loc: CLLocation) -> Bool {
guard loc.horizontalAccuracy >= 0 else { return false }
let age = -loc.timestamp.timeIntervalSinceNow
return age < 15 && loc.horizontalAccuracy < 100
}请求一次性位置
如果您只需要一次定位结果,而不是持续的位置流,请调用 requestLocation()。manager 会向代理传递一个位置,然后自动停止。与开始持续更新相比,这种方式更加省电。
manager.requestLocation()处理位置错误
失败会在 locationManager(_:didFailWithError:) 中传递。常见错误之一是 CLError.locationUnknown,它通常是暂时性的,请继续等待。CLError.denied 表示权限已被撤销,您应当停止更新。
func locationManager(_ m: CLLocationManager,
didFailWithError error: Error) {
if let clErr = error as? CLError, clErr.code == .denied {
m.stopUpdatingLocation()
}
}重大位置变化监测
如果需要低耗电、粗略的跟踪,并且希望在后台唤醒应用,请使用 startMonitoringSignificantLocationChanges()。它只会在设备大约移动 500 米后触发,非常适合基于区域的功能。
manager.startMonitoringSignificantLocationChanges()方向与航向
对于指南针功能,startUpdatingHeading() 会通过 locationManager(_:didUpdateHeading:) 提供磁力计方向或真方向。请注意,CLLocation.course(行进方向)不同于航向(设备朝向)。
func locationManager(_ m: CLLocationManager,
didUpdateHeading newHeading: CLHeading) {
print("Heading:", newHeading.trueHeading)
}计算两点之间的距离
CLLocation 可以通过 distance(from:) 测量到另一个位置的直线距离,并以米为单位返回结果。无需任何地图界面即可实现邻近判断,因此非常实用。
let a = CLLocation(latitude: 41.0, longitude: 28.9)
let b = CLLocation(latitude: 41.1, longitude: 29.0)
let meters = a.distance(from: b)
print("Distance:", meters)快速检查:获取位置
检查您对接收定位结果的掌握程度。
回顾:获取用户的位置
现在您已经了解如何获取坐标:
- 使用
startUpdatingLocation()获取位置流,使用requestLocation()获取一次定位结果。 - 在代理中从
locations.last读取最新的定位结果。 - 调整
desiredAccuracy和distanceFilter,在功耗与精度之间取得平衡。 - 使用定位结果前,验证
horizontalAccuracy和timestamp。
常见问题解答
「获取用户位置」课时是免费的吗?
是的 — 「获取用户位置」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。
「获取用户位置」这节课中我会学到什么?
使用 CLLocationManager 接收位置更新。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Swift Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「获取用户位置」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Swift Academy 课中编写并运行代码吗?
能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。