Get started with HealthKit in visionOS
Spatial Computing 进阶 20m

在 visionOS 上接入 HealthKit

Get started with HealthKit in visionOS

2024年6月10日

在 Apple 官方观看视频

一句话判断

visionOS 2 把 HealthKit 带上了 Apple Vision Pro,你的 iPad 应用可以零改动运行,但真正有意思的是用空间计算做沉浸式健康数据体验——比如在一个隔离了所有干扰的 Immersive Space 里记录情绪状态。

这场 Session 讲了什么

HealthKit 在 visionOS 2 上的能力基本对齐了 iPadOS:读写健康数据、聚合统计、注册数据变更通知,全部支持。数据通过 iCloud 在设备间同步,用户在 Settings 里管理授权。两种应用形态都可以用 HealthKit:基于 iOS 17 编译的 iPad 应用自动获得 Designed for iPad 体验,无需任何改动;使用 visionOS SDK 的原生应用则可以充分利用空间计算的独特交互方式。

Session 用一个情绪记录应用做案例,展示了如何把一个 iPad 应用适配成原生 visionOS 体验。关键改动包括:用 onGeometryChange 让图表随窗口缩放自适应、通过 openWindow 支持多窗口对比图表、以及用一个 Full Immersive Space 做情绪记录的沉浸式体验。

Guest User 场景下 HealthKit 有特殊限制:已授权的应用可以继续读取数据,但不能在 Guest 会话中发起新的授权请求。系统不会弹出授权弹窗,所以你需要在应用启动时检查授权状态,做好降级处理。

值得深挖的点

空间健康体验的设计范式

这场 Session 展示的设计思路很有参考价值。健康数据天然适合空间展示:图表可以在无限画布上展开,多窗口对比不需要 Split View 那种固定分屏,Immersive Space 更是为”专注型健康活动”量身定做的。

情绪记录那个场景设计得尤其好:用户进入 Immersive Space 后,其他应用全部隐藏,环境光调暗,用一个色彩丰富的沉浸式体验引导用户反思当前的情绪状态。记录完成后,色彩淡出,其他应用回归。这种”仪式感”在传统屏幕上很难做到,但空间计算天然支持。

技术实现上,这个体验不需要重写整个应用。Session 明确说了”It’s easy to create fully immersive spatial experiences without having to rewrite your entire app”。你只需要给特定功能加一个 Immersive Space 入口,其余部分继续用标准 SwiftUI。这降低了开发门槛,也让”渐进式空间化”成为可行的策略。

从 iPad 到 visionOS 的零成本迁移

Session 反复强调了一个事实:如果你的 iPad 应用已经正确使用了 isHealthDataAvailable() 检查和 healthDataAccessRequest() 授权流程,编译到 visionOS 后 HealthKit 功能直接可用。这不是模拟或兼容层,是原生运行。

这个零成本迁移的设计对开发者很友好。你可以先把 iPad 应用原样跑在 visionOS 上验证功能,再逐步添加空间计算特性。Session 建议的升级路径是:先让应用看起来属于 visionOS(标准 SwiftUI 组件自动适配)-> 然后增强现有体验(可缩放图表、多窗口)-> 最后创建全新的空间体验(Immersive Space)。

代码片段

用 onGeometryChange 做自适应图表

Chart(data: healthData) { point in
    LineMark(x: .value("日期", point.date), y: .value("数值", point.value))
}
.onGeometryChange(for: CGSize.self) { geometry in
    geometry.size
} action: { newSize in
    // 根据窗口大小动态调整图表数据点数量
    visibleDataPoints = calculatePoints(for: newSize)
}

场景:让健康数据图表在用户拖拽缩放窗口时自动调整数据密度。坑:计算逻辑要做防抖处理,否则每次微小尺寸变化都重新计算会很卡。

多窗口对比图表

// 在已有窗口中添加按钮,打开新窗口展示对比数据
Button("对比视图") {
    openWindow(id: "chart-comparison")
}

场景:让用户在不同窗口里并排查看不同时间段的健康数据。坑:如果 iPad 版已经支持 Split View,多窗口配置基本自动继承——但记得在 visionOS 上测试窗口间数据同步。

检查 HealthKit 可用性

// 在 visionOS 上必须检查,Guest User 场景下可能不可用
if HKHealthStore.isHealthDataAvailable() {
    // 正常流程
} else {
    // 降级展示,不要崩溃
    showUnavailableView()
}

场景:处理 Guest User 和旧版本 visionOS 的兼容。坑:Guest 会话中调用授权请求会静默失败,系统不弹窗,你的 UI 应该提前隐藏需要授权的入口。

最佳实践

已有项目: 如果你有 iPad 版健康应用,先确认是否正确使用了 isHealthDataAvailable() 检查。如果用了,直接在 visionOS 上测试即可。HealthKit 授权配置在 iPadOS 和 visionOS 之间是通用的,不需要重复配置。

新项目: 如果做 visionOS 原生健康应用,优先考虑哪些功能适合空间化。数据浏览用标准窗口就够了,但”记录""反思""冥想”这类需要用户专注的活动,Immersive Space 是更好的载体。不要为了用空间能力而空间化——空间计算是手段,不是目的。

还有什么值得关注

  • visionOS 上的 HealthKit 同时支持 visionOS SDK 原生应用和 Designed for iPad 应用,两种形态可以共存。
  • Swift Charts 在 visionOS 上自动适配空间外观,不需要额外配置。
  • 今年新增的 State of Mind API(情绪记录)在 visionOS 上有天然的使用场景——在 Immersive Space 里记录情绪比在手机上更沉浸。
WWDC 2024