ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
医学研究および健康管理Appの構築、Part 2: タスクのスケジューリング
ResearchKitとCareKitを連携させて、紙のアンケート調査の煩わしさを解消する方法について解説します。Code-Alongを続けながら、研究参加者のためのアンケート調査をこれまで以上に簡単に実施する方法を探ってみましょう。CareKitで発展的なレジメンを作成するための高度なテクニックを確認し、ResearchKitのアクティブタスクが診療所外での重要な測定値の取得にどのように役立つかを見ていきます。 このセッションは、3部構成のCode-Alongシリーズの第2回目のセッションです。このセッションを最大限に活かしていただくためには、「医学研究および健康管理Appの構築、Part 1」を先に確認いただくことをお勧めします。これらのフレームワークの関連情報については、WWDC19の「ResearchKitおよびCareKitの一新」をご確認ください。
リソース
関連ビデオ
WWDC21
-
ダウンロード
♪ (医学研究および健康管理Appの構築 Part 2:タスクのスケジューリング) 医学研究および健康管理Appの Code-Alongに お帰りなさい 今回は 友人のJamieに代って 理学療法Appを作る 3部作の第2弾です ご興味のある方は ぜひご覧頂きたいです プロジェクトがセッションの リソースに掲載されています 早速始めたいと思います ここでログインしてみましょう セッション1に参加された方は オンボーディングと同意を 終えたところだと思います このセッションでは あ ちょっと待ってください どうやらJamieからの メッセージを受け取ったようです 「Appの新しい アイデアを得たんだ」 「私の最後のメールを 見ましたか?」 追加のApp要件 Jamieはメモでの 共同作業にあなたを招待しました よし じゃあ 今回は何をするのか 見てみましょう! フォームの表示 データの永続化 動的スケジュール 可動域 OKです どうやらJamieは 毎日のチェックイン調査を 設定してほしいようです そこでは参加者がどのくらい寝たか どのくらいの痛みがあるかなどを 聞きます ResearchKitの フォームアイテムを使って 1つのページに複数の質問を 載せる方法を紹介します 次に ResearchKitの 調査結果を解析し CareKitに残す 必要があります そうすると 完了リングが いっぱいになり タスクカードのUIが更新されます さらに CareKitを使って より高度なスケジュールを作成する 方法を詳しく説明し そのスケジュールの1つを ResearchKitと 一緒に使って 参加者に膝の可動域の測定を 促します それでは 早速ご紹介していきましょう まずは 毎日のチェックイン時の調査から オンボーディングタスクで行ったように まずスケジュールとCareKitタスクを 明確にしていきます 毎日チェックすることに なっているので 毎朝 例えば8時になるように スケジュールを組んでおきましょう 固有の識別子と 先ほど明確にしたスケジュールで チェックインタスクを作成します もちろん ここのストアでも 保持する必要があります これはすべてオンボーディングのタスクで 行ったこととまったく同じです あなたにとって身近な存在に なっているといいですね オンボーディングタスクと同様に 次のステップは CareFeedViewControllerに飛び CareKitにこのタスクを どのように表示するかを伝えます 今回はもう少し 一般的なソリューションに してみましょう 現在の日付のすべてのタスクを 取得します そして それぞれのタスクに対して ビューコントローラーを作成し そのビューコントローラーを リストに追加します これは タスクを追加することで もう少しうまく計るはずです さて このfetchTasksメソッドも viewControllerメソッドも 実際には明確にしていません ファイルの中でもう少し詳しく 書き出す必要があります そこでfetchTasksメソッドを ご紹介します まず 特定の日付の タスククエリを作成し 予定されたイベントがないタスクを 除外するように指定します これは 毎日ではない タスクがあるときに 活躍します 例えば 毎週月曜日に 薬を飲むという処方箋を もらったとしましょう 火曜と水曜には その処方箋はまだあなたに 割り当てられていますが 飲むべき薬がないだけです このプロパティは そのようなタスクが クエリから返されないことを 保証します クエリが戻ってきたら 取得したタスクを 完了ハンドラに渡します また タスクを受け取り ビューコントローラを返す メソッドを記入する必要があります タスクの ID を調べて それが checkIn タスク であれば パート1で紹介した 新しい SurveyTaskViewControllerを 使用します 先ほどと同じように タスク eventQuery そしてstoreManagerへの 参照を与えます また ResearchKitの 調査を渡す必要があり ResearchKitの結果を CareKitの結果値の配列に 変換する関数を渡す必要があります この2つのメソッドは すぐに書きますが まず 私たちのApp ResearchKitとCareKitが どのように連携していくのかを 見てみましょう このAppはResearchKitの 調査を作成します ResearchKitが代わって 参加者に調査の流れを案内します ORKTaskResultを 生成し それをAppに返してくれます そして 私たちのAppは ResearchKitの結果を CareKitの結果値に変換し CareKitのストアに保持します 新しい結果を保存すると 完了リングがいっぱいになり タスクカードのUIが 更新されます では この2つの方法に 取り組んでみましょう これらはSurveys.swiftで 明確にします 下方で使用するための識別子を いくつか用意しました ResearchKitの調査を 作成する方法と その結果を CareKitの結果値に 変換する方法が必要です 参加者の睡眠時間と 痛みの感じ方に関連性が あるかどうかを調べたいので 2つの質問を含む フォームを作成します formStepでは固有の識別子 タイトル そしてテキストが必要です また フォームをスキップできない ようにするために 「オプショナルではない」に マークしておきます 次に 2つのアイテムを 作成しましょう 最初の質問は痛みについての質問で 任意選択できない質問にします つまり フォーム自体をスキップ することはできませんし この特定の質問に対する 答えがないまま フォームを送信する こともできません また 答えのフォーマットを提供 する必要があることもわかります 回答フォーマットは ResearchKitに どのような回答を期待し どのようにユーザーに入力を 促すかを示しています 体重を入力しているのか 画像を選択しているのか それとも声を 録音しているのでしょうか? ここでは UISliderを作成する ORKScaleAnswerFormatを 使用することにします スライダーは iOSユーザーには おなじみのインターフェースです 直感的に操作でき 紙の調査用紙に丸を記入するよりも ずっと素敵な体験ができます ここでは ペインスコアの 最大値を10 最小値を1とし ステップサイズを1に設定し 切りのいい数字のみを使用可能にし 最小値と最大値の説明を行います では もう少し下に下がって もう1つのアイテム sleepItemを作ってみましょう これは painItemと ほぼ同じで 同様にほぼ同一の 回答形式を使用します 唯一の違いは識別子 そして 最低睡眠時間を0時間 最高睡眠時間を12時間に 変更したことです あとは この2つのアイテムを フォームアイテムに渡して 1つのformStepでORKOrderedTaskを 作成する必要があります 2つ目の関数は ResearchKitの タスク結果を受け取り CareKitの値の配列を作成して 保持することになっています しかし このコードを書く前に ResearchKitの タスク結果の構造を見て どのように解析すればよいか を考えてみましょう ORKTaskResultsは ネストされた型であることを 理解しておくことが重要です チェックイン調査の ルート結果から始めて checkin.formまで 掘り下げていきたいと思います checkin.formには 2つの子要素があり それぞれの子要素を掘り下げていく 必要があります まず 痛みの項目の識別子と 睡眠の項目の識別子についての 回答を探します これらはどちらもスケールの 質問結果だとわかっています そしてその結果からスケールの 回答を得ることができます この例では 4と11です これが視覚的に見たときの イメージで これが同じプロセスを コードで見たときのイメージです ルートの結果から始めて フォーム識別子が付いている 最初の子を見つけます その結果には独自の子があり ORKScaleQuestionResult型の子を すべて抽出することができます その中には 2つの子が あることがわかっています 痛みの答えは 痛みの識別子が 付けられた最初のものであり 睡眠の答えは 睡眠の識別子が付けられた 最初のものです どちらもscaleAnswer プロパティを持ちます 答えがわかったら それをCareKitの結果値 1つは睡眠そして1つは痛みに 変換する必要があります ここのkindプロパティは optionalです 設定する必要はありませんが 後で値を調べたいときに便利です なぜこれが有用なのか パート3で見てみましょう 最後にやるべきことは この関数から2つの値を 返すことです これで毎日のチェックも バッチリですね では 実際にAppを 動かしてみましょう なお パート1ですでに オンボーディングが 完了しているので 同意フローを再度確認する 必要はありません これが私たちのAppの 真のコンテンツであり 先ほど作成した CareKitチェックインタスクは 私たちが期待する場所にあります カードをタップすると ResearchKitの調査に入ります ここでは いくつかの答えを 先に述べておきます 例えば 痛みを4とし 8時間の睡眠をとるとしましょう Careフィードに戻ると 上部の完了リングが 満たされています ResearchKitからの 回答が無事に CareKitに解析されたことを 示しています これはとてもいい感じです このようにして 複数の質問形式を持つ チェックイン調査を終了し データがCareKitに必要な 方法で保持されていることを 確認しました ということは 私たちは 約半分まで来ています! そろそろCareKitの高度な スケジュールに移行して 後に可動域タスクに適用して みましょう チェックインタスクや その前のオンボーディングタスクと同様に 最初のステップはスケジュールを 明確にすることです しかし 今回はもう少し 複雑なことをしようと思います Jamieは 参加者に 可動域を測定してもらう頻度を 時間の経過とともに減らして いくことを求めています 具体的には 最初の1週間は 被験者に毎日可動域の測定を 促すスケジュールを 設定したいと考えています しかしその後は 月末まで週に1度だけを その後は一度も 測定しないようにします ですから 最初の1週間は 1日1回 その月の残りの週は 1週間1回です まず いくつかの重要な日付を 明確にすることから始めましょう thisMorning nextWeek そしてnextMonthです さて CareKitで より繊細なスケジュールを 作成したい場合には OCKScheduleElementが そのためのツールとなります スケジュール要素には 開始日と終了日があります その期間中 ある間隔で繰り返されます ここでのdailyElement は 今日の朝から始まり 来週で終わるのですが 毎日繰り返されます 2番目の要素は weeklyElementです 来週から始まり 来月で終わるのですが 毎週繰り返されます 2つの要素ができたので それらを組み合わせて複合 スケジュールを作成することができ そのスケジュールを使って 新しい可動域のタスクを 作成できます もちろん ストアにも 追加する必要があります 他の作業と同様に 次のステップでは Careフィードに戻り CareKitがこのタスクをどう 表示させたいかを指定します 今回もSurveyTaskViewControllerを使用し 回答を抽出するための関数と同様に 調査を提供する必要があります Surveys.swift に戻って これらをスタブ化し 始める前に 少し構造化しておきましょう さて つまり可動域のタスクは 実にとてもシンプルなのです 実を言うと ResearchKitには事前に定義された タスクとして組み込まれています 私たちはただ識別子をつけて どの膝を測定するかを 指定すればよいのです さて 定義済みのタスクには 完了ステップが組み込まれており 表示されるメッセージは 妥当なデフォルトですが 実際にはユースケースに合わせた カスタム化されたメッセージを 表示したいと思います そこで ResearchKitに 標準の完了ステップを 省略するように指示します そして 独自に定義して 理学療法に特化した 励ましのメッセージを伝えます これが1つ目の機能ですね 2つ目は ここで ResearchKitの結果から CareKitの結果値に 変換するのです これが身近に感じられるように なっているといいのですが いろいろな方法がありますが 今日は最初の 可動域の結果が出るまで 掘り下げてみましょう そして 1つしかないことも わかっています 可動域の結果には 実際に役立つ特性が たくさんありますが 今回のユースケースで 最も注目しているのは 範囲であり 参加者が 膝をどのくらい曲げることが できたかを度数で測定します kindフィールドを キーパスと一緒に使うことで 後でこの値を簡単に 調べることができます ちなみに これは パート3への伏線です 以上で 結果の値を抽出するための 関数が完成しました いいですね これで準備は万端ですね それでは Appを実行して その様子をお見せしましょう まず最初に確認したいのは スケジュールが 意図したとおりに 動作しているかどうかです 最初の1週間は 可動域タスクが 毎日表示されるはずです 8日目 9日目 10日目と ページをめくっていくと 可動域のタスクが 毎日のように表示されます しかし 来週になると 月曜以外はここに 表示されなくなります それは1週間に1度 さらに表示させたい日なのです ここではまだ1週間に 1回だけ表示されます しかし さらに先の未来 つまり来月まで行くと もう全く表示されません CareKitスケジュールは このようなレジメを 事前にプログラムするのに 最適な方法です 今日に戻って これを試してみましょう
Beginをタップすると 使用説明ステップで 何をすべきかがわかります 起動すると Siriが 音声ガイダンスをくれるので その指示に従うだけです 「左の膝の上に デバイスを置きます」 「画面をタップして左ひざを 思い切り伸ばします」 「どこかをタッチして 続けることができます」 「終わったら 左ひざをスタート位置に戻し どこでもいいので タップしてください」
いいですね まったくなめらかと いうことですね? 通常は医師の診察を 受けに行くことで セラピストがこのような 測定をしてくれるのです しかし ResearchKitを使えば 参加者が自分の家で測定する ことができるのです Jamieは私たちの進歩に とても感心すると思います この後すぐに FaceTimeをして TestFlight上のAppの 最新版を送ります 私がJamieに 進捗状況を伝えている間にも フレームワークの詳細は researchandcare.orgで ソースコードは GitHubでご覧いただけます セッション1では オンボーディングの設定を行いました このセッションではペアのタスクを スケジューリングしました 最終回となる第3回もぜひ参加してください ResearchKitとCareKitが どのように Appを完成させるのかを ご紹介します それではまた お会いしましょう ♪
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。