大多数浏览器和
Developer App 均支持流媒体播放。
-
评估的新功能
现在在 Mac 上进行学术考试比以往都要简单。了解教育开发人员如何利用 iPhone,iPad 和 Mac 的自动评估配置框架进行测试并评估这些设备上的学生。并了解开发人员如何在 iOS 的测试和考试中启用受限功能,从而适应学生的需求或适合测试内容。
资源
相关视频
WWDC20
-
下载
(你好 WWDC 2020)
你好 欢迎来到 WWDC (评估的新功能) 大家好 我的名字是 Josh 我是 Apple 教育和企业团队的 一名工程师 今天 我很高兴与大家分享 Apple 在过去一年里 在评估领域的进展 教育深植于 Apple 的 DNA 中 无论是 Apple 努力将 Apple II 应用到每一间课堂 还是 iPad 和 Apple Books 正在改革教科书 Apple 产品都被誉为革命性的教育工具 我们的评估简介是在 2013 年 通过 iPad 上的自主单一 app 模式 进行的 这个系统使用 MDM 来限制 考试期间的设备 但是很快被授权系统所取代 称为自动评估配置 简称 AAC 下一步使得评估 app 的部署更加容易 并扩大了使用范围到非监督设备
我们与开发者们紧密合作 使 iPad 成为现代化的评估平台 它有助于防止不公平的优势 如切换 app 使用自动完成文本 和在字典中查找单词 因此 iPad 上的评估模式 被大多数标准化数字考试供应商所采用 现在我们要再一次推进这一进程 通过一个叫做自动评估配置的新框架 将标准化测试引入 Mac 我很乐意向你介绍这个新框架 所能提供的功能 Mac 电脑的评估模式与 iPad 不同 因为它不是在 iPad 上运行的 目标是在每个平台上保持相同的测试环境
通常对于一个新特性 我会解释用户可以做什么新的事情 但是对于评估模式 神奇之处在于用户不能做什么 在评估模式下 只有你的 app 是可见的 像程序坞 调度中心和通知中心都是不可用的 你无法录制或捕捉屏幕 虽然其他应用程序可以打开 但它们的窗口是隐藏的 而且对于所有其他进程 网络访问是被阻止的 播放媒体暂停 当会话开始和结束时 你的粘贴板被清除了 这个列表是一个子集 你可以随时查看开发人员文档 来回答任何具体问题 关于什么系统服务在此模式下会受到影响 需要注意的重要一点是 这个新特性是由权限保护的 关于如何应用这项权限 以及如何将其集成到 app 中的信息 也可以在开发者文档中找到 现在我们已经了解了 新的 AAC 框架的功能 让我们仔细看看它是如何工作的 但在讲任何代码之前 我想先讲评估模式生命周期 以及它与你的 app 的关系 当你的 app 开始运行时 评估模式将处于非活动状态 由你决定 什么是合适的时候来限制该设备 当时间到了 你的 app 将请求开始评估模式 此时 AAC 框架将开始修改 和限制系统服务 以创建安全的测试环境 这可能需要一些时间 因此 对于你的 app 来说 最好提供某种过渡用户界面 例如微调器 当所有服务均处于正确状态后 你的 app 将收到通知 你就可以开始考试了
考试结束后 你的 app 应请求结束评估模式 就像以前那样 这可能需要一些时间 所以呈现过渡用户界面 将会带来更好的用户体验
一旦 OS 系统恢复到它以前的状态 你的 app 将被通知 之后你将完成评估模式生命周期 这是通过 AAC 的愉快路径 但在现实世界中 总是有可能出现错误弹出 重要的是你的 app 知道如何处理它们 第一个有可能出现错误的地方 是请求开始模式之后 这项服务可能不能被限制 或者你只是忘了给你的 app 授权使用此特性 无论哪种方式 你的 app 都将被通知 评估模式将返回到非活动状态 下一个可能发生错误的地方 是在考试运行时 虽然不太可能 但有可能在评估模式下某一服务停止 而且我们不能再像以前那样 提供相同的安全保证 如果发生这种情况 我们不拆除评估模式 相反 我们会通知你的 app 出了问题 要求你停止考试 你的 app 应该立即隐藏所有敏感内容 然后通过结束模式释放剩余的系统服务 现在让我们看看这个周期 在代码中是怎样的 首先 我将指导你实现自己的 AAC 客户 首先 让我们创建一个 名为评估管理器的新类 此类的工作是连接 app 的用户界面 和评估模式生命周期 我们将为其提供两个功能: 开始评估模式和最终评估模式 要真正开始和结束模式 我们的管理人员需要框架 提供的一个 AE 评估会话 评估会话通过委托 报告其所有生命周期事件 因此我们需要在我们的管理器中 实现 AE 评估会话委托协议 现在让我们关注一下在开始函数中 发生了什么
首先 你要构造一个 AE 评估配置 该对象定义你的自定义评估体验 默认情况下 它是最严格的 你将用它来构造你的 AE 评估会话 在构建之后 你会想要设置它的委托 来接收生命周期事件 坚持参加会话也很重要 以确保它不会提前释放 从而结束评估模式 我之前提到过 进入评估模式可能需要一些时间 因此你将呈现一些过渡用户界面 以便你的用户理解发生了什么 最后 你将在会话中调用“开始” 并等待 OS 进入评估模式 会话将委托交回管理器 通过 DidBegin 或 failedToBegin 委托函数
在 DidBegin 委托函数 你将完全进入评估模式 你可以拆除过渡用户界面
并向学生展示你的测试材料
另一种可能性 是调用 failedToBegin 函数 在 failedToBegin 函数 你将首先拆除你的过渡用户界面 就像在 DidBegin 函数中一样
由于某些地方出错了 你可能会向你的用户呈现某种错误 最后 因为你无法进入模式 你的会话现在是无效的 它的引用可以被丢弃
现在 假设一切顺利 你收到 DidBegin 委托调用 学生可以开始考试了
一旦学生示意他们都完成了 你将在你的评估管理器上 最终调用结束评估模式
现在 首先 存储的评估会话是可选的 因此你必须展开它 就像进入评估模式一样 退出可能需要一些时间 所以你还需要向用户呈现 某种类型的过渡用户界面 最后 你可以要求展开会话结束 并使 OS 退出评估模式 一旦 OS 恢复到原来的状态 评估会话将通过 DidEnd 委托函数 通知管理器 在我们的 DidEnd 函数中 我们可以删除过渡用户界面 并可以显示测试后的内容 比如结果页面或成功页面 你可以通过丢弃对评估会话的引用 来完成测试
该协议的最后一部分 是 wasInterrupted 函数 在活动评估会话中出现错误时 将调用此函数 在这个函数中 你应该立即隐藏所有敏感内容 你还可以利用它作为一个机会 来执行必要的清理 或保存测试进度 然后 可以向用户显示错误信息 接下来 你将展示退出过渡用户界面 并通过请求结束会话使 OS 脱离评估模式 一旦收到 DidEnd 委托函数 你就会知道这已经完成了 就是这样 你有自己的 AAC 客户 它与你的评估应用程序很好地集成在一起 现在我们已经介绍了评估模式生命周期 以及它在代码中的样子 重要的是我们要回顾一下 在你的项目中采用这个新框架的一些策略 但首先 让我们谈谈蔬菜
在我小的时候 我总是讨厌我的蔬菜混在一起 我不喜欢豌豆与胡萝卜放在一起 我总是把它们在我的盘子里划分清楚界限 今天 作为一名开发者 这一点并没有改变 但现在 不再是豌豆和胡萝卜 而是在我的逻辑和效果之间划清界限
当我说到逻辑和效果时 我是在我的代码中 决定做事情的部分 和实际做事情的部分之间 划清界限
例如 决定向属性列表写入一个字符串 与实际写入它 或者决定发出一个网络请求 与实际发出那个请求 或者在你的情况下 是决定进入评估模式还是实际进入模式 在所有这些情况下 一个重要的模式出现了 如果我们从谁拥有它们的角度 来看待所有这些元素呢? 你的 app 拥有所有逻辑 你的 app 是节目的明星 这是一种创造酷炫新体验的东西 而所有正确的东西都只是一个细节 现在 你可能在想 “整洁 这和评估模式有什么关系?” 和其他副作用一样 AAC 会使编写测试变得困难 在你的情况下 甚至会使在 Xcode 中调试变得困难 所以你会怎么做? 你应该在你的逻辑 和 AAC 提供的效果之间 建立一个良好的边界 实现这一点的一种方法是使用 通常称为面向协议编程的协议 通过协议 你可以定义一个详细的合同 说明需要完成哪些工作 而不必担心谁来完成这些工作 为什么这很有价值? 让我们看一些示例代码 看看为什么 假设你已经定义了一个 封装了整个评估模式的协议 它有开始 有结束 还有中间的一切 我们称之为评估管理 该协议的一种实现 将依赖于真正的 AE 评估会话 这个实现将在生产设置中完成这项工作 但是 在测试设置中 你不希望机器被锁定 对于这种情况 你可以用一个 在请求进入评估模式时只记录日志的实现 来替代实际的评估模式 或者更好的是 你可以专门编写一个 包含测试期望的测试实现 这样 你就可以确保正确地调用了依赖项 依赖于协议可以更容易地实践 围绕评估模式的所有逻辑 如果这看起来有点深奥或令人困惑 你可以查看演示配套示例 app 以查看所有这些想法的功能示例
这是对面向协议编程的 更轻量级的解释 因此我建议查看前面 深入讨论该主题的讲座 它是一个很有价值的工具 可以让你的评估 app 更容易地编写测试 从而使 app 本身更好 既然评估开发者为学生分发测试 我认为只有他们的 app 也被测试 才有意义 除了测试内容 在 Xcode 中调试评估 app 时 建立边界将特别有用 Mac 的评估模式限制了哪些 app 可以接收用户输入事件 如果你在 Xcode 中调试你的 app 并且你碰到了一个断点 你将无法继续下去 该 app 将挂起 等待断点 你会被困住 无法与 Xcode 进行交互 幸运的是 有一个解决方案 如果你重新启动 Mac 评估模式将停止运行 实际上 所有系统服务都保证 在重新启动后恢复 这既是一种特性 也是一种很好的方式 可以让学生 在他们自己的 Mac上有一些代理 如果你试图死锁 Xcode 和你的评估 app 请记住重启能解决问题 现在我们来谈谈今年 我们在 iOS 和 iPadOS 上做了些什么 除了 Mac AAC框架也适用于 iOS 和 iPadOS 当在任何平台上进行构建时 这将形成统一的开发体验 在 iOS 和 iPadOS 上 AAC 框架实际上是在 以前的评估经验的基础上改进的 让我告诉你怎么做 这是来自 UIKit 的原始 API 开发者们一直使用它在 iPad 上 进入评估模式 我之前略过了这一点 但是在示例代码段中 我确信一些评估专家注意到 关于 AE 评估会话的一些不同之处 就是配置 评估会话被设计为可配置的 我们已经清楚地知道了 开发者们想要更多自定义的评估体验 所以我们用这个新的框架使之成为可能 在 iOS 14 中 你会注意到 AE 评估配置 包括启用系统服务的选项 像是听写 预测性键盘和拼写检查
这些功能对于良好的用户体验至关重要 尤其是当你考虑到不同国家的学生 可能参加的许多不同种类的考试 以及学生可能有不同的需求时 例如 允许拼写检查 可能在没有拼写测试的数学考试中 更有意义 或者连续路径键盘可能有利于语言测试 它使输入答案更容易 我们发布的这个功能列表非常酷 但实际上 这个列表的构想比列表更酷 我的意思是 评估模式的可配置性 现在是一个一流的功能 AE 评估配置是一个可扩展的值 它被设计成随着操作系统的发展而发展 更重要的是 随着开发人员的需求而发展 我觉得这很酷 这些新的定制点 只会在新的 AAC 框架中可用 因此你需要从 UIKit 中现有的评估模式 API 迁移 我还有一个令人兴奋的 AAC 新闻 现在我们已经为 iOS、iPadOS 和 macOS 提供了一个新的评估框架 并且在所有这些平台上 公开了完全相同的 API 所以我们自然会为 Catalyst app 提供这个功能 从 iOS 14 和 macOS Big Sur 开始 你的 iOS app 在 Mac 上运行时 将具有完整的评估模式支持 无论在什么平台上 你的 app 都会启动符合内容的评估模式 总而言之 我们给 Mac 带来了 一个全新的评估模式框架 我们在 iOS 和 iPadOS 上 提供了这个框架 并扩展了用户体验 使其更加可定制 最后 我们提供了 一个易用的、 跨平台的 API 它可以让你更容易地将 iOS 和 iPadOS app 带到 Mac 上 感谢大家收听 Apple 在评估领域的工作 享受使用这些强大的新工具 创建令人惊叹的 app
-
-
3:51 - Working with AAC
import AutomaticAssessmentConfiguration class AssessmentManager: NSObject { private var assessmentSession: AEAssessmentSession? func beginAssessmentMode() { let config = AEAssessmentConfiguration() // Configure AAC behavior let session = AEAssessmentSession(configuration: config) // Construct your session session.delegate = self // Receive lifecycle events via delegation assessmentSession = session // Retain the session // Present assessment mode bringup transition UI // ... session.begin() } func endAssessmentMode() { guard let session = assessmentSession else { return } // Present assessment mode teardown transition UI // ... session.end() } } extension AssessmentManager: AEAssessmentSessionDelegate { func assessmentSessionDidBegin(_ session: AEAssessmentSession) { // Stop showing assessment mode bringup transition UI // ... // Present sensitive testing content // ... } func assessmentSession(_ session: AEAssessmentSession, failedToBeginWithError error: Error) { // Stop showing assessment mode bringup transition UI // ... // Present some kind of error UI // ... // Release your reference to the AEAssessmentSession assessmentSession = nil } func assessmentSessionDidEnd(_ session: AEAssessmentSession) { // Stop showing assessment mode teardown transition UI // ... // Present your post-test UI // (maybe a result, a confirmation, or just the initial view) // ... // Release your reference to the AEAssessmentSession assessmentSession = nil } func assessmentSession(_ session: AEAssessmentSession, wasInterruptedWithError error: Error) { // Hide all sensitive UI // ... // Present some kind of error UI // ... session.end() } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。