WWDC Quick Look 💓 By SwiftGGTeam
Accessibility by design: An Apple Watch for everyone

Accessibility by design: An Apple Watch for everyone

观看原视频

Highlight

Apple 以 Apple Watch 为例说明无障碍设计要从产品核心任务出发,通过高对比度表盘、Taptic Time、VoiceOver 定制声音和 AssistiveTouch 手势让更多用户独立使用手表。

核心内容

Apple Watch 的核心任务很简单:快速看时间,必要时安静地知道时间。这个任务放到盲人、低视力用户、单手操作用户身上,问题会立刻变具体。

低视力用户可能只剩中央视野。大屏幕并不一定更好,手腕上一块小屏幕反而更容易落在可见区域里。Apple Watch 的黑色背景和清晰文字,最初服务于所有人阅读时间,也直接帮助了低视力用户。

盲人用户走路时用一只手拿手杖。如果为了听时间而停下来、抬手、触摸屏幕,就会打断移动,还可能影响安全。Taptic Time(触感报时)和抬腕播报时间,把这个动作压缩成一次抬腕。

表盘也有同样的问题。Mickey Mouse 表盘对视力正常用户有角色动画和脚步动作,VoiceOver 用户最初只能听到普通文本转语音。Apple 后来和 Disney 合作,让 Mickey 用 30 多种语言说出时间,并根据 VoiceOver 状态调整笑声频率。

单手或手臂活动受限的用户还有另一类痛点:手表戴在手腕上,却没有另一只手去点屏幕。Apple 从大幅度手臂动作开始测试,最后收敛到 pinch(捏合)、double pinch(双捏合)、clench(握拳)和 double clench(双握拳)四个低能耗手势。

这些故事给开发者的结论很直接。先问产品的核心任务是什么,再问某类用户完成这个任务时会卡在哪里。技术方案要从这个卡点长出来。

详细内容

从产品核心任务开始

01:05)Apple Watch 是贴在皮肤上的个人计算设备。Apple 在设计无障碍功能时,先问它的核心价值是什么。对手表来说,第一件事是读时间。

这场 session 没有官方 Code tab 代码。下面用一个可运行的 Swift 片段,把演讲中反复出现的设计检查过程写成最小模型。它是一个文章示例,用来把逐字稿中的判断顺序固化成开发时可执行的检查清单。

struct AccessibilityNeed {
    let userGroup: String
    let productTask: String
    let barrier: String
    let designResponse: String
}

let watchNeeds = [
    AccessibilityNeed(
        userGroup: "low-vision users",
        productTask: "read the time",
        barrier: "small text and low contrast make the time hard to read",
        designResponse: "use a black background, legible letters, and a large-type watch face"
    ),
    AccessibilityNeed(
        userGroup: "blind users walking with a cane",
        productTask: "check the time while moving",
        barrier: "touching the screen requires stopping and taking one hand off the cane",
        designResponse: "speak the time after wrist raise and offer Taptic Time"
    )
]

for need in watchNeeds {
    print("For \(need.userGroup), \(need.designResponse) helps them \(need.productTask).")
}

关键点:

  • AccessibilityNeed 把用户群体、产品任务、障碍、设计回应放在同一个结构里。
  • userGroup 对应演讲中的低视力用户、盲人用户等具体人群。
  • productTask 对应 Apple Watch 的核心任务:读时间。
  • barrier 写清楚用户卡住的动作,例如停下脚步、放开手杖、触摸屏幕。
  • designResponse 对应演讲中的高对比度文字、大文字表盘、抬腕播报和 Taptic Time。
  • for 循环让检查项变成可打印的验收句,团队评审时能逐条讨论。

高对比度和大文字表盘

01:34)Apple Watch 的黑色背景和清晰字形,本来是为了让所有用户快速读时间。这个选择也帮助低视力用户。演讲提到一位 Usher syndrome(厄舍综合征)用户,她的视野集中在中央区域,小屏幕邮件反而更容易阅读。

02:19)Apple 还提到 large-type watch face(大文字表盘)。它为低视力用户设计,也对所有用户开放。

struct WatchFaceAccessibilityProfile {
    let name: String
    let background: String
    let typography: String
    let intendedBenefit: String
    let availableToEveryone: Bool
}

let largeTypeFace = WatchFaceAccessibilityProfile(
    name: "Large Type",
    background: "black",
    typography: "legible large letters",
    intendedBenefit: "help low-vision users read the time quickly",
    availableToEveryone: true
)

print("\(largeTypeFace.name): \(largeTypeFace.typography) on \(largeTypeFace.background)")

关键点:

  • WatchFaceAccessibilityProfile 记录一个表盘为什么对无障碍有帮助。
  • background 使用逐字稿提到的黑色背景。
  • typography 使用逐字稿提到的清晰字母和大文字。
  • intendedBenefit 写明目标是帮助低视力用户快速读时间。
  • availableToEveryone 对应演讲中“为低视力用户设计,但所有人都能使用”的事实。

Taptic Time 和抬腕播报时间

02:37)Taptic Time 让用户通过触感感知时间。演讲中的测试场景很具体:盲人用户正在移动,如果要用手触摸手表,就要停下并从手杖上移开一只手。更安全的方式是抬腕后听到时间,或通过触感知道时间。

enum TimeFeedbackMode: String {
    case spokenAfterWristRaise
    case tapticTime
    case visualFace
}

struct TimeCheckScenario {
    let situation: String
    let unsafeStep: String
    let preferredFeedback: [TimeFeedbackMode]
}

let walkingWithCane = TimeCheckScenario(
    situation: "user is walking with a cane",
    unsafeStep: "stop and take one hand off the cane to touch Apple Watch",
    preferredFeedback: [.spokenAfterWristRaise, .tapticTime]
)

print(walkingWithCane.preferredFeedback.map(\.rawValue).joined(separator: ", "))

关键点:

  • TimeFeedbackMode 列出这段演讲提到的三种时间反馈方式:语音、触感、视觉表盘。
  • spokenAfterWristRaise 对应抬腕后听到时间。
  • tapticTime 对应用触感回放时间。
  • TimeCheckScenario 把危险动作单独写出来,避免只讨论功能名称。
  • preferredFeedback 表示在移动场景里,语音和触感比触摸屏幕更适合。

为 VoiceOver 定制角色声音

03:30)Mickey Mouse 表盘最初对盲人和低视力用户的反馈不足。触摸表盘时,他们只能听到描述或普通文本转语音读出的时间。Apple 听到用户希望 Mickey 自己说话,于是和 Disney 合作录制声音。

04:29)这些声音录制了 30 多种语言。原型展示后,反馈从“这是否适合作为无障碍功能”变成“所有人能不能用”。Apple 还为 VoiceOver 开启和关闭两种状态设置了不同笑声频率:VoiceOver 开启时,Mickey 笑得更频繁。

struct CharacterVoiceFeedback {
    let character: String
    let languages: Int
    let voiceOverEnabledLaughsMoreOften: Bool
    let defaultExperienceLaughsLessOften: Bool
}

let mickeyFeedback = CharacterVoiceFeedback(
    character: "Mickey Mouse",
    languages: 30,
    voiceOverEnabledLaughsMoreOften: true,
    defaultExperienceLaughsLessOften: true
)

if mickeyFeedback.voiceOverEnabledLaughsMoreOften {
    print("\(mickeyFeedback.character) uses richer audio feedback for VoiceOver users.")
}

关键点:

  • CharacterVoiceFeedback 记录角色声音反馈的设计事实。
  • languages 使用逐字稿中的 30 多种语言,这里用 30 作为下限表达。
  • voiceOverEnabledLaughsMoreOften 对应 VoiceOver 开启时笑声更频繁。
  • defaultExperienceLaughsLessOften 对应 VoiceOver 关闭时笑声较少。
  • if 分支强调同一个表盘会根据 VoiceOver 状态调整音频密度。

AssistiveTouch 的低能耗手势

05:55)有些用户没有手臂,或没有另一只手去触摸 Apple Watch。Apple 的问题变成:能不能创造一个完全基于手势的人机交互方式。

06:33)团队先试了抬手、转手腕等大动作,很快发现需要能量消耗更低的手势。最后,Apple 使用加速度计、陀螺仪和健康传感器检测手臂里的细微肌肉动作,再交给机器学习模型区分差异。

07:33)最终的简单手势包括 pinch、double pinch、clench、double clench,用来完整访问 Apple Watch。

enum AssistiveTouchGesture: String, CaseIterable {
    case pinch
    case doublePinch
    case clench
    case doubleClench
}

struct GestureDetectionInput {
    let sensors: [String]
    let modelPurpose: String
    let gestures: [AssistiveTouchGesture]
}

let watchGestureInput = GestureDetectionInput(
    sensors: ["accelerometer", "gyroscope", "heart rate sensors"],
    modelPurpose: "distinguish minute muscle movement differences in the arm",
    gestures: AssistiveTouchGesture.allCases
)

for gesture in watchGestureInput.gestures {
    print(gesture.rawValue)
}

关键点:

  • AssistiveTouchGesture 只列出演讲明确提到的四个手势。
  • CaseIterable 让示例能遍历所有手势。
  • sensors 对应加速度计、陀螺仪和检测心率的健康传感器。
  • modelPurpose 对应机器学习模型的任务:区分手臂里很细微的肌肉动作。
  • for 循环打印支持的手势,便于把手势集合用于测试或文档生成。

核心启发

  • 做什么:给 watchOS App 的关键任务做一张“用户、任务、障碍、回应”表。 为什么值得做:Apple Watch 的无障碍设计从“读时间”这个核心任务开始,而非从控件清单开始。 怎么开始:先列出 App 中用户每天会重复做的 3 个动作,再为低视力、盲人、单手操作用户各写一条障碍记录。

  • 做什么:为时间、状态、进度这类短信息提供触感或语音反馈。 为什么值得做:Taptic Time 解决的是“走路时不方便触摸屏幕”的具体问题。 怎么开始:在 watchOS 中检查关键状态是否只能通过视觉获得,再为这些状态设计 VoiceOver 文案和触感提示。

  • 做什么:为角色化界面补齐 VoiceOver 下的声音体验。 为什么值得做:Mickey Mouse 表盘的案例说明,普通文本转语音会丢掉角色本身的体验。 怎么开始:找出 App 中有角色、品牌音效或动画反馈的地方,为 VoiceOver 用户准备等价的音频反馈和本地化文本。

  • 做什么:把常用操作压缩到低能耗手势或快捷动作。 为什么值得做:AssistiveTouch 的手势选择来自真实测试,目标是减少用户完成任务的体力消耗。 怎么开始:统计用户完成核心任务需要几步触摸,把最常用的操作暴露给系统无障碍动作或键盘快捷方式。

  • 做什么:让无障碍功能默认进入主体验,而非藏在单独模式里。 为什么值得做:大文字表盘最初服务低视力用户,后来对所有用户开放;Mickey 声音反馈也被所有人需要。 怎么开始:评审每个无障碍改进时加一个问题:这个改进是否也能提高普通使用场景的效率、清晰度或安全性。

关联 Session

评论

GitHub Issues · utterances