WWDC Quick Look 💓 By SwiftGGTeam
Create accessible Single App Mode experiences

Create accessible Single App Mode experiences

观看原视频

Highlight

Apple 无障碍团队的 Drew Haas 系统介绍了 iOS/iPadOS 上限制设备到单个 App 的所有模式,以及如何确保这些模式下无障碍功能仍然可用。


核心内容

Apple 无障碍团队的 Drew Haas 系统介绍了 iOS/iPadOS 上限制设备到单个 App 的所有模式,以及如何确保这些模式下无障碍功能仍然可用。

内容分三部分:Guided Access(用户主动发起的辅助功能锁定,适合认知障碍用户和儿童使用场景);三种程序化 Single App Mode(Single App Mode、Autonomous Single App Mode、Persistent System Banner Mode,适合自助终端、考试、医疗场景);以及 Single App Mode 下的无障碍 API 使用方式。

Guided Access 是 iOS 内置的辅助功能,用户可以通过三击电源键或侧边按钮进入。应用可以为 Guided Access 添加自定义限制,比如锁定特定 UI 元素、禁用硬件按钮、限制触摸输入等。

Automatic Assessment Configuration 框架让教育类应用在考试场景中自动配置系统设置,比如关闭拼写检查、禁用自动完成、锁定字典等。


详细内容

Guided Access 的认知无障碍设计

00:00)Guided Access 是 iOS 内置的辅助功能,专门为认知障碍用户设计。用户可以三击设备侧边按钮或电源键进入 Guided Access,应用进入锁定状态后,用户无法意外退出到主屏幕或切换到其他应用。

对于认知障碍用户、自闭症儿童、或者需要专注学习的场景,Guided Access 提供了一个安全的应用使用环境。应用开发者可以通过 UIAccessibility 接口为 Guided Access 添加更细粒度的控制。

关键点:

  • Guided Access 是系统级辅助功能,不需要 MDM 参与。
  • 用户可以通过三击侧边按钮快速进入和退出。
  • 适合个人设备的使用场景,如教育、认知障碍辅助。
  • 应用可以指定哪些区域在 Guided Access 模式下不可交互。

为 Guided Access 添加自定义限制

03:20)应用可以通过 UIAccessibility 的 Guided Access 相关 API 添加自定义限制。最常见的做法是标记那些容易让用户迷路的 UI 元素。

// 标记账户设置按钮在 Guided Access 时禁用
let settingsButton = UIButton()
settingsButton.isAccessibilityElement = true
settingsButton.accessibilityTraits = [.button, .notEnabled]

关键点:

  • accessibilityTraits 包含 .notEnabled 时,VoiceOver 会提示该元素不可用。
  • Guided Access 会尊重这些 trait 设置,锁定对应 UI 元素。
  • 适合锁定账户设置、支付信息、退出登录等危险操作。

Guided Access 的事件监听

05:40)应用可以监听 Guided Access 状态变化,比如在进入 Guided Access 时简化界面、退出时恢复完整功能。

NotificationCenter.default.addObserver(
    self,
    selector: #selector(guidedAccessStatusChanged),
    name: UIAccessibility.guidedAccessStatusDidChangeNotification,
    object: nil
)

@objc func guidedAccessStatusChanged() {
    if UIAccessibility.isGuidedAccessEnabled {
        // 进入 Guided Access 模式,简化界面
        simplifyInterface()
    } else {
        // 退出 Guided Access 模式,恢复完整功能
        restoreFullInterface()
    }
}

关键点:

  • UIAccessibility.isGuidedAccessEnabled 查询当前是否在 Guided Access 模式。
  • guidedAccessStatusDidChangeNotification 监听状态变化。
  • 应用可以在进入时隐藏高级功能,退出时恢复。

程序化请求 Guided Access 会话

07:15)应用可以主动请求进入 Guided Access 模式,这适合考试、自助服务亭等场景。用户会看到一个系统确认对话框。

UIAccessibility.requestGuidedAccessSession(true) { success in
    if success {
        print("Guided Access 已启用")
    } else {
        print("用户拒绝或设备不支持")
    }
}

关键点:

  • requestGuidedAccessSession(true) 请求进入 Guided Access。
  • requestGuidedAccessSession(false) 请求退出。
  • completion handler 告知请求是否成功。
  • 用户仍然可以手动退出(通过三击侧边按钮和输入密码)。

Single App Mode vs Guided Access

09:30)Single App Mode 是 MDM 管理的锁定模式,由设备管理服务器控制。Guided Access 是用户主动发起的辅助功能,不需要 MDM 参与。

Guided Access:
  - 用户主动发起
  - 个人设备场景
  - 通过辅助功能菜单或三击启用
  - 应用内自定义限制

Single App Mode:
  - MDM 远程控制
  - 企业/教育设备场景
  - 通过配置描述文件启用
  - 系统级锁定,无法轻易退出

关键点:

  • Guided Access 适合个人设备、儿童模式、认知障碍辅助。
  • Single App Mode 适合企业设备、自助终端、教育考试。
  • Guided Access 用户随时可以退出,Single App Mode 需要 MDM 解锁。
  • 两种模式都应确保无障碍功能可用。

Autonomous Single App Mode

12:00)Autonomous Single App Mode 让应用可以在特定条件下自动请求 Single App Mode,比如考试应用检测到考试开始。这需要设备处于监督模式下(Supervised),并且 MDM 已授予相应权限。

设备前提条件:
  - 监督模式设备
  - MDM 已配置 AutonomousSingleAppMode 权限
  - 应用已在允许列表中

触发流程:
  应用检测到考试开始

  请求 Autonomous Single App Mode

  系统自动锁定设备到当前应用

  考试结束后应用请求退出

关键点:

  • AutonomousSingleAppMode 是 MDM 配置权限,不是应用 API。
  • 应用通过 UIAccessibility.requestGuidedAccessSession 请求。
  • 系统在满足前提条件时自动授予 Single App Mode。
  • 适合自动化考试、医疗设备等无人值守场景。

Persistent System Banner Mode

14:45)Persistent System Banner Mode 是较温和的锁定模式。系统会显示一个持续的横幅,提示用户设备处于管理状态,但仍然允许用户退出。

Persistent System Banner Mode:
  - 显示系统横幅提示
  - 允许用户手动退出
  - 适合信息展示场景
  - 不阻止正常设备使用

关键点:

  • 比 Single App Mode 更温和,不会完全锁定设备。
  • 适合展示信息、临时活动、演示场景。
  • 用户可以随时退出,不会影响设备正常使用。
  • 需要设备处于监督模式。

Automatic Assessment Configuration

17:20)Automatic Assessment Configuration (AAC) 框架让教育类应用在考试时自动配置系统设置,关闭可能帮助作弊的功能。

import AutomaticAssessmentConfiguration

let configuration = AEAssessmentConfiguration()
configuration.spellCheck = .disabled
configuration.dictionaryLookup = .disabled
configuration.autoComplete = .disabled

let session = AEAssessmentSession(configuration: configuration)
session.begin { error in
    if let error = error {
        print("配置失败: \(error)")
    } else {
        print("考试模式已启动")
    }
}

关键点:

  • AEAssessmentConfiguration 配置考试时的系统设置。
  • 可以禁用拼写检查、字典查找、自动完成、预测文本。
  • AEAssessmentSession 管理考试会话的生命周期。
  • 考试结束后系统自动恢复原始设置。

AAC 的系统配置选项

19:10)AAC 框架提供了多个系统配置选项,覆盖常见的考试作弊途径。

configuration.spellCheck = .disabled           // 禁用拼写检查
configuration.dictionaryLookup = .disabled     // 禁用字典查找
configuration.autoComplete = .disabled          // 禁用自动完成
configuration.predictiveText = .disabled        // 禁用预测文本
configuration.grammarCheck = .disabled          // 禁用语法检查
configuration.correction = .disabled            // 禁用自动纠正
configuration.keyboards = .restricted            // 限制键盘类型

关键点:

  • 每个 configuration 属性对应一个系统设置。
  • 考试结束后系统自动恢复用户原设置。
  • 配置只在当前应用内生效,不影响其他应用。
  • 适合在线考试、认证测试、教育评估场景。

Single App Mode 下的无障碍功能

21:30)无论使用 Guided Access 还是 Single App Mode,都应确保无障碍功能仍然可用。VoiceOver、切换控制、缩放等功能不应因为锁定模式而失效。

锁定模式下应保留的无障碍功能:
  - VoiceOver (屏幕阅读器)
  - Switch Control (切换控制)
  - Zoom (放大器)
  - Large Text (大号文字)
  - Reduce Motion (减少动态效果)
  - AssistiveTouch (辅助触控)

关键点:

  • 锁定模式不应禁用用户需要的辅助功能。
  • 应用应该在锁定模式下测试无障碍功能。
  • 用户可能依赖 VoiceOver 导航应用界面。
  • 切换控制用户需要能够操作所有关键功能。

在锁定模式下测试无障碍功能

23:45)Apple 建议在实际设备上测试锁定模式下的无障碍体验。启用 VoiceOver、切换控制、缩放等功能,然后进入 Guided Access 或 Single App Mode,验证应用是否仍然可用。

测试清单:
  - 启用 VoiceOver,验证所有可交互元素都有标签
  - 启用切换控制,验证焦点顺序合理
  - 启用缩放,验证界面布局不会被破坏
  - 启用大号文字,验证文本不会溢出或被截断
  - 启用减少动态效果,验证关键动画仍然提供反馈

关键点:

  • 在实际设备上测试,模拟器可能不完全一致。
  • 每种辅助功能都应该单独测试。
  • 验证应用的核心功能在锁定模式下仍然可访问。
  • 测试退出锁定模式后的恢复流程。

核心启发

1. 为 Guided Access 设计界面简化策略

  • 做什么:当用户进入 Guided Access 时,自动隐藏复杂功能和设置入口,只保留核心功能。
  • 为什么值得做:认知障碍用户和儿童在简化界面中更容易完成任务,不会迷路或误操作。
  • 怎么开始:监听 guidedAccessStatusDidChangeNotification,进入时隐藏高级按钮,退出时恢复。

2. 在考试应用中集成 Automatic Assessment Configuration

  • 做什么:教育类应用在考试开始时自动禁用拼写检查、字典查找、自动完成等系统功能。
  • 为什么值得做:防止学生利用系统功能作弊,同时保证考试环境的公平性和一致性。
  • 怎么开始:创建 AEAssessmentConfiguration,禁用相关选项,用 AEAssessmentSession 启动考试会话。

3. 为自助终端设备实现 Autonomous Single App Mode

  • 做什么:自助服务应用在检测到空闲或特定条件时,自动请求进入 Autonomous Single App Mode。
  • 为什么值得做:无人值守设备需要自动锁定到当前应用,防止用户误操作退出到主屏幕或访问其他应用。
  • 怎么开始:确保设备处于监督模式,MDM 已授予 AutonomousSingleAppMode 权限,应用中调用 requestGuidedAccessSession

4. 标记容易迷路的 UI 元素为 Guided Access 禁用项

  • 做什么:在账户设置、支付信息、退出登录等危险操作上添加 .notEnabled trait。
  • 为什么值得做:防止认知障碍用户或儿童在 Guided Access 模式下误操作,导致数据丢失或安全问题。
  • 怎么开始:找到所有危险操作按钮,在 accessibilityTraits 中添加 .notEnabled,在 Guided Access 模式下测试。

5. 在锁定模式下保持无障碍功能可用

  • 做什么:确保应用在 Guided Access 或 Single App Mode 下仍然支持 VoiceOver、切换控制、缩放等辅助功能。
  • 为什么值得做:锁定模式的用户往往更需要无障碍功能,禁用这些功能会造成访问障碍。
  • 怎么开始:在设备上启用各种辅助功能,进入锁定模式,验证应用的所有关键功能仍然可访问。

关联 Session

评论

GitHub Issues · utterances