WWDC Quick Look 💓 By SwiftGGTeam
What's new in ClassKit

What's new in ClassKit

元の動画を見る

ハイライト

Apple は、2020 年にアクティビティのサムネイル、概要、推奨年齢、推奨完了時間、進捗レポート機能を ClassKit に追加し、Web サービスを通じて公開学習コンテンツをスクールワークのアクティビティ セレクターに事前入力できるように ClassKit カタログ API を開始しました。

主要内容

教育アプリを学校のシナリオに統合する場合、多くの場合、問題はコンテンツの配信後に発生します。教師はどのアクティビティを割り当てるのが適切かを知る必要があり、生徒はスクールワークから正しい場所に直接移動する必要があり、開発者は生徒のプライバシーを保護しながら進捗状況を報告する必要があります。 ClassKit はすでにアプリ内の学習アクティビティをスクールワークに公開できますが、2020 年の焦点はさらに 2 つの具体的な問題になります。アクティビティには教師が判断できる十分な情報が含まれている必要があること、コンテンツ ディレクトリはアプリの更新とは独立して管理される必要があることです。

スピーチはスクールワークのアプリアクティビティセレクターから始まります。教師が配布物を作成すると、セレクターに ClassKit 対応のアプリとアクティビティの階層が表示されます。アクティビティとは、本の章、ポッドキャストのストリーム、テスト、クイズなどです。クラスキットの場合CLSContextこれらのアクティビティは、メイン アプリ コンテキストを通じてツリー構造に表現および編成されます。生徒の進捗状況は、ClassKit のプライバシー モデルの中核である、教師によって割り当てられたアクティビティについてのみ報告されます。

新しいCLSContextメタデータにより、アクティビティは教師が直接使用できる教材のようになります。サムネイル、概要、推奨年齢、推奨完了時間、アクティビティ レポートの進捗データはすべてスクールワークに表示されます。教師はテストを見て、最初にアプリを開かなくても、それがレッスンに適しているかどうかを判断できます。

後半は ClassKit カタログ API に進みます。以前は、パブリック コンテンツはローカルで作成するアプリに依存することが多かったです。CLSContext、教師または生徒のデバイスがアプリを使用した後、ディレクトリが徐々に生成されます。新しい Web サービスにより、開発者は既存のサービスを組み合わせることができますCLSContext階層は JSON に変換されてアップロードされます。 Apple は、Schoolwork がアプリを参照するときに、対応するコンテキストを生成します。パブリック コンテンツはカタログ API を使用し、動的に生成されたコンテンツまたはユーザー固有のコンテンツは引き続きネイティブ ClassKit API を使用してレポートされます。

詳細

アクティビティの完全な可視メタデータ

06:25CLSContextまだ活動の基本単位です。 2020 年の新たな焦点は、教師がスクールワークで理解できる情報をコンテキストで提供できるようにすることです。スピーチでは例として測定クイズを使用します。まずクイズのコンテキストを作成し、次に概要とサムネイルを書き込みます。

// Create a context for quiz
let quizContext = CLSContext.init(type: CLSContextType.quiz, identifier: "science_Investigation_quiz", title: "Measurements Quiz")

// Add a summary describing this context
quizContext.summary = "A short quiz to test how much students know about scientific measurements and how to examine and analyze scientific data."

// Add a thumbnail for this context — ClassKit will downsize thumbnails to 330 x 330 px if needed
let bundle = Bundle.main
if let resourceURL = bundle.resourceURL {
    let imageURL = resourceURL.appendingPathComponent("measurements_quiz.jpg")
    if let thumbnail = thumbnailFromImage(atURL: imageURL) {
        quizContext.thumbnail = thumbnail
    }
}

キーポイント:

  • CLSContext.initスクールワークで閲覧できるクイズ アクティビティとしてクイズを宣言します。
  • summary教師と生徒向けの説明文です。このアクティビティが実際に何を検査するのかを説明する必要があります。
  • thumbnailアクティビティ選択プロセスに表示されると、ClassKit は必要に応じて画像を 330 x 330 ピクセルに縮小します。
  • コードはアプリバンドルから取得されますmeasurements_quiz.jpg、次にそれを渡しますthumbnailFromImage(atURL:)サムネイルを生成します。

サムネイルのメモリコストを制御する

(06:52) 大きな画像が直接ロードされるため、このスピーチでは特にサムネイル機能が逆アセンブルされています。UIImageアプリのメモリが大幅に増加する可能性があります。 CoreGraphics は、Active Directory の初期化中に使用するのに適した、ターゲット サイズに応じたサムネイルを生成できます。

// Create a thumbnail of maximum dimension 330 x 330 px from an image file
func thumbnailFromImage(atURL: URL) -> CGImage? {
   if let imageSource = CGImageSourceCreateWithURL(atURL as CFURL, nil) {
       let thumbnailOptions = [kCGImageSourceCreateThumbnailFromImageAlways as String: true,
                               kCGImageSourceThumbnailMaxPixelSize as String: 330]
       return CGImageSourceCreateThumbnailAtIndex(
           imageSource, 0, thumbnailOptions as CFDictionary);
   }
   return nil
}

キーポイント:

  • CGImageSourceCreateWithURLファイル URL から直接画像ソースを作成します。
  • kCGImageSourceCreateThumbnailFromImageAlwaysシステムにサムネイルを生成するように依頼します。
  • kCGImageSourceThumbnailMaxPixelSizeスクールワークで使用される寸法と一致するように、最大​​辺を 330 に制限します。
  • 関数の戻り値CGImage?に直接割り当てることができます。CLSContext.thumbnail

年齢、時間、進行状況のタイプをマークします。

(07:59) 年齢と推定所要時間は、教師がアクティビティを選択する際の意思決定情報です。 ClassKit は、これら 2 つの値を範囲として表します。 クイズは 9 ~ 11 歳に適しており、完了するまでに 15 ~ 20 分かかることが予想されます。

// Add suggested age range appropriate for the content — ages 9 to 11 years

quizContext.suggestedAge = NSRange(9...11)

// Add suggested time to complete this quiz — 15 to 20 minutes

quizContext.suggestedCompletionTime = NSRange(15...20)

キーポイント:

  • suggestedAge使用NSRangeコンテンツが適切な年齢層を示します。
  • suggestedCompletionTime使用NSRange推定完了時間を示します。単位は ClassKit のこのプロパティの定義に基づいています。
  • これら 2 つのフィールドはアプリの内部ロジックを変更しませんが、スクールワークのアクティビティに対する教師の理解に影響します。

(08:15) 進捗レポートでも、最初に機能を宣言する必要があります。スピーチでは、進捗率とプロンプトの使用数という 2 つの能力について言及しました。detailsこれはユーザーに表示されるテキストであるため、実行時に現在のロケールに従ってローカライズする必要があります。

// Add progress reporting capabilities

let reportingPercentDetails = "Reports percentage of progress"
let reportingCapabilityPercent = CLSProgressReportingCapability.init(
        kind: .percent,
        details: reportingPercentDetails)

let reportingQuantityDetails = "Reports number of hints used"
let reportingCapabilityQuantity = CLSProgressReportingCapability.init(
        kind: .quantity,
        details: reportingQuantityDetails)

quizContext.addProgressReportingCapabilities([reportingCapabilityPercent,
                                       reportingCapabilityQuantity])

キーポイント:

  • CLSProgressReportingCapability使用kindデータ型を記述するには、次を使用します。detailsこのデータがユーザーにとって何を意味するかを説明します。
  • .percent完了率に適合、.quantityプロンプトの数をカウントするのに適しています。
  • addProgressReportingCapabilitiesこれらの機能をクイズ コンテキストに付加することで、スクールワークはアクティビティの詳細にレポート可能な進捗タイプを表示できます。
  • detailsユーザーには、音声がランタイムを現在のロケールにローカライズすることを明示的に要求していることがわかります。

コンテキスト ツリーとカタログ API の管理

(10:01) Apple が提供するローカル管理の提案は非常に単純です。コンテキストの作成時にメタデータを完成させるようにしてください。古いバージョンのアプリで保存されたコンテキストにフィールドが欠落していることが判明した場合は、欠落している属性を更新します。アプリが古いコンテキストをサポートしなくなった場合は、それを削除します。コンテキスト プロバイダー アプリ拡張機能を使用するプロジェクトは、拡張機能も同期的に更新する必要があります。

11:12CLSContextいくつかの構造機能も追加されました: 読み取り専用identifierPathコンテキストの完全な識別子のパスを返します。新しいコンテキスト タイプには次のものがあります。courseそしてcustom;カスタム コンテキストで名前を設定できます。isAssignableコンテナノードは、割り当て不可能なアクティビティとしてマークされる可能性があります。講義内のブック ノードはコンテナです。これは章を保持するために使用され、教師が書籍全体に割り当てるべきではありません。

(14:00) ClassKit Catalog API は、Web サービスにコンテンツ管理を組み込みます。開発者は、CLSContext階層を JSON ペイロードに変換し、次の場所にアップロードします。api.classkit-catalog.apple.com/v1。公開コンテンツはこのアプローチに適合します。プライベート、動的に生成、ユーザー固有CLSContextネイティブ API を引き続き使用します。

(15:40) カタログ API POST リクエストは、コンテキストとサムネイルの 2 つのカテゴリに分類されます。コンテキストリクエストに含まれる内容environmentクエリパラメータ、Content-TypeAuthorization、本文は作成または更新されるコンテキストのセットです。それぞれのコンテキストは次のように分けられます。dataそしてmetadatadataからCLSContextフィールド、metadataロケール、minimumBundleVersion、およびキーワードが含まれます。

(18:12) コンテキスト エンドポイントには 3 つの操作境界があります。 POST には最大 200 個のコンテキストを含めることができます。子ノードを送信する前に、祖先ノードを送信する必要があります。コンテキストを削除すると、その子孫も一緒に削除されます。サムネイルエンドポイント PNG または JPEG を使用するには、サイズを 330 x 330 px として準備し、コンテキスト参照のないサムネイルを避けるために、最初にコンテキストをアップロードしてからサムネイルをアップロードします。

(21:19) 認証には JSON Web Token を使用します。開発者は、Apple Developer ポータルで ClassKit Catalog API キーを作成し、キー ID、チーム ID、UUID、発行時間と有効期限を使用してヘッダーとペイロードを形成し、ECDSASHA256 を使用して署名します。リクエストの中でAuthorizationヘッダーは次で終わる必要がありますBearerプレフィックスはトークンを運びます。

重要ポイント

1.教師にとって使いやすい Active Directory を作成する

やるべきこと:アプリ内で章ごとのプログラム、演習、クイズを作成するCLSContextレベル、完全な概要、サムネイル、suggestedAge、およびsuggestedCompletionTime。

実行する価値がある理由: スクールワークのアクティビティ セレクターにはこの情報が表示されるため、教師はアクティビティが課題に適しているかどうかを判断するために最初にアプリにアクセスする必要がありません。

開始方法: 最も頻繁に割り当てられる 5 ~ 10 個のアクティビティから開始し、メイン アプリ コンテキストから章、演習、テストの順にコンテキスト ツリーを構築し、公式サムネイル コードを使用して画像サイズを制御します。

2.課題内の進捗状況のみを報告するテスト モジュールを作成します

やるべきこと: テストの進捗状況をパーセンテージ、プロンプトの数、正誤スコア、合計スコアなどに分けて比較します。CLSContext上記の声明。

実行する価値がある理由: ClassKit のプライバシー モデルは、割り当てられたアクティビティの進行状況のみを報告するため、学校のシナリオにおける生徒のデータ最小化要件に適しています。

開始方法: まずログインしますCLSProgressReportingCapability.percentそして.quantity、ユーザーを見えるようにしますdetailsコピーライターは既存のローカリゼーション システムに接続されています。

3.コンテンツを整理するために分散不可能なコンテナ ノードを作成します

対処方法: ブック、コース、または単元をコンテナ コンテキストとして使用し、割り当てられる実際の章とテストを子ノードに配置します。

その価値がある理由: 教師は明確に構造化された目次を確認できるため、誤って本全体またはコース全体を課題として生徒に送信することがなくなります。

開始方法: コンテナ ノードに新しいコンテキスト タイプを設定し、必要に応じてそれを使用します。customカスタム名を入力してから、isAssignablefalse に設定します。

4.カタログ API リリース パイプラインの作成

対処方法: 公開コース カタログをアプリ公開プロセスから分離し、ClassKit Catalog API を介してコンテキストとサムネイルをアップロードします。

実行する価値がある理由: 公開コンテンツが変更された場合、アプリの新しいバージョンがリリースされるのを待たずに、スクールワーク内の検出可能なディレクトリを更新できます。

開始方法: まず、すでに持っているものを置きますCLSContextツリーは JSON 構造にエクスポートされ、200 コンテキストのバッチで送信されます。開発環境用environmentパラメータをテストし、確認後に本番環境にプッシュします。

関連セッション

コメント

GitHub Issues · utterances