ハイライト
CareKit 2020 アップデートにより、このオープンソース健康管理フレームワークは SwiftUI タスク カード、watchOS サポート、HealthKit ドライバー タスク、FHIR マッピング、リモート同期 API にアクセスできるようになり、開発者はケア プラン、健康データ、臨床記録、iPhone/Apple Watch のステータスを同じアプリケーション構造に同期できるようになります。
主要内容
健康管理アプリを作成する場合、インターフェースとデータは簡単に分離できます。ユーザーが目にするのは、毎日のストレッチ、投薬、アンケート、症状の記録、グラフです。開発者は舞台裏でタスクのスケジュール、完了ステータス、HealthKit データ、臨床システムの記録を維持し、iPhone と Apple Watch の間の同期を処理する必要があります。 CareKit の目標は、これらのケア シナリオを再利用可能な UI、データ モデル、同期レイヤーに分割することです。
このセッションでは、まず CareKit のモジュール境界を示します。CareKitStore健康分野におけるデータモデルとコアデータ永続化レイヤーを提供し、CareKitUIタスク、チャート、連絡先を表示する静的なビューを提供します。CareKitストア内のデータ変更が自動的にインターフェースに反映されるように、UI とストアを接続します。 (00:31)
2020 年の変化は、これらの境界を外側に拡大し続けることです。 UI レイヤーは、タスク カードと情報カードの SwiftUI バージョンを追加します。同期ビューは、ストア内のタスクをインターフェイスに自動的にマッピングできます。 CareKit、CareKitUI、および CareKitStore はすべて watchOS に組み込むことができます。ストア層には、HealthKit パススルー、FHIR コーダー、およびリモート同期プロトコルが追加されます。その結果、開発者は健康データ、ケアタスク、クロスデバイスステータスを 3 つのサイロ化されたプロセスに分離する必要がなくなります。
セッションのデモンストレーションは非常に具体的です。同じ看護アプリで、ユーザーは iPhone で筋肉のけいれんを記録し、Apple Watch でストレッチタスクを完了します。 iPhoneのタスクカード、アディクションリング、チャートも同時に更新されます。 CareKit は、いくつかのデフォルト カードだけでなく、ここでのアプリケーション構造を担当します。
詳細
CareKitUI は SwiftUI タスク カードを追加します
(02:23)SimpleTaskViewUIKit API はすでに存在しており、2020 年に新しい SwiftUI API が追加されました。最小限の使用法では、タイトル、詳細、完了ステータスのみが必要です。
import CareKitUI
import SwiftUI
struct MySimpleTaskView: View {
var body: some View {
SimpleTaskView(
title: Text("Stretches"),
detail: Text("15 minutes"),
isComplete: false)
}
}
キーポイント:
CareKitUI提供されるのは静的なビューであり、準備されたタスク データを表示するのに適しています。 -titleそしてdetail引き継ぐText, そのため、SwiftUI のビュー修飾子を引き続き使用できます。 -isCompleteプレビュー、静的フィード、またはカスタム データ ソースに適したタスク カードの完了ステータスを制御します。
(03:42) このカードはクローズドコンポーネントではありません。開発者はカスタム ヘッダーを挿入し、任意の方向にコンテンツを追加できます。スピーチで使用されるHeaderViewデフォルトのヘッダーを変換するアクセントバーと、CardViewタスク カード、仕切り、キャプションをラップして、単純な完了カードをケア タスクの説明に変えます。
(05:08) UI アップデートの同じバッチには以下も含まれますLabeledValueTaskView、NumericProgressTaskView、OCKFeaturedContentView、OCKDetailViewそしてLinkView。これらのビューには、心拍数の値、運動目標の進捗状況、健康コンテンツの推奨事項、HTML 詳細ページ、内部および外部リンクの入り口が含まれます。これらはすべて、看護アプリのフィードで一般的なカード形式です。
同期ビューマップはデータを SwiftUI に保存します
(08:56) 静的ビューは表示の問題を解決し、同期ビューはデータ変更の問題を解決します。CareKit.SimpleTaskView引き継ぐtaskID、OCKEventQueryそしてOCKSynchronizedStoreManager、ストアからその日のタスクを見つけて、UI を自動的に更新します。
// Synchronized Task View
import CareKit
import CareKitUI
import SwiftUI
struct MySynchronizedTaskView: View {
let storeManager: OCKSynchronizedStoreManager
var body: some View {
CareKit.SimpleTaskView(
taskID: "stretch",
eventQuery: OCKEventQuery(for: Date()),
storeManager: storeManager)
}
}
キーポイント:
taskIDビューがケア タスクを見つけるために依存するストア内のタスクの安定した識別子です。 -OCKEventQuery(for: Date())クエリのスコープを特定の日のイベントに収束します。 -OCKSynchronizedStoreManagerストアの変更を監視し、タスクの完了ステータスが変化した後にインターフェイスを更新します。
(09:26) デフォルトのマッピングでは不十分な場合、イニシャライザはクロージャも提供します。クロージャでは、コントローラ、タスクデータ、ビューモデルにアクセスし、それらを自分で作成できます。CareKitUI.SimpleTaskView。この講義では、このポータルを使用して CareKit タスクを ResearchKit 調査ポータルに変換します。このポータルは、ユーザーがタスク カードをクリックするとポップアップします。ResearchKitSurvey()。
HealthKit はタスクを CareKit ストアに送り込みます
(12:52) CareKit は主に以下に依存していましたOCKStore。 2020年の新機能OCKHealthKitPassthroughStore、信頼できる情報源として HealthKit を使用し、それを Core Data バージョンと統合します。OCKStore一緒にぶらぶらOCKStoreCoordinator優れた。データを読み取るとき、コーディネーターは内部ストアを集約します。データを書き込むときは、トランザクション境界を明確に保つために、一度に 1 つのストアにのみ書き込みます。
// Setting up the Store
import CareKit
import CareKitStore
let coreDataStore = OCKStore(name: "core-data-store")
let healthKitPassthroughStore = OCKHealthKitPassthroughStore(name: "hk-passthrough—store")
let coordinator = OCKStoreCoordinator()
coordinator.attach(store: coreDataStore)
coordinator.attach(eventStore: healthKitPassthroughStore)
let storeManager = OCKSynchronizedStoreManager(wrapping: coordinator)
キーポイント:
OCKStore現在も CareKit 独自のデータ モデルと永続性を担当しています。 -OCKHealthKitPassthroughStoreHealthKit データをイベント ストアとして CareKit クエリに参加させます。 -OCKStoreCoordinator2 つの店舗をラッピングすることで、外観上は 1 つの店舗と同様の利用が可能になります。- 結局まだ使っています
OCKSynchronizedStoreManager同期されたビューに提供されます。
(14:15) HealthKit 主導のタスクの例は、毎日午前 8 時に 30 分間の運動を行うという目標です。ミッションは成功しましたOCKHealthKitLinkageに接続します.appleExerciseTime、タイプは累積、単位は分です。 HealthKit で運動時間の目標に達すると、CareKit のタスクを自動的に完了できます。
// Adding HealthKit Linked Tasks to the Store
let schedule = OCKSchedule.dailyAtTime(
hour: 8,
minutes: 0,
start: Date(),
end: nil,
text: nil,
duration: .allDay,
targetValues: [OCKOutcomeValue(30.0, units: "Minutes")])
let link = OCKHealthKitLinkage(
quantityIdentifier: .appleExerciseTime,
quantityType: .cumulative,
unit: .minute())
let steps = OCKHealthKitTask(
id: "exerciseMinutes",
title: "Exercise Minutes",
carePlanUUID: nil,
schedule: schedule,
healthKitLinkage: link)
storeManager.store.addAnyTask(steps)
キーポイント:
OCKSchedule.dailyAtTime看護タスクが発生する時期と目標値を定義します。 -targetValuesでOCKOutcomeValue(30.0, units: "Minutes")タスクビューで目標を表示するために使用されます。 -OCKHealthKitLinkageCareKit タスクを HealthKit 数量にバインドします。 -OCKHealthKitTask入店後もご利用いただけますNumericProgressTaskView進捗状況と目標を示す。
FHIR コーダーは臨床データのマッピングを担当します
(15:23) 医療業界の多くのシステムは、FHIR を使用してデータを交換します。 CareKit 2020 では、FHIR 互換性が追加され、新しいオープンソース フレームワーク FHIRModels を通じて FHIR リリースがマップされます。講演では、CareKit が DSTU2 と R4 をサポートし、CareKit エンティティと FHIR データの間で変換するコーダーを提供していることが明確に述べられました。
// Encoding and Decoding FHIR Data
import CareKitStore
import CareKitFHIR
let coder = OCKR4PatientCoder()
// CareKit entity to FHIR data
let patient = OCKPatient(...)
let json = try! coder.encode(patient)
// FHIR data to CareKit entity
let data: Data = //...
let resourceData = OCKFHIRResourceData<R4, JSON>(data: data)
let patient: OCKPatient = try! coder.decode(resourceData)
キーポイント:
CareKitFHIRcoder を含む Swift Package Manager パッケージです。 -OCKR4PatientCoder患者リソースとOCKPatient変換。 -OCKFHIRResourceData<R4, JSON>間違ったバージョンのデータがコーダーに渡されるのを避けるために、タイプ層で FHIR リリースとエンコード形式をマークします。- この機能は、臨床システムまたは HealthKit 臨床記録からの FHIR データを看護アプリに取り込むのに適しています。
(17:49) FHIR モデルと CareKit モデルは必ずしも 1 対 1 に対応しているわけではありません。セッションでは例として患者名を使用します。デフォルトのマッピングでフィールドが失われる場合、開発者はクロージャを提供し、CareKit 名を FHIR に書き込む方法を決定できます。HumanName。
// Customizing the Data Mapping
// Encoding process
coder.setFHIRName = { name, fhirPatient in // ModelsR4.Patient
let humanName = HumanName()
humanName.family = name.familyName.map { FHIRPrimitive(FHIRString($0)) }
humanName.given = name.givenName.map { [FHIRPrimitive(FHIRString($0))] }
fhirPatient.name = [humanName]
}
キーポイント:
setFHIRNameCareKit 名と FHIRModel を公開する患者オブジェクト。 -HumanName.familyそしてHumanName.givenFHIRMode のプリミティブ タイプに従ってカプセル化する必要があります。- カスタム マッピングの目的は、CareKit と FHIR が行き来するときに臨床データがセマンティクスを失うのを防ぐことです。
リモート同期カバレッジサーバーと Apple Watch
(19:16) CareKitは、「CareKitアプリ内のデータをサーバーにどのように同期するか」という問題を解決するために、リモート同期APIを追加しました。アプリ側の入り口はOCKStore: 初期化中にリモートを渡して、リモート同期を有効にします。電話synchronizeローカル ストアとリモート ストア間の同期をトリガーします。サーバーまたはクラウドプロバイダーは実装する必要がありますOCKRemoteSynchronizable、デリゲート、自動同期スイッチ、変更のフェッチ、リビジョンのプッシュ、および競合解決戦略を処理します。
(25:54) このスピーチでは、同じリモート同期 API を使用して iPhone と Apple Watch を同期します。鍵となるクラスは、OCKWatchConnectivityPeer。リモート同期プロトコルに準拠しており、iPhone と Apple Watch がお互いをリモート ストアとして扱うことができます。
private lazy var remote = OCKWatchConnectivityPeer()
キーポイント:
OCKWatchConnectivityPeerCareKit が提供する WatchConnectivity リモートです。- watchOS 側がそれを渡します
OCKStore、ストアにはペアリングされたiPhoneと同期するための入り口があります。 - 同期プロトコルの抽象化はサーバーに関連付けられていないため、同じ一連の概念をデバイス間の同期に使用できます。
(26:33) WatchConnectivity のセッション デリゲートは依然として開発者が所有しています。 CareKit では、開発者はメッセージを受信したときにメッセージをリモートに転送し、CareKit によって生成された応答を iPhone に送り返す必要があります。
class SessionDelegate: NSObject, WCSessionDelegate {
let remote: OCKWatchConnectivityPeer
let store: OCKStore
init(remote: OCKWatchConnectivityPeer, store: OCKStore) {
self.remote = remote
self.store = store
}
func session(
_ session: WCSession,
activationDidCompleteWith activationState: WCSessionActivationState,
error: Error?) {
print("New session state: \(activationState)")
}
func session(
_ session: WCSession,
didReceiveMessage message: [String: Any],
replyHandler: @escaping ([String: Any]) -> Void) {
print("Received message from peer!")
}
}
キーポイント:
activationDidCompleteWith最初の同期に適した場所です。演説は後ほどここで呼びかけます。store.synchronize。didReceiveMessageこれは、CareKit メッセージが watchOS アプリに入るエントリ ポイントです。- 実際の転送ロジックの使用
remote.reply(to:store:)応答を生成してから WatchConnectivity を呼び出しますreplyHandler。 - この連携が完了すると、Apple Watch上でストレッチタスクが完了し、iPhone上で同じストアに登録されているビューが同時に更新されます。
重要ポイント
- 術後の回復タスク フィードを作成する
- やるべきこと: 毎日のストレッチ、氷、投薬、痛みのログを CareKit タスク カードに作成します。
- 実行する価値がある理由:
SimpleTaskView、InstructionsTaskViewそしてNumericProgressTaskViewタスクの説明、完了ボタン、目標の進捗状況について説明しました。 - 開始方法: 最初に使用します
OCKStoreタスクと結果を再利用のために保存するOCKSynchronizedStoreManagerその日の SwiftUI タスク リストを推進します。
- 実行する価値がある理由:
- HealthKit によって自動的に完了する運動目標を作成します
- やるべきこと: ユーザーが毎日の運動目標を 30 分に設定できるようにし、HealthKit の運動時間に達すると CareKit タスクを自動的に完了します。
- 実行する価値がある理由: セッション中
OCKHealthKitTaskHealthKit データがタスク完了の基礎となるのはこのモデルです。 - 開始方法: 作成する
OCKHealthKitPassthroughStore、合格OCKHealthKitLinkage(quantityIdentifier: .appleExerciseTime, quantityType: .cumulative, unit: .minute())タスクをバインドします。
- 実行する価値がある理由: セッション中
- アンケートをもとにした看護プロセスを作成する
- 何をすべきか: ユーザーが CareKit タスク カードをクリックした後、ResearchKit アンケートを開いて症状または副作用を記録します。
- 実行する価値がある理由: 同期ビューを閉じると、タスク データの UI へのマッピングをカスタマイズでき、音声サンプルが直接ポップアップ表示されます。
ResearchKitSurvey()。 - 開始方法: を使用します
CareKit.SimpleTaskViewカスタム初期化子は次のように読み取ります。controller.viewModel、スイッチが作動中@Stateそしてアンケートをレンダリングします。
- 実行する価値がある理由: 同期ビューを閉じると、タスク データの UI へのマッピングをカスタマイズでき、音声サンプルが直接ポップアップ表示されます。
- iPhone と Apple Watch の間でケアタスクを同期させる
- やるべきこと: iPhone には完全なケア プランとチャートが表示されますが、Apple Watch にはその日の最も重要なタスク カードが 2 枚だけ表示されます。
- 価値がある理由: CareKit 2020 は watchOS をサポートしており、以下を提供します
OCKWatchConnectivityPeerリモート同期 API を再利用します。 - 開始方法: watchOS 拡張機能で作成します
OCKStore(name:remote:)、成し遂げるWCSessionDelegate、受信したメッセージをに渡しますremote.reply(to:store:)。
- 価値がある理由: CareKit 2020 は watchOS をサポートしており、以下を提供します
- 臨床記録をインポートした後にケアプランを作成します
- 作業内容: 医療機関から返された FHIR 患者または投薬指示を CareKit エンティティに変換します。これは、フォローアップ ケア タスクの生成に使用されます。
- 価値がある理由: CareKitFHIR と FHIRModel を使用すると、CareKit が DSTU2 や R4 などの FHIR リリースを処理できるようになります。
- 開始方法: データのバージョンに基づいてコーダーを選択します。たとえば、
OCKR4PatientCoder、必要に応じて使用しますsetFHIRNameこのタイプのクロージャはフィールド マッピングを修正します。
関連セッション
- ResearchKit の新機能 - ResearchKit のオンボーディング、調査、およびアクティブなタスクが更新され、CareKit で提供される ResearchKit 調査のデータ収集側を補完します。
- HealthKit の新機能 - HealthKit は、iOS 14 および watchOS 7 に ECG、症状、および運動データを追加し、CareKit がアクセスする健康データのソースについて説明します。
- HealthKit と健康データを同期する — HealthKit データ バージョン、アンカー クエリ、クロスデバイス同期について詳しく説明し、CareKit リモート同期シナリオを補足します。
- 火傷を負わずに FHIR を処理する - FHIRModes が HealthKit または臨床システムで FHIR データを処理する方法を紹介することは、CareKit FHIR コーダーを理解するための前提条件です。
コメント
GitHub Issues · utterances