认识基于文件的 ClassKit App
Meet ClassKit for file-based apps
2021年6月10日
一句话判断
如果你的教育 App 是基于文档的(如笔记、练习册),ClassKit 的新文件集成让学生在 Schoolwork 中直接打开你的文件,完成后自动汇报进度——不需要在两个 App 之间切换。
这场 Session 讲了什么
Session 介绍了 ClassKit 在 iOS 15 中对基于文件的 App 的支持。ClassKit 是 Apple 的教育框架,让教师通过 Schoolwork App 布置作业、跟踪学生进度。之前 ClassKit 主要面向基于内容的 App(如阅读、视频),iOS 15 扩展到了基于文件的 App(如文档编辑、笔记、绘图)。
新的集成方式允许教师通过 Schoolwork 分配一个文件(如 PDF 工作表),学生在你的 App 中打开和编辑这个文件,完成后进度自动同步回 Schoolwork。你的 App 通过 CLSContext 和 CLSDataStore API 报告学生的活动状态和完成百分比。
还介绍了如何使用 document-based app 的 UIDocumentBrowserViewController 来支持 ClassKit 的文件分配流程。
值得深挖的点
文件分配的完整链路
教师在 Schoolwork 中选择一个文件(如 PDF)分配给学生。Schoolwork 通过 ClassKit 把文件 URL 传给你的 App,你的 App 打开文件、提供编辑界面。学生完成编辑后,你的 App 通过 CLSDataStore 报告完成进度。教师回到 Schoolwork 就能看到谁完成了、谁没完成。整个过程不需要学生手动上传或分享文件——ClassKit 在底层处理了文件的传输和同步。
进度报告的粒度
CLSActivity 支持报告三种类型的进度:百分比(0-100%,适合有明确完成标准的内容)、二元(已完成/未完成,适合简单的阅读任务)、时间花费(适合开放性任务如绘画)。你可以为同一个 Context 中的不同 Activity 选择不同的进度类型。
代码片段
配置 ClassKit 上下文
import ClassKit
func setupClassKitContext(for documentURL: URL) {
let dataStore = CLSDataStore.shared
dataStore.contextsDidChange = { contexts in
// 当 Schoolwork 分配了新的文件时触发
// 更新 UI 显示需要完成的任务
}
// 创建或更新上下文
let context = CLSContext(
type: .exercise,
identifier: "worksheet.\(documentURL.lastPathComponent)",
title: "练习册",
topic: .math
)
context.localizedDescription = "完成第 3 章的练习题"
dataStore.mainAppContext?.childContexts.append(context)
dataStore.save { success, error in
if !success { print("保存 ClassKit 上下文失败: \(error!)") }
}
}
报告学生进度
// 当学生完成一部分练习时报告进度
func reportProgress(documentURL: URL, completionPercentage: Double) {
let dataStore = CLSDataStore.shared
dataStore.fetchActivity(for: documentURL) { activity, error in
guard let activity = activity else { return }
// 更新完成百分比
activity.percentComplete = completionPercentage
activity.isComplete = completionPercentage >= 1.0
// 添加额外的进度信息
activity.additionalInformation = "已完成 15/20 题"
dataStore.save()
}
}
// 当学生开始活动时
func startActivity(documentURL: URL) {
let dataStore = CLSDataStore.shared
dataStore.fetchActivity(for: documentURL) { activity, error in
guard let activity = activity else { return }
activity.becomeActive()
}
}
// 当学生离开活动时
func stopActivity(documentURL: URL) {
let dataStore = CLSDataStore.shared
dataStore.fetchActivity(for: documentURL) { activity, error in
guard let activity = activity else { return }
activity.resignActive()
}
}
支持 UIDocumentBrowser 的文件分配
import UIKit
class DocumentBrowserViewController: UIDocumentBrowserViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 支持从 Schoolwork 接收文件
allowsDocumentCreation = true
allowsPickingMultipleItems = false
// 检查是否有 ClassKit 分配的文件
if let classKitURL = checkClassKitAssignment() {
openDocument(at: classKitURL)
}
}
func checkClassKitAssignment() -> URL? {
// 从 ClassKit 的 deep link 中获取文件 URL
// Schoolwork 会通过 URL scheme 传递文件信息
return nil
}
}
最佳实践
集成优先级: 如果你的 App 已经是 document-based 的,ClassKit 集成只需要几行代码。优先在 App 启动时检查是否有 ClassKit 分配,如果有就自动打开对应的文件。如果没有,正常显示文件浏览器。
进度报告时机: 在学生完成关键操作时报告进度(如提交答案、保存文件)。不要太频繁地报告(每次按键都报告会浪费资源),也不要太少(只到最后才报告会让教师无法看到过程)。
还有什么值得关注
- ClassKit 的数据在设备间通过 iCloud 同步,学生换设备也能继续。
CLSDataStore的fetchActivity方法可以批量获取所有分配给学生的活动。- ClassKit 支持限时活动——教师可以设置截止日期,过期后自动标记为过期。