Meet Core Location for spatial computing
Spatial Computing 进阶 20m

认识空间计算平台上的 Core Location

Meet Core Location for spatial computing

2023年6月5日

在 Apple 官方观看视频

一句话判断

如果你打算为空间计算平台(visionOS)开发应用,这场 Session 是 Core Location 的入门必修课——定位精度的实现方式、“在使用中”的定义、以及与 iPhone 协同工作的细节都和 iOS 有明显差异。

这场 Session 讲了什么

Session 系统性地介绍了 Core Location 在 visionOS 上的工作方式,重点覆盖权限模型、定位精度、以及”在使用中”(when in use)概念在这个全新平台上的定义。

权限方面,用户可以看到与 iOS 类似的授权弹窗,可以选择允许一次、使用时允许或拒绝,还可以选择精确或模糊定位。API 使用方式不变——创建 CLLocationManager 并调用 requestWhenInUseAuthorization(),同时设置 Info.plist 中的使用描述字符串。

定位精度是这个平台的核心差异点。头显设备单独使用时,定位精度约为 100 米,和 Mac 类似。但如果用户的 iPhone 在附近,设备之间的协同连接能把精度提升到 iPhone 级别。这意味着定位精度是动态的,取决于设备组合。

“在使用中”的定义在空间计算平台上有全新解释。全沉浸式应用中,用户正在使用应用就视为”在使用”。对于窗口应用,Core Location 只有在用户”最近看过”(looked at)应用时才认为它在”使用中”。如果用户视线移开,应用会在短暂宽限期后停止接收位置更新。多个窗口同时可见时,只有用户正在注视的那个窗口能获取定位。应用退到后台或未运行时,不会收到任何位置更新,monitoring API 的更新也不会被投递。

值得深挖的点

“注视”作为前台判定标准:这是一个很独特的隐私保护模型。与 iPhone 不同(只要 App 在前台就能获取定位),visionOS 上即使应用窗口可见,如果用户没有在看它,也不算”在使用”。这种基于注意力的权限模型可能会影响你的 App 设计——如果定位是核心功能,你可能需要引导用户持续注视应用窗口。

iPhone 协同带来的精度跳变:当 iPhone 连接和断开时,定位精度会发生数量级的变化。你的 App 需要能优雅地处理这种精度变化,不能假设定位始终是精确的。CLLocationhorizontalAccuracy 属性在这一点上变得更加重要。

现有 iOS 应用的兼容性:如果你的 iOS App 已经使用了 Core Location,在 visionOS 上运行时,定位行为会按照上述规则自动适配。但需要特别关注你的使用场景——100 米精度是否足够?你的 UI 是否能在位置更新暂停和恢复时正确处理?

代码片段

visionOS 上请求定位权限和获取更新的基本代码:

// 在视图初始化时请求权限
class LocationViewModel: ObservableObject {
    let manager = CLLocationManager()

    init() {
        // 设置使用描述(也在 Info.plist 中配置)
        manager.requestWhenInUseAuthorization()
    }
}

// 使用 async 方式获取位置更新
actor LocationMonitor {
    func startMonitoring() async {
        // 获取持续的位置更新流
        let updates = CLLocationUpdate.liveUpdates()
        for try await update in updates {
            guard let location = update.location else { continue }
            print("纬度: \(location.coordinate.latitude)")
            print("经度: \(location.coordinate.longitude)")
            // 注意:horizontalAccuracy 可能在 65m ~ 100m 之间波动
            print("精度: \(location.horizontalAccuracy) 米")
        }
    }
}

最佳实践

  • 只在真正需要定位的上下文中请求权限,不要在 App 启动时就请求
  • 始终检查 horizontalAccuracy 并据此调整 App 行为——100 米精度下做精确导航毫无意义
  • 如果你的功能依赖精确定位,在 UI 上提示用户保持 iPhone 在附近
  • 测试时使用模拟器验证低精度场景下的 App 表现
  • 不要假设位置更新是持续的——视线移开会导致更新暂停

还有什么值得关注

  • Region Monitoring 和 Significant Location Changes 在 visionOS 上是否受支持
  • 精确/模糊定位的切换在 visionOS 上的用户交互方式
  • 设备协同连接的发现和状态监听 API
  • 全沉浸式应用中的定位使用是否有额外的审核要求
WWDC 2023