What's new in ClassKit
App Store & Distribution 入门 14m

ClassKit 有什么新功能

What's new in ClassKit

2020年6月24日

在 Apple 官方观看视频

一句话判断

ClassKit 在 iOS 14 中新增了「可分配活动」和「自适应学习路径」支持——教师可以直接从你的 app 中选取特定页面或练习推送给全班,学生完成后进度自动同步回 Schoolwork。

这场 Session 讲了什么

ClassKit 是苹果的教育数据集成框架,让教育类 app 的学习活动可以被 Schoolwork app(苹果的教师端工具)统一管理和追踪。

iOS 14 的 ClassKit 新增了两个关键能力:

Assignable Activities(可分配活动)。教师可以查看 app 中所有已注册的 CLSContext,选择特定的活动(比如「第三章的数学测验」)分配给全班或特定学生。学生在 Schoolwork 中看到任务后直接跳转到你的 app 完成指定活动。

Adaptive Learning Paths(自适应学习路径)。你可以用 CLSContexttopicsuggestedAge 属性来标记内容的难度和适用年龄。Schoolwork 会根据学生的年级和能力推荐合适的学习活动。

Session 还介绍了 ClassKit 的新 CLSDataStore API 改进,支持批量更新和更高效的进度同步。

值得深挖的点

Context 层级的设计策略

ClassKit 使用树形结构组织学习内容:mainAppContext -> Subject -> Unit -> Activity。合理的层级设计决定了教师在 Schoolwork 中浏览和分配活动的效率。建议按「科目 -> 单元 -> 活动」三层组织,不要超过四层。每一层都要提供有意义的 titletopic,让教师能快速定位想要分配的内容。

活动完成度的精确报告

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 }
        }
    }
}

最佳实践

  1. 在 app 启动时同步 ClassKit 层级。教师可能在你上次注册 Context 之后修改了课程安排。每次 app 启动时 fetchOrCreateMainAppContext 并更新你的内容目录。
  2. 为每个活动设置 suggestedAgetopic。这些元数据决定了 Schoolwork 的推荐算法如何展示你的内容。不设这两个属性的活动在 Schoolwork 中的可见性会降低。
  3. 处理 CLSDataStoreactivityAuthorized 回调。用户可能随时在系统设置中撤销你的 app 的 ClassKit 权限,你的 app 需要在收到权限变更通知后优雅降级。

还有什么值得关注

  • Schoolwork 2.0 支持教师给活动附加截止日期和说明文字,你的 app 不需要处理这些元数据,Schoolwork 会统一展示。
  • ClassKit 数据只在设备本地存储,不会同步到 iCloud,这意味着每台设备上的进度是独立的。
  • 如果你的 app 同时支持 iPad 和 Mac,ClassKit 的 Context 层级在两个平台可以共享。
WWDC 2020