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
- SwiftUI Accessibility: Beyond the basics — 讲 SwiftUI 中更细的无障碍语义、预览和交互优化。
- Support Full Keyboard Access in your iOS app — 讲运动障碍用户如何完全通过键盘操作 iPhone 和 iPad。
- Tailor the VoiceOver experience in your data-rich apps — 讲如何为复杂数据界面提供更合适的 VoiceOver 内容。
- Bring accessibility to charts in your app — 讲图表如何通过无障碍标签、摘要和声音图传达数据。
- Create accessible experiences for watchOS — 讲 watchOS App 如何支持大文字、VoiceOver 和辅助交互。
评论
GitHub Issues · utterances