Create accessible spatial experiences
Spatial Computing 进阶 20m

创建无障碍的空间计算体验

Create accessible spatial experiences

2023年6月5日

在 Apple 官方观看视频

一句话判断

空间计算平台拥有 Apple 有史以来最长的首发无障碍功能列表,RealityKit 的 AccessibilityComponent 是关键接入点。

这场 Session 讲了什么

空间计算平台的无障碍功能覆盖了视觉、运动、认知和听力四个方面。视觉方面,VoiceOver 已经登陆这个平台,使用不同手指的捏合手势执行不同操作(右食指移动焦点、右中指后退、右无名指或左食指激活)。

对于使用 RealityKit 的 app,新的 AccessibilityComponent 是让 3D 内容可访问的关键。你可以配置无障碍标签、值、特征、自定义转子和自定义操作。VoiceOver 使用空间音频来提示对象的位置。

当 VoiceOver 启用时,app 默认不会接收手势输入——这是为了防止 VoiceOver 手势意外触发 app 操作。VoiceOver 提供了直接手势模式(Direct Gesture Mode),让 app 可以直接处理手势输入。

运动方面,Dwell Control 允许通过注视来触发操作,不需要手部动作。Switch Control 攓持通过外部设备控制。认知方面,Guided Access 和 Assistive Access 都得到了支持。

值得深挖的点

AccessibilityComponent 的使用方式值得关注。你需要为 RealityKit 实体创建 accessibilityComponent,设置 isAccessibilityElement 为 true,添加适当的特征(如 button),设置标签和值来描述元素,然后将组件添加到实体的组件列表中。每当 app 状态更新,记得同步更新 accessibilityComponent 的相关属性。

VoiceOver 的交互模式设计很巧妙。默认模式下,你可以通过 activate action 来响应 VoiceOver 的激活操作,无需手势输入。直接手势模式则允许 app 处理原始手势——两种模式可以同时使用。

代码片段

// 为 RealityKit 实体添加无障碍支持
var accessibilityComponent = AccessibilityComponent()
accessibilityComponent.isAccessibilityElement = true
accessibilityComponent.traits = [.button, .playsSound]
accessibilityComponent.label = "云朵"
accessibilityComponent.value = "不开心"

// 添加激活操作
accessibilityComponent.systemActions = [.activate]

entity.components.set(accessibilityComponent)

// 订阅激活事件
content.subscribe(to: AccessibilityActivateEvent.self) { event in
    // 通过 VoiceOver 激活实体
    updateCloudState(entity: event.entity)
}

// 状态更新时同步无障碍信息
var isHappy: Bool = false {
    didSet {
        entity.accessibilityComponent?.accessibilityValue = 
            isHappy ? "开心" : "不开心"
    }
}

最佳实践

  • 为所有交互式 RealityKit 实体添加 AccessibilityComponent
  • 提供有意义的标签和值来描述实体状态
  • 添加 activate action 让 VoiceOver 用户可以通过非手势方式交互
  • 状态更新时同步更新无障碍属性
  • 使用 SwiftUI 的无障碍修饰符增强标准控件的可访问性

还有什么值得关注

  • VoiceOver 在空间计算平台上使用 Spatial Audio 提示方向
  • Dwell Control 支持纯注视交互,适合手部活动受限的用户
  • 平台包含 Apple 有史以来最长的首发无障碍功能列表
  • 参考 SwiftUI Accessibility 相关 session 了解更多
WWDC 2023