ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ファイルベースApp向けのClassKitについて
ClassKitフレームワークは、App内の教育活動をスクールワークAppを使用する教師から見えるようにするのに役立ちます。最新のファイルベースAPIを採用して、App内で生徒の学習進捗データを報告することで、教師に生徒の学習状況をより深く理解してもらう方法を紹介します。また、ClassKitを使ってさまざまな種類のデータを報告する方法や、デベロッパモードで実装をテストする方法も紹介します。
リソース
-
ダウンロード
♪ (ファイルベースApp向けのClassKitについて) こんにちは Marinです ClassKitチームのエンジニアです 本日は ファイルベースのApp向けに ClassKitに新たに追加した 新しいAPIを紹介します まずClassKitとの併用方法を含め スクールワークを紹介し その後 ファイルベースApp向けの 新しいAPIについて 詳細を紹介します 続いて サンプル実装を ご覧いただき 最後に ClassKitの デベロッパモードを使用して 新しいAPIをテストする方法を 紹介します 最初にスクールワークの概要を 簡単に紹介します スクールワークは 教育向けAppです このAppを使用することで 教師は課題や宿題を共有し 生徒は学習を進められます ClassKitフレームワークを Appで採用し 割り当てられるコンテンツ すなわち CLSContextsを通知し アクティビティにおける 進捗データの報告を開始すると 教師はそのコンテンツを割り当て Appによって報告された 進捗データを確認できます Appが ClassKit対応の場合 教師がカリキュラムで Appを使用する確率が 高くなります また近い将来 スクールワークはさらに 使いやすくなる予定です 新たに追加予定の機能には 教師のワークフローを円滑化し 指示を提供し Appから教師にデータを提供する 機能などが含まれます スクールワークについて ご理解いただいたところで Appからのデータが スクールワークに 送信される方法を 見ていきましょう AppがClassKitフレームワークに データを送信します ClassKitはそのデータを スクールワークAppで表面化し データを生徒と教師の両方に提示します こちらはスクールワークの画面です ClassKit対応Appの課題が いくつか表示されています いずれかの課題をタップすると ClassKitを採用している Appの例と 報告された生徒の進捗データが 表示されます このユースケースの詳細は あとで見ていきましょう スクールワークの概要を 簡単に確認したところで 次に新しいファイルベースの Progress APIを紹介します App Storeでは現在 19万本以上の教育Appが 提供されています 多くのデベロッパが ClassKitのコンテキストベースAPIを導入 していますが そうでない場合もあります ファイルと連携するAppについて またはClassKitの導入を 検討していたものの コンテキストがユースケースに 適していなかったといった フィードバックをいただきました そこでAppがファイルベースで あるため ClassKitを 導入できなかった方のために 新しいAPIを追加しました この新しいAPIはファイルと連携する あらゆるAppに対応します ファイルの編集や ファイルを開いて閲覧できるだけの Appをお使いなら ファイルベースApp向けの この新しいAPIが気に入るはずです この新しいAPIでは ファイルを スクールワークで割り当てれば App内で使うこれらのファイルで 生徒の進捗データを報告できます ClassKit対応のAppから 教師がコンテンツを割り当てると 教師にとって有益な 追加の情報に加え Appに最適なユースケースも 提供されます ひとつ重要なこととして Open in Placeを Appに採用する必要があります Open in Place対応の Appを使えば 生徒と教師間で共有されている ファイルのコピーではなく原本を Appで開くことができます こちらは進捗データをファイルに 追加するための新しいAPIです fetchActivityと呼ばれるこのAPIは CLSDataStore内に存在します ここにはこのAPIのasyncと asyncの代替バージョンの 両方が表示されています 対象ファイルのURLを このAPIに渡すと CLSActivityが返されます CLSActivityを取得したら 進捗データを追加できます では Appで送信できる 進捗データのタイプについて 見ていきましょう すでにClassKitを 採用されている場合は すでに利用されている 既存の進捗データのタイプの 見直しとなります ClassKitを初めて利用する場合 現在CLSContextsで これらのクラスは使われていますが 同じデータタイプをファイルにも 適用できます こちらはCLSActivityです これは特定のファイルに 関連付けられている すべての進捗データが含まれた クラスです CLSActivityにはいくつかの データタイプを追加できます 1つ目はdurationです これは割り当てられたファイルの作業に 生徒が費やす時間の長さとなります すべてのファイルタイプで 時間の報告が必要となります このAPIを使用するには CLSActivityにある startとstopメソッドを 呼び出します 2つ目はprogressです これは0~1の間の数値となります progressは通常 ファイル全体を通しての 生徒の進捗状況を判断するために 使用されます 例えば 音声と動画ファイルがあり 生徒がファイルの50%を 再生したとします この場合 再生の進捗を 0.5として報告できます 進捗状況を追加するには progressプロパティを 直接設定するか 開始から終了までの範囲を 追加します 重複する範囲や 同じ範囲を複数回 追加することもできます 生徒と教師の両方に 正確な進捗状況が報告されるよう Appleがロジックを処理します primaryActivityItemもあります これは編集できるファイルが ある場合に役立ちます primaryActivityItemを設定すると このデータが 生徒と教師に 注目してもらいたいデータ であることを示すことができ データがスクールワークAppの UIの目立つ部分に表示されます さらに additionalActivityItemsプロパティも あります これは一連のCLSActivityItemsで 追加のメタデータを追加するために 役立ちます primaryActivityItemを 追加するには primaryActivityItemプロパティを CLSActivityで設定します additionalActivityItemを追加するには addAdditionalActivityItem関数を CLSActivityで呼び出し 追加するactivityItemに渡します primaryActivityItemと additionalActivityItemの プロパティはCLSActivityItemの 3つのサブクラスの いずれかへの参照を保持します これから紹介するいずれかの サブクラスを追加できます 1つ目はCLSBinaryItemです これはバイナリデータタイプを 示すために使用されます 用途例としてはクイズの問題が 挙げられます 例えば生徒の回答が正解だったか 不正解だったか などです CLSQuantityItemを 追加することもできます これは汎用の数値に 使用されます 例えばページ数や スライド数 文書の合計文字数などに使用できます 最後に紹介するサブクラスは CLSScoreItemです このクラスは 対象が何であれ 合計の一部を 示すために使用されます 例えば クイズの点数 つまり10点満点中8点を 示す場合に使用されます これらのサブクラスを 自由に組み合わせ アクティビティに追加できます 1つだけでも全部でも構いません 追加できるデータタイプについて 理解できたところで このAPIをAppに採用する コードのサンプルを 見ていきましょう こちらはテキストファイルを開いて 編集できるサンプルAppです 生徒がテキストファイルを開くと タイマーが起動します 生徒がファイルを編集し ファイルを閉じようとすると 合計文字数が記録され タイマーが停止します 私のコードの一部を使って説明します このコードは 私がファイルを開き 生徒がファイルで操作を始めるとき 呼び出されます このようにopenFile関数があります これは時間のトラッキングを 開始する場所です あなたのAppで ファイルを開くための 既存のコードに タイマーを開始するための 短いコードを追加します まず 私のファイルのURLから CLSアクティビティを 取得します アクティビティを取得したら 開始を呼び出し 時間の トラッキングを開始して CLSDataStoreで保存を 呼び出し 追加した変更をコミットします ここにブレークポイントを 追加しましょう 実装をテストする際 またここに戻ってきます 次に生徒が作業を終了した場合に タイマーを停止し primaryActivityItemを 追加する方法を紹介します 生徒がファイルを 閉じようとするとき 呼び出されるコードの一部が こちらになります ここで CLSDataStore.shared. fetchActivityを呼び出し primaryActivityItemを取得し すでに存在する場合は更新し 存在しない場合は 新規 CLSQuantityItemを作成します CLSQuantityItemを取得したら 値を更新し 自分のアクティビティで primaryActivityItemとして 設定できます 自分のアクティビティに 進捗状況を追加できます 最後に停止を呼び出し タイマーを停止します その後 忘れずに 保存を呼び出します CLSDataStoreで 保存を呼び出さないと 追加した変更はいずれも 適用されません ここではブレークポイントも 追加します ブレークポイントは 生徒の進捗データの送信を デバッグする際に 役立てられます サンプルAppにAPIを採用したので スクールワークと デベロッパモードを使用して 実装をテストする方法を 見ていきましょう まずClassKit環境の Entitlementを developmentに 設定する必要があります こちらはXcode内です デフォルト値はproductionです ここでEntitlementの値を developmentに変更し デベロッパモードと スクールワークで テストできる環境を整えます これでコードを実行するとコードが デベロッパモードで実行されます テスト終了後は 必ずこの設定を productionに 戻してください 次にiPadで デベロッパモードをオンにします 設定Appを開き > を選択し を選択して スクールワークでの役割を 教師に変更します 次に スクールワークAppを開きます スクールワークを開くと 教師向けのUIが表示されます 画面右上隅の課題作成ボタンを タップし ボタンをタップして Appが対応するファイルを追加し 課題を作成できます 追加するファイルを選択し 課題の対象クラスと 課題名を入力します オプションで指示のテキスト入力も できます 入力したら右上隅の 矢印ボタンをタップし この課題をクラスに公開します これで課題を作成できたので 役割を生徒に切り換え 進捗データの送信の 実装をテストします 設定Appに戻り > を選択し をタップします これでスクールワークでの役割が 生徒に変更されました スクールワークAppに戻ると UIの右側隅に 課題作成ボタンが 表示されていないため 生徒としてログインしていることが わかります 画面中央に 先ほど作成した 課題が表示されています これをタップすると 課題の詳細が表示されます ファイルのアイコンをタップすると 進捗データの報告を 開始するAppに ディープリンクされます Appでファイルが開き タイマーを開始する コードが呼び出されます ここではタイマーを開始するため 保存を呼び出した後 ブレークポイントがヒットされた ことが確認できます を押してAppに戻ると Student Progressバナーの ドロップダウンが上部に表示されます これは保存が正常に行われ タイマーが 開始されたことを通知するものです ここでは テキストを追加し エッセイを完成させます サンプルAppには ボタンがあります これは生徒がファイルを編集後に タップするボタンです ここでは画面左上隅の ボタンをタップします この時点で closeFile関数が呼び出されます 文字数をprimaryActivityItem として保存し タイマーを停止したことで 2つ目のブレークポイントが ヒットされたことが確認できます ここで を押して スクールワークに戻ります スクールワークでは Appから送信された 進捗データを確認できます まずここに41分という 時間が表示されています 開始 停止 保存を 正常に呼び出したことを示しています 次に 文字数も確認できます これはprimaryActivityItemとして 設定した項目です primaryActivityItemとして設定した CLSActivityItemサブクラスはすべて UIの主要部分である ここに表示されます 558の文字数が表示されており CLSQuantityItemの送信が 正常に機能したことを 示しています 次に 役割を再び教師に戻し Appによって送信されたデータを 教師の画面で確認しましょう 画面中央に 生徒全員の 平均時間と平均文字数が 表示されています その下に課題の対象となっている 全生徒の行が表示されます 生徒のセルでは ある生徒が送信した データを確認できます 生徒のセルをタップすると Appによって報告された 進捗データを確認できます primaryActivityItemの 時間が表示されており additionalActivityItemとして 読みやすさの成績が表示されています 以上がデベロッパモードを使用して ClassKitの統合をテストする方法です Entitlementを productionに戻すのをお忘れなく お疲れ様でした 本日は新しいAPIから デベロッパモードで APIをテストする方法まで 多くのことを学びました Appを教育用に使用することを 検討されていない場合にも 教育者がAppを活用できる 機会はあります ClassKit対応のAppを使っていれば すぐにカリキュラムにAppを 取り入れることができます ぜひAPIを採用してください 視聴いただき ありがとうございました フィードバックをいただき ありがとうございます 他にもご意見がありました ら ぜひお聞かせください また コンテキストベースのAPIに関する 詳細については 前のセッション 「What’s new in ClassKit」と 2018年のセッション 「Introducing ClassKit」をご覧ください ぜひWWDCをお楽しみください ♪
-
-
7:25 - openFile()
func openFile() async throws { // Your existing code for opening a file goes here. let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) activity.start() await try CLSDataStore.shared.save() }
-
8:07 - closeFile()
func closeFile() async throws { let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) let wordCount = activity.primaryActivityItem as? CLSQuantityItem ?? CLSQuantityItem(identifier: "total_word_count", title: "Word Count") wordCount.quantity = currentDocumentWordCount() activity.primaryActivityItem = wordCount activity.progress = progress() activity.stop() await try CLSDataStore.shared.save() }
-
8:48 - closeFile()2
func closeFile() async throws { let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) let wordCount = activity.primaryActivityItem as? CLSQuantityItem ?? CLSQuantityItem(identifier: "total_word_count", title: "Word Count") wordCount.quantity = currentDocumentWordCount() activity.primaryActivityItem = wordCount activity.progress = progress() activity.stop() await try CLSDataStore.shared.save() }
-
11:20 - openFile() BreakPointHit
func openFile() async throws { // Your existing code for opening a file goes here. let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) activity.start() await try CLSDataStore.shared.save() }
-
11:55 - closeFile() BreakPointhit
func closeFile() async throws { let activity = await try CLSDataStore.shared.fetchActivity(for: fileURL) let wordCount = activity.primaryActivityItem as? CLSQuantityItem ?? CLSQuantityItem(identifier: "total_word_count", title: "Word Count") wordCount.quantity = currentDocumentWordCount() activity.primaryActivityItem = wordCount activity.progress = progress() activity.stop() await try CLSDataStore.shared.save() }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。