ClassKit 有什么新功能
What's new in ClassKit
2020年6月24日
一句话判断
ClassKit 在 iOS 14 中新增了「可分配活动」和「自适应学习路径」支持——教师可以直接从你的 app 中选取特定页面或练习推送给全班,学生完成后进度自动同步回 Schoolwork。
这场 Session 讲了什么
ClassKit 是苹果的教育数据集成框架,让教育类 app 的学习活动可以被 Schoolwork app(苹果的教师端工具)统一管理和追踪。
iOS 14 的 ClassKit 新增了两个关键能力:
Assignable Activities(可分配活动)。教师可以查看 app 中所有已注册的 CLSContext,选择特定的活动(比如「第三章的数学测验」)分配给全班或特定学生。学生在 Schoolwork 中看到任务后直接跳转到你的 app 完成指定活动。
Adaptive Learning Paths(自适应学习路径)。你可以用 CLSContext 的 topic 和 suggestedAge 属性来标记内容的难度和适用年龄。Schoolwork 会根据学生的年级和能力推荐合适的学习活动。
Session 还介绍了 ClassKit 的新 CLSDataStore API 改进,支持批量更新和更高效的进度同步。
值得深挖的点
Context 层级的设计策略
ClassKit 使用树形结构组织学习内容:mainAppContext -> Subject -> Unit -> Activity。合理的层级设计决定了教师在 Schoolwork 中浏览和分配活动的效率。建议按「科目 -> 单元 -> 活动」三层组织,不要超过四层。每一层都要提供有意义的 title 和 topic,让教师能快速定位想要分配的内容。
活动完成度的精确报告
CLSActivity 支持三种进度指标:progress(0-1 的完成百分比)、durationReport(学习时长)、value(数值成绩)。Session 建议为不同类型的活动选择最合适的指标:测验用 value(分数)、阅读用 durationReport(阅读时长)、练习用 progress(完成比例)。
代码片段
import ClassKit
// 注册可分配的学习活动
class EducationApp: NSObject {
func setupClassKitHierarchy() {
let dataStore = CLSDataStore.shared
dataStore.fetchOrCreateMainAppContext { context, error in
guard let context = context else { return }
// 创建科目级别
let mathContext = CLSContext(
type: .chapter,
identifier: "math-grade3",
title: "三年级数学",
topic: "数学"
)
mathContext.suggestedAge = 9
context.addChildContext(mathContext)
// 创建单元级别
let multiplicationUnit = CLSContext(
type: .section,
identifier: "multiplication",
title: "乘法运算",
topic: "数学-乘法"
)
mathContext.addChildContext(multiplicationUnit)
// 创建具体活动(可分配的最小单元)
let practiceActivity = CLSContext(
type: .exercise,
identifier: "mult-practice-1",
title: "乘法口诀练习",
topic: "数学-乘法-口诀"
)
practiceActivity.suggestedAge = 9
multiplicationUnit.addChildContext(practiceActivity)
// 保存层级结构
dataStore.save { error in
if let error = error {
print("ClassKit 保存失败: \(error)")
}
}
}
}
// 报告活动进度
func reportProgress(activityID: String, score: Double, duration: TimeInterval) {
let dataStore = CLSDataStore.shared
dataStore.fetchActivity(for: activityID) { activity, error in
guard let activity = activity else { return }
activity.isStarted = true
activity.progress = 1.0 // 已完成
activity.value = score // 分数
activity.durationReport = .accumulated(duration)
if score >= 0.6 {
activity.isComplete = true
}
dataStore.save { _ in }
}
}
}
最佳实践
- 在 app 启动时同步 ClassKit 层级。教师可能在你上次注册 Context 之后修改了课程安排。每次 app 启动时
fetchOrCreateMainAppContext并更新你的内容目录。 - 为每个活动设置
suggestedAge和topic。这些元数据决定了 Schoolwork 的推荐算法如何展示你的内容。不设这两个属性的活动在 Schoolwork 中的可见性会降低。 - 处理
CLSDataStore的activityAuthorized回调。用户可能随时在系统设置中撤销你的 app 的 ClassKit 权限,你的 app 需要在收到权限变更通知后优雅降级。
还有什么值得关注
- Schoolwork 2.0 支持教师给活动附加截止日期和说明文字,你的 app 不需要处理这些元数据,Schoolwork 会统一展示。
- ClassKit 数据只在设备本地存储,不会同步到 iCloud,这意味着每台设备上的进度是独立的。
- 如果你的 app 同时支持 iPad 和 Mac,ClassKit 的 Context 层级在两个平台可以共享。