Developer Tools 进阶 22m
评估功能的新变化
What's new in assessment
2020年6月23日
一句话判断
如果你的 App 需要在教育场景中提供测验或考试功能,这场 Session 展示了如何利用 Assessment Session framework 构建受管理的考试环境——但对大多数开发者来说这并不是刚需。
这场 Session 讲了什么
苹果在 iOS 14 中引入了 Assessment Session framework,这是一个面向教育领域的专门框架。它的核心功能是在考试模式下限制设备的功能,确保学生在考试期间无法切换到其他 App、查看通知或使用被禁止的功能。
Session 介绍了 AEAssessmentSession 的生命周期管理:启动考试会话后,设备会进入受限模式,只有被允许的 App 可以运行。开发者可以配置允许的特性(如是否允许拼写检查、自动补全、键盘快捷键等)。考试结束后,通过结束会话恢复设备的正常状态。整个过程都受到系统的严格管控,确保考试的公平性和安全性。
此外还介绍了配置选项,包括允许使用的键盘、是否开启辅助功能等细粒度控制,以及如何在 App 中优雅地处理会话中断(如设备重启)等边界情况。
值得深挖的点
受限环境的系统级保证。 Assessment Session 不是简单的引导访问模式(Guided Access),它是系统级的会话管理。会话期间系统会拦截通知中心、控制中心、Siri 等系统级交互,这种限制级别是普通 App 无法自行实现的。
会话状态的持久化与恢复。 考试过程中可能出现设备意外重启。Session 强调了会话状态的持久化设计——App 需要在会话开始时保存状态,在重新启动时检查是否有未完成的考试会话并恢复。
代码片段
import Assessment
// 创建考试会话配置
let configuration = AEAssessmentConfiguration()
configuration.allowsKeyboardShortcuts = false // 禁止键盘快捷键
configuration.allowsActivityContinuation = false // 禁止接力功能
// 启动考试会话
let session = AEAssessmentSession(configuration: configuration)
session.begin { result in
switch result {
case .success:
print("考试会话已启动,设备进入受限模式")
case .failed(let error):
print("启动失败: \(error.localizedDescription)")
@unknown default:
break
}
}
// 在 App 启动时检查未完成的会话
func sceneDidBecomeActive(_ scene: UIScene) {
if AEAssessmentSession.isRunning {
// 存在上次未完成的考试会话,恢复考试状态
restoreExamState()
}
}
// 正常结束考试
func endExam() {
session?.end()
// 会话结束后设备自动恢复正常状态
}
最佳实践
- 在 App 启动时检查未完成的会话。 通过
AEAssessmentSession.isRunning检查是否有未完成的考试,引导用户回到考试界面。 - 最小化允许的功能集。 只开启考试确实需要的功能,其余全部关闭。
- 提前处理权限请求。 考试模式下无法弹出系统权限对话框,所有必要权限必须在考试开始前获取。
- 做好离线支持。 很多考试场景网络不可用,确保考试内容已经预加载完成。
还有什么值得关注
- AEAssessmentConfiguration 支持细粒度的辅助功能配置,满足无障碍考试需求
- 会话期间日志系统仍然可用,但内容受保护,只能在会话结束后通过特定 API 读取
- 该框架需要特殊的教育类 App Entitlement,普通开发者账号无法直接使用
- 配合 Apple School Manager 可实现更大规模的考试部署管理
WWDC 2020