ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
失敗せずにFHIRを扱う
FHIRModelsが、すべてのFHIRリソースにネイティブデータを作成する方法、リソースの整合性を確実にし、FHIRスペックの複数のバージョンにわたり構造的に無効なリソースが作成されるのを防ぐ方法をお伝えします。診療データをHealthKitから入手しても、診療システムから直接入手しても、FHIRModelsがあればFHIRの扱いが容易になります。
リソース
関連ビデオ
WWDC21
WWDC20
-
ダウンロード
こんにちは ようこそWWDCへ “失敗せずにFHIRを扱う” パスカルです このセッションは “失敗せずにFHIRを扱う”です 2018年の初めからHealthアプリケーションは 医療情報交換の標準規格に対応しており “FHIR”という この規格に基づき 臨床データをダウンロードできます
これはHL7とSMARTチームによる オープン規格のおかげで実現しました
すべての始まりはHealthアプリケーションです HealthはヘルスプロバイダーのAPIへ 安全な接続を確立し FHIRデータをiOS端末に 直接ダウンロードします
HealthKit内に安全に保管されるデータは 複数の機関から集められます そしてHealthKit API経由で これらは入手できます
ダウンロードするとHealthアプリケーション上に 臨床データが並んで表示されます
ではアプリケーションでFHIRデータを 取得して扱う方法を見てみましょう まず アプリケーションはユーザーに アクセス許可を要求します
ユーザーは3つの画面で 許可を求められます 1つ目の画面ではアクセス許可に伴う 一般的な情報が表示されます
次にアプリケーションのInfo.plistに 入れた説明文が プライバシーポリシーへの リンクと共に表示されます プライバシーポリシーは 私たちがレビューします この投薬リストアプリケーションの単純な例では 薬剤へのアクセスのみが要求されます “必要なデータのみにアクセスする”という 原則に従っているのです アプリケーションとデフォルトで共有できるのは 端末に既存のデータのみです FHIRデータを問い合わせる度に アクセス許可を要求してください 新しいデータへのアクセスを ユーザーが許可するようにするのです 許可の必要がない場合 シートは表示されません
このプロセスの詳細は 2018年のWWDCをご覧ください
臨床ヘルスレコードにアクセス可能になったら 次はFHIRデータを見てみましょう これはFHIR処方箋リソースの簡略版で 様々なフィールドタイプがあります シンプルな文字列や コードという特定の値だけの文字列 日付と時間の ISO 8601 1に似た書式の文字列 ブール値や数値など 他のプリミティブ型があり 複雑な入れ子構造が成されています 以前はネイティブ形式でFHIRデータを扱う際 Swift Codableを書き込む必要がありました 特定のデータ要素を見るだけで データが均一なら簡単そうに思えます 例えばここでは処方箋の 状況 日付 薬剤を見たいだけです
しかしFHIRリソースの深さや複雑さ そして数の多さにすぐ気づくでしょう こちらが処方箋リソースの定義すべてです ご自身で このモデルを作りたくはないでしょう
ではFHIRデータの使用を助ける FHIRModelsを紹介します これはGithubで入手可能な オープンソースのSwiftパッケージです 問題の報告や 機能のリクエスト フィードバックを送ることができます 複数のFHIRリリースに対応しており 全リソースのデータモデルがあります エンコードとデコードの リソース完全性が強制され 構造的に無効なリソース作成を防ぎます 日付と時間のパースや コードフィールドを強制するenum value xの多相プロパティを 強制するenumなどです 新しいFHIRとSwiftリリースで パッケージは最新の状態を保ちます パッケージにはDSTU2やR4 最新ビルドリリースのライブラリが含まれます 新しいリリースが出たら サポートは追加されます
これはCareKitと共に Githubで入手可能です
ではFHIRを使ってみましょう
HealthKit APIで得た臨床データから 本格的なFHIRデータモデルを取得する方法です まずFHIRModelsパッケージから HealthKitとDSTU2ライブラリをインポート HealthKitからHKClinicalRecordと 付随するfhirResourceを得ます fhirResourceの型は 調べれば分かります
リソースのJSONデータをパースして MedicationOrderインスタンスを受け取ると ノートを出力できます
少し難しくなりますが 複雑な入れ子構造から 投薬量の指示とそのデータ範囲を 一緒に表示しましょう
まずTimingRepeatに extensionを書き込みます これはFHIRModelsにある型です bounds periodの startとendの日付を拡張します 実際にはNull許容型のチェックや 確実なDateFormatterなど もっと拡張性を 持たせた方がよいでしょう 次に処方箋の投薬量の全指示を マッピングします 新しいextensionを使って これらの指示が有効だった 日付範囲のものにprefixを付けます
色々なリリースが使用されているのも FHIRの面白さです 2014年の秋 ドラフト第1弾のDSTU1が 試験的にリリースされました その後 これまでに メジャーリリースが3回ありました
まもなくリリース5が出る予定です しかし新しいリリースの発行時に 既存のAPIは自動更新されません 人気の高いDSTU2のサポートが あと数年は望まれることでしょう では FHIRModelsで 複数のFHIRリリースに対応する方法です まずFHIRModelsから 適切なライブラリをインポート サポートしたい全FHIRリリースの値を持つ FHIRRelease enumがあるとして リリースを切り替え 適切なモデル型でJSONデコーダを使います ここではDSTU2にはMedicationOrderを R4にはMedicationRequestを使います それぞれに適したプロパティにして 抽出したい値に達します FHIRModelsでは 他にも多くのことが可能です
FHIRModelsは複雑なFHIRリソースや FHIRリリースの扱いも手助けします HealthKit APIで得た臨床データを扱うには このパッケージをご使用ください “What's new in CareKit”を ご覧になれば CareKitとFHIRでの ケアアプリケーションの作成方法が分かります もちろん独自のFHIRアプリケーションの強化にも このパッケージをご活用ください
ライブラリのクローンを作成し プロジェクトに追加して コードの探索を始めましょう 問題の報告やフィードバック 質問をお寄せください サンプルアプリケーションを入手すれば HealthKit APIを用いたアプリケーションでの FHIRModelsの統合方法が分かります またchat.fhir.org.では FHIRの詳細を得たり 話し合いに参加したりできます
さあ コーディングを楽しみましょう
-
-
4:32 - Use FHIRModels with Health Records FHIR data from HealthKit
// Use with Health Records FHIR data from HealthKit import HealthKit import ModelsDSTU2 // Grab HKClinicalRecord from HealthKit API let clinicalRecord: HKClinicalRecord let resource = clinicalRecord.fhirResource! // Print the prescription note let decoder = JSONDecoder() let prescription = try decoder.decode(MedicationOrder.self, from: resource.data) print("\(prescription.note)")
-
5:04 - Use FHIRModels with Health Records FHIR data from HealthKit, part 2
// Make using "TimingRepeat" period dates easier by writing an extension extension TimingRepeat { var periodDisplayString: String? { if case .period(let period) = bounds { return "\(period.start) - \(period.end)" } return nil } } // Collect all dosage instructions on medication prescriptions let instructions: [String] = prescription.dosageInstruction?.map { dosage in guard let period = dosage.timing?.repeat?.periodDisplayString else { return "\(dosage.text)" } return "\(period): \(dosage.text)" }
-
6:20 - Supporting multiple FHIR releases
// Supporting multiple releases import ModelsDSTU2 import ModelsR4 let decoder = JSONDecoder() let release: FHIRRelease let data: Data let note: String? = nil switch release { case .dstu2: let model = try decoder.decode(ModelsDSTU2.MedicationOrder.self, from: data) note = model.note?.value?.string case .r4: let model = try decoder.decode(ModelsR4.MedicationRequest.self, from: data) note = model.note?.compactMap({ $0.text.value?.string }).joined(separator: "\n") default: note = "Unsupported FHIR release \(release)" }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。