大多数浏览器和
Developer App 均支持流媒体播放。
-
ClassKit 新功能
ClassKit 框架帮助呈现您 app 中的宝贵教学内容,供教师纳入课堂课程。概括了解 ClassKit 整合工作流程,“课业”app 中的讲师和学生角色调试,以及旨在让发布至 ClassKit 变得更加简单的新功能。
资源
-
下载
(ClassKit新功能) 大家好 欢迎来到 ClassKit新功能演讲 我是John Calhoun 我是ClassKit和Schoolwork 团队的iOS工程师 (ClassKit介绍 新功能 最佳运用) 如果你刚接触ClassKit 我就先简单做一个介绍 让你知道应该了解什么内容 你应该关注的是 ClassKit的新功能 还有你可能会用到的一些 最佳编程实践的简要讨论
让我们从介绍ClassKit开始 (ClassKit是什么) ClassKit是Apple 在iOS 11.3中引入的框架
它是Apple教育生态系统 的核心部分 所以如果你的app面向的也是教育 那么你应该要 熟悉ClassKit框架 以及它能为你的app做些什么
ClassKit的目的在于 让你的app可以 与老师分享学生的进度 我等下会详细说到这是什么意思
由于学生的数据十分重要 ClassKit能够确保 这些数据的安全 并且只能被特定用户访问 比如得到授权能够 访问该数据的教师 让我们看一个例子
我以一个虚构的app为例 假设这款app是教用户写代码的 它包含了许多的学生信息
里面有练习和测验 来帮助检查学生 对这些东西学懂了多少 这已经包含了活动的概念了 如果能将学生的进度 与老师分享就更好了 简而言之 用ClassKit正好
这是使用这款app的学生 (教育情景) 该app想将学生的进度 与老师分享 同时又要保护学生的隐私
这就是ClassKit的功能 ClassKit确保学生数据 在设备中储存 然后发送至云端 之后安全地在云端储存
ClassKit同时确保这些数据 仅被有权限的用户访问 比如说学生的老师
那么这些老师和学生 如何在一款启用了ClassKit 的app中看到他们的进度呢
Apple为iOS提供了一款 叫Schoolwork的app
这是iPad的免费app 它自ClassKit首次亮相以来 就已上市 现在你可以下载
不仅美国学校使用 其他国家的学校也在用 老师使用Schoolwork 创建一项 名为讲义的作业 学生 从Schoolwork接受讲义
当你的app响应讲义活动 记录进度时 Schoolwork里的老师 和学生都可以追踪进度
我们简单看看Schoolwork 好让你理解它是怎么运作的
你第一次作为开发者 启动Schoolwork时 你会看到这样的界面 Schoolwork需要 被管理的Apple ID 这是学校使用的 Apple ID类型 好将这些ID发给老师和学生 因为我们都不怎么用 被管理的Apple ID 在iOS里有个很有用的开关 在开发者部分的设置里
你需要安装开发者版本的iOS 这会在设置中添加开发者选项
其中一个设置 被标记为ClassKit API
这里你可以模拟用户角色 不管是教师权限 还是学生权限用户 一开始这是关闭的
但如果你先选择老师 再打开Schoolwork 你就可以创建讲义并将其发送给学生 我们回到设置 将ClassKit API切换成学生
你再回到Schoolwork 就是学生角色了 你可以完成刚刚 老师发给你的讲义 如果你还跟得上的话 可以再切换回教师角色 就能够检查学生的进度了
若你从没用过Schoolwork 这就是讲义的样子 卡片顶部的 讲义收件人是老师选择的 讲义的标题和说明 就在收件人下面 也是老师创建的
但是活动 你看到的这个图标 可能是启用ClassKit的 app中的活动 那么我们如何从代码 从app中获取 再发送给讲义呢
通过ClassKit
WWDC 2018有一场演讲 专门是讲ClassKit 及其所有功能 简而言之 我会为你介绍ClassKit中 一个特定且重要的类
就是CLSContext 如果你对ClassKit 的全部不是很熟悉 那起码要理解CLSContext 这会让你知道你的app 在Schoolwork是否清楚 然后添加至讲义 都是因为CLSContext 你的app才能显示它支持的活动 如果你的app是教写代码的 那么每节课都可能是单独的活动 所以每节课都有一个 相应的CLSContext
当学生使用app时 这些一样的CLSContext 就会提供挂起进度数据的脚手架 在这个例子中 我刚刚说到我们 可以追踪一节课花费的时间 或者app中有一场测试 我们就可以将测验成绩 作为学生进度数据记录下来
正如我讲到的 你的app可以创建和活动数量 一样多的CLSContext 多少都可以 ClassKit将其组织在一个 父子关系的树形结构中
我们来看看到底什么是上下文树 它以CLSContext开始 如果你的app没有创建的话 这是主要app上下文 主要app上下文是在你需要时 由ClassKit创建的 该上下文是 所有创建的CLSContext 的来源 是上下文树的子项 是树的根节点
所以在app中使用 ClassKit进行任何操作之前 你需要从ClassKit 请求主要app上下文 只需调用CLSDataStore 单例即可 如图所示 在我们继续创建上下文 把它们添加到主app上下文之前 我们需要回过头看看 我们app想要呈现的 环境或活动是什么 (app活动) 我还是用刚刚 教你写代码的app为例 在我们的例子中 假设有三个主要部分 介绍部分 变量和数据类型部分 还有就是条件
我们将每个部分都看成是活动 但是问问自己 如果老师想将其中一部分作为讲义 这些部分都较大 对于单个讲义而言 包含的东西可能有点多 它的范围可能太大了
但是细看我们的app 每个部分app里都有独立的课程
课程更小 更易于接受 展示这些比活动更合理
因为部分相当宽泛 我就假设老师不会分配一整个部分 所以我就不考虑它们了 我们就留下这七个课程
在我们的app里 有一些课程后面还有测试 来检验学生对课程的理解情况 这是我们的app可以提供的 比较好的活动 是给老师的有用进度数据 比如 测试中学生的分数
那么这是什么意思呢 我们用ClassKit的树结构 测验可以作为 对应课程的子项活动 现在这里的每个项目都有意义 是可追踪的进度活动 不会过于宽泛 现在我们来看看app 用CLSContext 如何展示这些活动
所以我现在用树排列的方式 描述这些活动 树的顶端 就是由ClassKit提供的 主要app上下文 主要app上下文的下面 就是一级子项 也就是我们刚才说的七个课程 或者是带有测试的课程 这个作为上下文的子项代表了测试 代表app创建的 CLSContext的标签 是CLSContext 标识符属性
标识符是你希望分配给 CLSContext的任何字符串 对老师和学生不可见 所以你可以用任何你任何 有意义的方法来命名它们 在该例中 我的命名就相当紧凑但也具有描述性
CLSContext也有标题属性 这对老师和学生是可见的 待会儿会看到 我只展示上下文树的标题部分 因为整个树占屏幕控件 太大了 会看不见
让我们回到标识符 从软件的角度看 我们专门处理标识符属性
将具有给定标识符的CLSContext 添加到上下文树后 它就会有一个隐含的标识符路径
ClassKit API通常 会引用此路径 所以要简单解释一下 标识符路径是一个字符串数组 是CLSContext的 标识符数组 从上下文树的底部 一直到CLSContext 我从主app上下文的任一子项开始 并获取标识符 从树上往下走的时候 添加子项的标识符 直到到达预期CLSContext 你现在就有通往该 CLSContext标识符路径了
我只举了一个简单的例子 因为CLSContext 确实很重要
标识符路径是4下划线结构 和4下划线测试 它就指这一个CLSContext 并且是此测验上下文的标识符路径
现在将其在app中进行测试 并考虑我们想要支持的活动及其等级 我们就得到了这个 表示CLSContext的树 如果你想查看创建 CLSContext的代码 请点击此次演讲相关资源 回到演讲的内容 我们再次回到Schoolwork 将对于CLSContext的讨论 重新回到师生工作流程中
在设置中你可以选择教师角色 选择教师并启动 Schoolwork
在界面右上角有一个加号按钮 允许老师创建新讲义
点击该按钮 出现该界面 允许创建新讲义
正如我前面所说 老师可以决定将讲义发给谁 还可以创建讲义标题和介绍 但是更有趣的是 这个蓝色的加号按钮 标签是添加活动 点击该按钮 出现活动列表 你可以选择添加不同文件类型 但我们应该注意最上面的选项 app 点击该按钮会出现app活动列表 列表第二项就是我们的app
我们的app出现了 说明我们已经 创建了CLSContext树
右边的V形按钮告诉老师 可以查看该app的活动
点击该按钮 你认为教师界面会出现什么 是我们主要app上下文 第一个下行分支的 CLSContext 当然我们展示的 是CLSContext的标题 不是标识符 这样才是可读的
你可能注意到后五项都有V形按钮
这些都是包含测试的 CLSContext
例如 如果老师点击第三项 什么是变量
这就是测试 但是假设老师正在创建 一个介绍Swift的讲义 该课程还尚未提到变量 老师就可以点击此按钮 进行备份并返回 老师再点击右上角选择按钮 选择什么是Swift活动 这样你就可以将活动加入讲义
我们再回到讲义编辑视图 老师就可以点击右上角的发送 将讲义发送给学生
正如我们所见 带有活动的讲义卡片就会出现在 每一个人的Schoolwork中
ClassKit还有很多 需要学习的东西 比如如果学生点击活动 并启动app会怎样 以及如何报告进度数据 但这都不是我们 这次演讲要讨论的东西
如果你想了解更多关于这些的信息 我建议你查看其他与此相关的演讲 WWDC 2018的 ClassKit演讲
刚刚介绍了ClassKit的背景 现在我们来讲讲新功能
我要介绍的功能 在iOS 12.2的 ClassKit中引入 所以现在已经是可用的了
我们添加了新的 上下文提供程序扩展 添加了一个新功能 你可以调用该功能将活动标记为完成 以及添加了新的进度值 我首先说说上下文提供程序扩展 它的名字已经解释了它的功能 这是一个app的新扩展 可以用来创建 CLSContext树 来提供上下文
我在解释它如何工作之前 我想先告诉你如何创建该扩展 这是Xcode 如果您转到文件菜单 选择新建然后选择目标 对于iOS app扩展模板 (内容提供程序扩展模板) ClassKit上下文提供程序 有一个新的模板 当你将该目标加入你的app 它就会新建文件 现在我来说说内容提供程序扩展模板 是如何工作的 我会像你展示可能用到的样板代码 之后向你展示 如何运用于Schoolwork
我刚刚说到内容提供程序扩展模板 会创建新文件 实际上只是一个单一类 CLSContextProvider 是超类 你必须只用一个函数覆盖
完成上下文的 updateDescendants ClassKit会调用你的扩展 updateDescendants调用 在实现调用时 扩展会添加最小更新 或是提供正在传输的 CLSContext子项 你在该函数中不会回到子项 你的扩展只会添加或更新 上下文树中的特定部分并保存更改
原因是 你在该函数中的代码应该尽可能高校
我现在回到我们刚才的例子 来告诉你这是怎么工作的 你的扩展被调用 上下文完成 updateDescendants被调用 传输的CLSContext 是你app的主要app上下文 代码怎么知道 这是主要app上下文呢 最简单的方法是看 CLSContext传输有无父项 只有主要app上下文没有 所以你的合同是更新你的上下文树 让其提供至少第一层 也就是 主要app上下文的 直接子项CLSContext 回想我们的例子 在CLSContext 就相当于IDE是什么 Swift是什么 变量是什么等等 就是顶层的七个课程 我们一直用它们的标识符来指代它们 也就是这些
如果这些子项 在你的上下文树中都存在了 也不需要修改 那么你的代码什么也不用做 你就可以直接调用完成 不报错来指示一切正常 但扩展允许你创建树的这一部分 教师可能从没有看过 你app的这一部分 或者他们就从来 没有启动过你的app 我想补充一点 你的扩展程序可以自由填充 app中的上下文树的更多部分 其实它可以填充整个上下文树 只要它够快 待会你就知道这为什么很重要了 在这个例子中 还是使用最低限度 并且假设我们只创建传入的 CLSContext的直接子项 我们创建这七个子项 上下文树应该就是这样的
我再举一个例子 能让你们更加清晰地理解运作过程 现在扩展被再次调用 但是这次CLSContext 标识符3下划线数据类型 是传递给 函数的CLSContext
而代码会添加或更新 至少是3下划线数据类型的直接子项
你可能还记得 这是一个测试 所以 我们把它添加到这里 (上下文提供程序扩展目的) 那么上下文提供程序扩展 的目的是什么呢 我已经总结出来了 它让你的app能够 让CLSContext树 宣传你的app活动 这样老师其实并不需要 打开你的app
当然老师还是需要下载该app 但是下载行为可以让 你的ClassKit扩展 在iOS上注册 比如ClassKit 更确切来说是Schoolwork 将了解可用活动
你的app可能支持一系列活动 可能会有很宽或者是很长的树 在你启动app时创建一整个树 可能会导致性能问题 因此 此扩展旨在允许 在小批量的情况下 发放CLSContext
有一些ClassKit在 创建上下文树之前 需要用户交互 很遗憾 该扩展在这些情况下 并不适用 该扩展是在你的app 无法展示UI时被调用
最后 我想告诉你 上下文提供程序扩展 如何使用老师工作流程 回忆一下我之前的例子 老师要创建一个讲义 并浏览可用活动 如果你的app有 上下文提供程序扩展 老师在进入Schoolwork 的这个页面之前 它就能被调用 你的扩展应该已使用主 要app上下文调用 所以你的app可以作为 可用活动在这里出现 在老师开始进一步浏览 你的app活动子项时
你可以重复调用扩展 让你的CLSContext树更长
因为你的树或多或少是实时创建 但是必须在老师浏览时创建完成 这就是为什么你的扩展代码 要快速创建和保存 请求的CLSContext
现在你看到这些东西 是如何一起工作的了 扩展 你的app为活动和 schoolwork创建的树
ClassKit的另一个新功能 是一个让你可以标记 活动完成的API 这让学生更加容易告诉老师 分配的活动已完成
为了更好的理解为什么 这是一项厉害的新功能 我要再次打开Schoolwork 但这次是学生视角 我们看到了老师是如何进行分配活动 那么接收终端又是什么样的呢 这是我刚刚展示的讲义卡 而这时学生会在 Schoolwork中看到的样子 当他们点击
他们就可以看到带有活动的讲义 在这个例子中只有一个活动 点击活动会将其添加至app中 但他们完成活动后 学生依旧需要 返回Schoolwork 点击完成按钮
如果你的app采用的是 新的ClassKit API 就不需要最后一步了
在你的app中 你可以通过调用新API 来标记完成
CLSDataStore 有一个新功能 叫completeAllAssignedActivities 匹配context路径
该路径当然是 CLSContext或者是学生 所完成的活动的标识符路径 例如 学生刚刚完成了 这个app中的变量练习 我们可以通过 CLSContext路径 调用completeAllAssignedActivities 指示完成 2下划线变量 2下划线测试 下次学生再返回 Schoolwork时 它就会指示该活动完成 而且分配讲义的老师 也会看到学生活动已标记为完成 如果你的app采用了这项新调用 学生的工作流程会更顺畅
最后 ClassKit和 iOS 12.2 都添加了新的活动类型 正确/错误类型 (正确/错误类型) 在ClassKit介绍中 我没有讲到CLS活动类型 但是为了介绍新功能 我说到了每一个 CLSContext 都可以以CLS 活动对象的形式拥有活动 而且CLS活动可以包含 任意数量的CLS活动项目
CLSActivityItem 是少数其他类的父类 我想特别提到一个 就是CLSBinaryItem
CLSBinaryItem 只能在一半情况下展示进度 我将它们展示出来了 可能你想报告的进度就只是 学生过没过而已 CLSBinaryItem 有一个枚举来指示 此外你也可以展示真或假 是或否
但我们从一些开发者那里听到说 我们确实一些二元的东西
所以ClassKit定义了 正确/不正确枚举 来描述这种新类型的二元活动 想想在我们的app中的测试 它由十个问题组成 我们不会对主要活动项 使用二元活动类型 因为我们想把分数表示为数量 比如说老师可以看到学生得了70分
作为奖励 我们的app可以 添加其他活动项目 比如说每一个问题 都可以看到是正确还是错误 这样老师就能看到学生哪题答错 哪题答对 我只是举了一个这种类型 应该怎么使用的例子
最后 我们来讲讲ClassKit 编程最佳实践 (最佳实践)
我刚说到你可以在 上下文树中加入错误 一个CLSContext的 标识符路径不是唯一的 乍一听 这个错误好像很难做 但是想想这样的情景 你第一次启动你的app 尽职尽责地创建了一个 CLSContext树 为了创建app活动 这是原始树的一部分
第二次启动app时 不应该再创建一次 CLSContext树
这将添加具有与现有 标识符路径冲突的 标识符路径的CLSContext 在添加之前记住要检查 CLSContext在树中 是否已经存在
检查CLSContext 在树中是否存在 有几种方法 一是调用CLSDataStore功能上下文 matchingIdentifierPath 当完成模块被调用 请注意 该调用是异步的 返回的CLSContext空数组 将指示该路径的上下文尚不存在 所以可以创建 第二种方法是 调用CLSContext功能 子项 matchingIdentifierPath 这也是异步的 和前面的例子一样 如果没有上下文经过完成模块 那么你的app就可以 添加新CLSContext 在你的app中有很多地方 需要进行这样的检查 如果你采用的是新的 上下文提供程序扩展 你就添加了更多的矢量 那么也就有更多的东西需要检查 是否CLSContext 在树中已经存在
所以这可能是很棒的解决方案 就是实现CLSDataStore 代理函数 createContext forIdentifier parentContext 和parentIdentifierPath 如果你将其中一类 加入你的app中 CLSDataStore代理 那么当你调用任何一项 刚刚提到的函数 如CLSDataStore上下文 matchingIdentifierPath 代理函数就会在上下文 从未被创建的情况下才会被调用 实现委托就容易了 所有上下文都会创建到 app的一个位置
以我的经验 创建CLSContext实际操作 对每个app都不一样 所以这里的代码我没有写 如果你是第一次 添加ClassKit支持 可以从2018年WWDC的 ClassKit演讲 以及示范代码开始上手
这是一个你app中可能存在的 简单帮助函数的示范 该函数叫 beginActivity 可以调用以使特定的 CLSContext成为活动上下文 我们只将它传入标识符路径
该函数调用 CLSContext查询 以查找与传入的 标识符路径匹配的子项 再次强调 因为我们在 app的其他地方 设置了 CLSDataStore代理 我们可以肯定 如果从未创建 指定的CLSContext 那么它就在委托函数中 因此应从查询中 返回CLSContext
我们让上下文返回至活动 创建新活动并开始该活动 这一系列调用表明我们希望 以特定CLSContext的 时间形式记录进度
最后我们调用 CLSDataStore保存 来发起我们刚刚完成的调用
同样的 你就可以创建许多 像这样的帮助功能 但是上下文创建代码 只需要在一个地方 在你的CLSDataStore 代理函数中
如果你是ClassKit新手 我希望这个介绍 能够让你体验到它的功能 如果你认为老师和学生 能在教育领域使用你的app 那么你应该 考虑采用ClassKit 如果你对ClassKit 已经很熟悉了 我希望你能利用 我们在2019年添加的新功能 因为这些都是像你们这样的 开发者反馈的结果 (何去何从) 请查看该演讲的附带链接 你可以找到示例代码 文档和 其他更加深入的 ClassKit演讲链接 谢谢
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。