认识空间计算平台上的 Core Location
Meet Core Location for spatial computing
2023年6月5日
一句话判断
如果你打算为空间计算平台(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 需要能优雅地处理这种精度变化,不能假设定位始终是精确的。CLLocation 的 horizontalAccuracy 属性在这一点上变得更加重要。
现有 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
- 全沉浸式应用中的定位使用是否有额外的审核要求