0Pricing
Swift Academy · 课时

获取用户位置

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 请求位置授权
  2. 获取用户位置
  3. 在 SwiftUI 中显示地图
  4. 地理编码与区域
← 返回 Swift Academy