大多数浏览器和
Developer App 均支持流媒体播放。
-
认识用于基于文件 app 的 ClassKit
ClassKit 框架能帮助在您的 app 中向使用 Schoolwork app 的教师推出教育活动。探究如何采用最新基于文件的 API 在 app 中报告学生进度数据,从而令教师获得对学生学习情况的更清晰了解。我们还将向您展示如何使用 ClassKit 报告不同的数据类型,以及如何在开发者模式测试实施情况。
资源
-
下载
♪播放重低音音乐♪ ♪ 大家好 我是玛琳 ClassKit团队工程师 很开心可以向各位展示 我们为了基于文件app 添加于ClassKit的新API 今天我会介绍“课业”这个app 以及如何应用ClassKit 接着 我会针对基于文件的app 进行新API的深度回顾 再来 我会用示例实现逐一介绍 最后 会向各位展示 如何用ClassKit的开发者模式 测试新的API 先让我从简单概述“课业”开始吧 “课业”是一个教育app 让教师能分享作业 而学生可以用你的app学习 当你的app采用ClassKit框架 以及多样的可指派内容 也称为CLSContexts 并开始汇报活动的进度数据 教师将能指派该内容 并查看app汇报的进度数据 如果你的app有启用ClassKit 教师比较可能在他们的课程中 使用你的app 很快地 “课业”会更容易使用 并添加许多新功能 以简化教师作业流程 通知指令 并提供教师你的app的数据 熟悉了“课业”这个app 现在来看看你的app数据 会如何导入“课业” 你的app会把数据 提交给ClassKit框架 ClassKit会将该数据 浮现至“课业”app上 该数据便会呈现给学生和教师 这是“课业”的视图 以及几个启用ClassKit的app 指派的作业 如果我们轻点其中一份作业 可以看到采用ClassKit的app示例 并汇报学生进度数据 我们等一下会详细说明 这个用例的细节 查看完“课业”后 来谈谈我们新的基于文件的进度API 在App Store中 教育类app超过19万个 虽然很多人都采用 ClassKit基于上下文的API 但并非所有人都这么做 我们收到反馈 尤其是关于与文件互动的app 以及你希望采用ClassKit 可是上下文不完全符合你的用例 如果因为你的app是基于文件 你一直坚持采用ClassKit 我们也专为你添加新的API 这个新的API 适用任何与文件互动的app 如果你有一个app可以编辑文件 或只是开启并查看文件 那你会喜欢 我们为基于文件app设计的新API 采用此新API可以 在你的app里使用的文件 于“课业”里被指派出去时 汇报学生进度数据 当教师从启用ClassKit的app 指派内容 他们会获得额外的见解 这对他们有帮助 也是你的app绝佳的新用例 有一件重要的事需要注意 你的app务必采用Open in Place 当你的app支持Open in Place 学生与教师共享的那份文件 就会在你的app中开启 且不是复本 这是新的API 可在文件附加进度数据 称为fetchActivity 在CLSDataStore上也能用 这里展示的API 我有异步和异步替换两种版本 你可以在你的文件的文件链接 传递至此API 然后它会回传CLSActivity 一旦你有了CLSActivity 就能对其附加进度数据 现在来看看你的app可以提交的 进度数据类型 如果你已经采用ClassKit 那这就是回顾 我们目前可用的进度数据类型 如果你不熟悉ClassKit 这些类别目前 也用在CLSContexts上 但是同样的数据类型也适用于文件 先介绍CLSActivity 这是一个类别 用来囊括 所有与特定文件相关的 进度数据 我们有几种数据 可附加于CLSActivity 首先 我们有持续时间 这是学生用来处理指派文件 所花的时间量 所有文件类型的时间都应回传 要使用此API 只要调用 依靠CLSActivity的开始与停止法 接着我们有进度 这会是介于零与一之间的数值 进度通常会在你可以确认 学生处理文件的进度时使用 例如 假设你有一个 声音或视频文件 学生已处理了50% 你就会汇报回放进度为.5 要添加进度 可以直接设定进度性质 或是添加一个 从开始至结束的范围区间 可以添加重叠的区间 或多次使用相同区间 我们会处理逻辑性 以确认 把正确的进度汇报给学生与教师 我们也有 primaryActivityItem 如果你有一个可编辑的文件 这很有用 设定primaryActivityItem 代表这段数据 你想要突出显示给学生和教师看 就会在“课业”app界面的 主要部分出现 还有 additionalActivityItems 性质 这是一组CLSActivityItems 对于添加额外的元数据很有用 要添加primaryActivityItem 在CLSActivity设定 primaryActivityItem性质 要添加 additionalActivityItem 调用 addAdditionalActivityItem 在CLSActivity的功能 并传递你想要添加的 activityItem primaryActivityItem 和additionalActivityItem 性质会把参考数据 放至CLSActivityItem 三个子类其中一个 你可以添加以下任何子类 首先 我们有CLSBinaryItem 这用来代表任何二进制数据类型 使用示例像是一份测验中的问题 可以说学生回答正确或不正确 或你可以添加CLSQuantityItem 这可用于任何通用数字数值 你可以用在页码 投影片编号 或档案的总计算数字 最后是CLSScoreItem 这个类别是用于代表 总数之一的事物 例如 测验的分数 用户在总分十分中得到八分 你可以在活动中添加 任何这些子类的组合 其中一项 或全部都添加 了解我们可以添加的数据类型之后 现在来介绍在app中采用此API的 代码示例 我准备了一个示例app 可以开启和编辑文本文件 学生开启文本文件时 我会启动计时器 学生会查看、编辑文件 当学生差不多要关闭文件时 我会纪录总字数并停止计时器 现在来看看我打开文件时 以及学生开始与之互动时 会调用的代码部分 我有一个openFile功能 我会从这里开始追踪时间 在你的app中 你可以去 你原本用来打开档案的代码处 就是要在这里添加一点代码 才能启动计时器 首先 我会帮我的文件链接 提取CLS活动 得到活动之后 我会调用启动 以开始追踪时间 接着我会调用 保存于CLSDataStore 以提交我的改动 现在接续下去 在这里添加一个断点 我们等一下要测试实现时可以回来 现在 我也想要在学生完成时 停止计时器 并添加primaryActivityItem 所以来看看学生差不多要关闭档案时 会调用的代码 在这里 我会调用 CLSDataStore.shared. fetchActivity 抓取primaryActivityItem 则如果已经存在时可以更新 或如果原本没有 就创建新的CLSQuantityItem 有了CLSQuantityItem之后 就能更新其数值 并在我的活动上 设定为primaryActivityItem 我可以在我的活动添加进度 最后 调用停止以停止计时器 然后 我确认调用存档 如果在CLSDataStore 我们没有调用存档 那就不能持续 我们刚才完成的任何更改 我还要在这里也加一个断点 我们会用这个协助我们消除 学生进度数据提交内容的错误 现在已经在示例app采用API了 来看看要怎么用“课业” 和开发者模式 测试我们的实现 首先 我们需要设定ClassKit的 环境权限为开发 这是Xcode里面 默认数值为生产 我们会更改权限数值为开发 才能用开发者模式和 “课业”来测试 下次我们运行代码时 就会以开发者模式运行 完成测试后 一定要确认把这个设定改回生产 接着 我们需要在iPad上 开启开发者模式 我们会打开设定app 前往“开发者” 接着选ClassKit API 选择“教师” 在“课业”中把你的角色更改为教师 现在 我们会打开“课业”app 开启“课业”后 就会出现教师的界面 如果轻点右上角的 “创建作业”钮 可以创建一份作业 轻点“文件”钮 就能添加我们app支持的文件 接着我们会选择想添加的文件 输入作业的班级和标题 想要的话 你也能选择性地添加任何说明文字 接着轻点右上角的按钮 将此作业发布到班上 既然已经创建作业 可以把我们的角色切换成学生 测试我们提交进度数据的实现 现在回到设定app 在设定中 选择“开发者” 找到ClassKit API 并轻点“学生” 这可以更改我在“课业”里的角色 变成学生 我们回到“课业”app 看得出来我现在以学生身份登入 因为在我界面右上角 不再有“创建作业”钮 在屏幕中间 我看到我们刚才创建的作业 如果轻点它 会出现作业细节 我可以轻点文件图标 就会把我深层链接到我的app 也就是我开始汇报进度数据的地方 文件会在我的app开启 我的代码被调用 以启动计时器 在这里可以看到我们的断点 在调用存档以启动计时器时受到点击 如果点击“播放” 然后回到我们的app 可以看到“学生进度” 横幅从顶端下降 代表存档成功 计时器已启动 接着我会仔细查看 添加一大堆文本完成论文 我的示例app有“完成”钮 学生编辑完文件后会轻点 所以我会轻点左上角的“完成”钮 此时 我的closeFile功能 会被调用 我们可以看到第二个断点被点击 以将wordCount储存为 primaryActivityItem 并停止计时器 接着 我们可以轻点“播放” 回到“课业” 在“课业”我看得到 我的app提交的进度数据 首先 我看到时间为41分钟 这验证了我正确地调用开始 停止并存档 接着 我看到字数计算 我设定为primaryActivityItem 所有我设定为 primaryActivityItem的 CLSActivityItem子类 都会出现在这里 界面的主要部分 我可以看到字数计算为558字 验证了我提交的 CLSQuantityItem 正确运行 现在 把我们的角色切换回教师 看看我的app提交的数据 如何呈现给教师 在屏幕中央 我们看到所有学生的平均时间 和平均字数计算 下方显示被指派该作业的所有学生 在“学生单位”里 我看到一位学生提交的数据 如果我轻点“学生单位” 我可以看到我的app 汇报的进度数据 我们有 primaryActivityItem、时间 以及一个 additionalActivityItem 这会列为“适读年级程度” 以上就是使用开发者模式 测试ClassKit整合程度的方法 别忘了把权限改回生产 很好! 我们今天谈了很多 从新的API 乃至用开发者模式测试 就算你不认为你的app属于教育类 但是很有可能有教育者这么认为 让app可以启用ClassKit 代表他们想把你的app整合进课程时 你的app都准备好了 所以一定要采用我们的API 谢谢大家 感谢各位的反馈报告 有任何反馈都欢迎提交 我们乐于收到你们的意见 如果想要了解更多 我们基于上下文的API 可以去看看之前 “ClassKit的新功能”的教程视频 以及我们在2018年 “介绍ClassKit”的内容 谢谢大家 祝各位有美好的WWDC体验! ♪
-
-
7:25 - openFile()
func openFile() async throws { // Your existing code for opening a file goes here. let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) activity.start() await try CLSDataStore.shared.save() }
-
8:07 - closeFile()
func closeFile() async throws { let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) let wordCount = activity.primaryActivityItem as? CLSQuantityItem ?? CLSQuantityItem(identifier: "total_word_count", title: "Word Count") wordCount.quantity = currentDocumentWordCount() activity.primaryActivityItem = wordCount activity.progress = progress() activity.stop() await try CLSDataStore.shared.save() }
-
8:48 - closeFile()2
func closeFile() async throws { let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) let wordCount = activity.primaryActivityItem as? CLSQuantityItem ?? CLSQuantityItem(identifier: "total_word_count", title: "Word Count") wordCount.quantity = currentDocumentWordCount() activity.primaryActivityItem = wordCount activity.progress = progress() activity.stop() await try CLSDataStore.shared.save() }
-
11:20 - openFile() BreakPointHit
func openFile() async throws { // Your existing code for opening a file goes here. let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) activity.start() await try CLSDataStore.shared.save() }
-
11:55 - closeFile() BreakPointhit
func closeFile() async throws { let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) let wordCount = activity.primaryActivityItem as? CLSQuantityItem ?? CLSQuantityItem(identifier: "total_word_count", title: "Word Count") wordCount.quantity = currentDocumentWordCount() activity.primaryActivityItem = wordCount activity.progress = progress() activity.stop() await try CLSDataStore.shared.save() }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。