ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ClassKitの新機能
ClassKitフレームワークを活用すると、Appの有益な教材の内容をわかりやすく示し、教師が授業のカリキュラムに組み込めるようにすることができます。このセッションでは、ClassKit統合のワークフロー、スクールワークAppでのインストラクターと生徒の役割のデバッグ、ClassKitへの公開をかつてないほど簡単にするために設計された新機能の概要を紹介します。
リソース
-
ダウンロード
(音楽)
What's New in ClassKitへようこそ ジョン・カルフーンです ClassKitとスクールワーク担当の iOSエンジニアです ClassKitが初めての方向けに まずは概要をお話します それから ClassKitの新機能と コーディング例をご紹介します
まず“ClassKitとは何か”です
iOS 11.3で導入された フレームワークであり― Appleの教育エコシステムの 中核です 教育アプリケーションの開発において 知っておいていただきたい フレームワークです
ClassKitを使うと 教師は生徒の進捗が把握できます 詳細は後ほどご説明します
生徒の個人情報は守られ― 特定の人たちにしか アクセスできない仕組みです データごとに権限が付与されます 例を見てみましょう これは架空のアプリケーションです コーディングを学ぶことができ いくつもの章が存在します 練習問題やテストがあり 生徒の理解度も確認できます その進捗状況を 生徒と教師で共有したいですよね ClassKitの出番のようです
このAppを使う生徒です
何とかして 個人情報は守りつつ 生徒の進捗を教師に送りたい
まさにClassKitの出番です ClassKitは生徒の情報を デバイス上でもクラウド上でも 安全に保ちます 適切な権限がある者しか 情報にアクセスできません 例えば教師ですね では実際 教師や生徒には どのように見えるのでしょうか
スクールワークというAppを 提供しています iPad用の無料Appで ClassKitのデビュー時からあります 米国の他にも 世界中の学校で使われています スクールワーク内で 教師は生徒に “配布物”と呼ぶ課題を出します
あなたのApp内で 配布物の部分に進捗があれば それがスクールワーク内に 反映されるのです スクールワークを実際に見てみましょう
デベロッパとして 最初に起動した時の画面です 管理対象Apple IDを聞かれます 学校が生徒や教師に割り振る Apple IDです 大抵の人は持っていません そこで設定のデベロッパの項目で 切り替えを行います
デベロッパモードが有効になっていれば 表示されます
ClassKitのAPIを開きます 教師または生徒の権限を持つユーザに なりすませます 初期値はオフです
教師を選べばスクールワークで 配布物を作って生徒に配布できます ClassKitのAPIに戻り 生徒に切り替えれば スクールワークを 生徒として操作できます 教師からの配布物に取り組めるのです そして再び教師に切り替えれば 生徒の進捗状況が見られます では 配布物のサンプルを お見せしましょう 一番上には教師が選んだ配布先が その下にはタイトルと 指示内容が書かれています
このアイコンが示す アクティビティ自体は 別のアプリケーションの ものかもしれません どうやって それをここに持ってきましょう? ClassKitです
ClassKitの詳細は WWDC 2018のプレゼンで ご覧いただくことができます ここでは1つだけ 重要なクラスの説明をします CLSContextです ClassKitに詳しくなくても これさえ理解しておけば スクールワークへの 反映の仕組みが分かります CLSContextが App内のアクティビティを表します コーディング学習用のAppなら レッスンごとにCLSContextを決めます すると そのCLSContextに 生徒の進捗データがひも付きます 先ほどの架空Appでは受講した時間や テストの成績などが 進捗データとして保存されます
CLSContextの数は App内のアクティビティ次第になります 上限はありません コンテキストをツリー構造に整理します
実際にツリーにしてみましょう 自動で定義されるAppコンテキストが 始点になります こちらはClassKitが作ってくれます そこにすべてのCLSContextを 子としてぶら下げます ルートノードですね なので まずはClassKitに Appコンテキストを要求しましょう CLSDataStoreにコールするだけです 生成されたAppコンテキストに 子を追加する前に ここで一旦考えます すべてのコンテキストが 必要でしょうか?
コーディング学習用Appの例で考えます Appに3つの章があるとします 導入章と 変数とデータ型に関する章― そして条件式の章です 1つの章をアクティビティとして 配布物の一部としても アサインできます ですが それだと少し 分量が大きすぎる気がします よく見ると各章は 複数のレッスンから成っています レッスンの方がコンパクトで アクティビティに適していそうです 章単位でアサインする教師は まず いないでしょう “章単位”の選択肢は捨てます レッスンは全7つです 一部のレッスンは 生徒の理解度を測るための テストがあります テストの得点などは 有意義な進捗データなので アクティビティに適しています こうしましょう ClassKitのツリー構造を活用し テストは各々のレッスンの子にします 進捗データの収集に適した アクティビティが洗い出せました 分量も適度です では CLSContextで どう表示されるかです
アクティビティを図式化してみました 頂点はClassKit提供の Appコンテキストです そこから第一階層の子が派生しています 7つのレッスンですね テストがあるレッスンは 更にその下に子がいます 各コンテキストに付けたラベルは identifierプロパティです この識別子は任意の文字列でOKです 教師や生徒の目に触れることは ありません この例では なるべく単純明快なものにしました
コンテキストには titleプロパティもあります 教師や生徒が見るのはこちらです タイトルはこんな感じにしました 狭いので一部のみお見せします
ソフトウェア側で扱うのは identifierプロパティです 識別子を与えられたコンテキストが 追加されると Context Identifier Pathができます ClassKit APIがよく参照するパスなので 軽く説明します ツリーのルートから 該当のコンテキストまでの識別子を すべて並べたものが このパスになります まずAppコンテキストの子の 識別子を拾い 識別子を追加しながら ツリーを下ります 目的のコンテキストに到達しました これだけでパスは完成します
図でハイライトしたコンテキストの場合 この“4 structs”と”4 quiz”が 並びます 該当のクイズコンテキストを参照する 唯一のパスになります Appの内容を確認し 適切なアクティビティを見極め このツリー構造まで落とし込めました コンテキスト生成のコーディング例は セッションのページに載せています ここでの紹介は省きます そろそろスクールワークに戻りましょう 全体の流れの話を続けます
設定で教師の操作に切り替えて スクールワークを立ち上げます 右上に表示されるプラスボタンから 新規の配布物が作成できます タップするとこのビューが出ます 配布物の新規作成画面です 教師は配布物の 配布先を決めるんでしたね タイトルと説明文もです “アクティビティを追加”という プラスボタンがありますね タップするとリストが出ます ドキュメントの形式の一覧ですが 一番上の“Apps”を選びましょう アクティビティの候補が表示されました 2番目にあのAppがありますね コンテキストのツリーが きちんとできた証しです
右側に矢印のアイコンがあるので 開いてみましょう 開くと何が表示されるでしょうか? Appコンテキストのすぐ下の階層の コンテキストですね 識別子ではなく タイトルが表示されているので 問題なく読めます
下の5つには矢印が付いています これらは最後にテストがある コンテキストです 例えば 上から3つ目の “変数とは?”をタップしてみます
ありましたね 作りたいのはSwiftの配布物だとします 変数を学ぶには早いクラスなので 1つ前の画面に戻ります 右上の選択ボタンをタップし― “Swiftとは?”を選びます これで追加は完了です 配布物の編集画面に戻ります 右上の投稿ボタンをタップすれば 対象の生徒に配布物が届きます そしてアクティビティを 反映したカードが 各々の画面に表示されます ClassKitに関して説明すべきことは まだまだありますが 今回のセッションでは 残念ながら割愛します WWDC 2018の ClassKitのセッションなど 関連した他のリソースにて ご確認ください
ではそろそろ 新しい機能の説明に移ります iOS 12.2向けに導入された機能なので 今すぐ利用可能です 新たにContext Provider Extensionを 追加しました アクティビティの完了を示すための 新機能と 新しい値型も追加しています まずはContext Provider Extensionです 分かりやすい名前です この新しいExtensionは コンテキストツリーに コンテキストを生成させます まずは このExtensionの作り方を 説明します 最新のXcodeです Fileメニューで “New”“Target”と進み テンプレートを探します ClassKit Context Providerが ありました こちらをAppに追加してください このExtensionの仕組みを サンプルコードとともに紹介します スクールワークとの関係も後ほど見ます
このExtensionは ファイルを1つ作ります 正確には1つのクラスです CLSContextProviderはスーパークラスで オーバーライドが必要です updateDescendants(of:completion:) です ClassKitがこれをコールすると Extensionが 指定されたコンテキストの子を 最新の状態にします 処理は最小限のもので ツリーの特定の箇所に対してのみ 追加やアップデートを行います この部分のコードは 効率の良さが求められます
先ほどのサンプルAppで 考えてみましょう updateDescendantsが コールされたとします 指定されたのはAppコンテキストです 親の有無を確認すれば Appコンテキストかどうかが 見極められます 唯一 親が存在しないからです 最低限 ツリー上ですぐ下の階層を アップデートします つまりAppコンテキストの 直接の子たちです 例のAppのコンテキストで言えば “変数とは?” “Swiftとは?”などでしたね レッスンは7つでした 識別子で表すと こんな感じでした
すべての子がツリーにそろっていれば 変更は不要です 何の処理もせずに completionブロックをコールします ただこのExtensionを使えば 教師がAppを 立ち上げるのが初めてでもOK きちんとツリーの一部を作ります 追加できるコンテキストの数に 上限はありません 処理が速ければ ツリーを丸ごと作れます 時間はかけられません 例では 必要最小限にとどめて 指定されたコンテキストの 直近の子のみを作ります すると7つの子が並ぶ このような形になります
もう1つ例を見て理解を深めましょう 再びExtensionがコールされました ただし今回は 指定されたコンテキストが 識別子が3 datatypesのものです 最低限 3 datatypesの直近の子を 追加または アップデートする必要があります 確か子はテストでしたね 早速 追加しました
このExtensionの目的は何でしょうか コンテキストツリーを作る きっかけを提供することで アクティビティの宣伝に つながると思いました ダウンロードさえされていれば 初めて起動する時でも機能します ダウンロード時に ExtensionがiOSに登録され ClassKitやスクールワークに 認識されます
アクティビティが多いAppだと ツリーが広く深くなります 起動時に一気に作ると大きな負担です だからこのExtensionはコンテキストを 小出しで追加できる仕様にしています ユーザインタラクションをトリガに ツリーを作る仕様のAppでは 残念ながら このExtensionは機能しません UIが表示される前に Extensionはコールされます
ではこのExtensionは教師の作業に どう関わるのでしょうか? 先ほどの例をもう一度 配布物の作成中で アクティビティを調べています この画面を開くまでに すでにExtensionはコールされています 指定はAppコンテキストです ここにAppが表示されるのは そのためです 教師がアクティビティの階層を 掘り下げるたびに Extensionへのコールが繰り返され ツリーも深くなっていきます 教師の操作に合わせて ほぼリアルタイムで ツリーが作られます だからこそ このExtensionのコードは 効率の良さが重視されるわけです Extensionの仕組みと効果は これでご理解いただけたと思います 次の新機能は― アクティビティの完了を 示すためのAPIです 課題を終えた生徒が 教師にそれを通知しやすくなります この機能の良さを知るには スクールワークを 生徒として操作しましょう 先ほどは課題を出す側でしたが 今度は受け取る側です 先ほど見た配布物のカードです 生徒側ではこう見えます タップします
アクティビティ付きの配布物が 表示されました タップするとAppに飛べます ただアクティビティの完了後に スクールワーク上で 完了の操作が必要です 新しいAPIを導入することで 最後の操作が省けます AppからAPIをコールして 完了状態にできるのです
その新たに用意された機能は completeAllAssignedActivities (matching contextPath:)です 当然 パスは完了したコンテキストへの Identifier Pathです 先ほどのAppで 変数のテストを終えたとします 完了の示し方はこうです “2 vars, 2 quiz”のパスを渡し 新機能をコールするだけです スクールワークに戻ってみると 完了になっていますね 課題を出した教師側でも その生徒は完了扱いになります 生徒の作業が 格段にスムーズになりますね
最後は新しい Activity Itemの値型の紹介です CorrectとIncorrectです
まずはCLSActivityクラスについて 簡単に説明したいと思います 各コンテキストにはひも付けられた Activity Objectがあります それらは複数のActivity Itemsを 持つことができます
CLSActivityItemは 複数の子クラスを持っています その内の1つに CLSBinaryItemがあります
2択の進捗ステータスのみ表現できます これらがそうです 生徒の合否をレポートに含めたければ それに適した列挙型は“Pass/Fail” 他にも“True/False” “Yes/No”がありますが もう1種類欲しいという 意見がありました
そこで“Correct/Incorrect”が 新たに追加されたのです サンプルAppのテストで考えます 全部で10問あります Primary Activity Itemは 点数にしたいので 2択の値型は不向きです この生徒は7割の問題に正解しました おまけのActivity Itemを追加できます 例えば 各問題の Correct/Incorrectを表示すれば 生徒がどの問題を 間違えたのかが分かります 新しい値型の活用例の紹介でした 最後にコーディングの注意点を 紹介しておきます
同じコンテキストツリーの中で Identifier Pathが重複すると エラーになります そうそう起きない気がしますよね こんなケースがあります Appの初回起動時に 必要なコンテキストツリーを きちんと生成しました これはそのツリーの一部です
2回目の起動時は ツリーを作ってはいけません
前回と同じパスのコンテキストが 追加されてしまいます コンテキストの追加時には必ず 既存のツリーを確認しましょう
重複の有無を確認する方法は いくつかあります 1つ目は コンテキストの matchingIdentifierPathを呼ぶ方法です completionブロックがコールされ 空っぽのアレイが返されました 同じパスのコンテキストは存在せず 追加するのが正解です 他にも使える関数があります 子孫のmatchingIdentifierPathも いいですね 先ほどと同じでcompletionブロックに 何も返されなければ コンテキストを追加して問題ありません 確認が必要な箇所が App内に多数あるはずです 新しいExtensionを使えば なおさらです 既存コンテキストの有無を より綿密に確認する必要が出てきます
よりスマートな確認方法があります CLSDataStoreDelegate関数を実装し ご覧のインスタンスメソッドを コールするのです クラスの1つを デリゲート関数にしたとします 先に紹介した matchingIdentifierPathを呼んだ場合 その結果次第では デリゲート関数はコールされません 邪魔になるだけなので 1ヵ所にとどめておきましょう 経験上 コンテキストの生成方法は Appごとにかなり違うので ここは空欄にしました ClassKitを初めて導入する方には WWDC 2018のセッションが お勧めです サンプルコードもご活用ください
シンプルなヘルパー関数の コーディング例です beginActivityと呼びましょう 特定のコンテキストを アクティブにしてくれます 渡すのはパスのみです 関数がクエリを呼び出し 渡されたパスと一致する子孫を探します App内のどこかに デリゲートを設定しています ですから コンテキストが存在しなくても デリゲートで作られるので コンテキストが返されるはずです
そのコンテキストをアクティブにして Activity Objectを作り スタートさせます この一連のコールの目的は コンテキストにかかった時間の記録です 一連のコールを開始させるため ここでsaveをコールしています ヘルパー関数をたくさん作っても コンテキストを作るコードは デリゲート1ヵ所に絞りましょう
ClassKitの性能は お分かりいただけましたか 教育向きのAppを 開発されている皆さんは ぜひClassKitの導入をご検討ください 導入済みの方も 新機能を使ってみてください どれもデベロッパの意見から 生まれたものです
どうぞ大いにご活用ください サンプルコードや各種資料 他のセッションへのリンクはこちらです ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。