ハイライト
Apple は、オープンソースの Swift パッケージ FHIRModes をリリースしました。これは、HealthKit の FHIR 臨床記録を DSTU2 や R4 などのネイティブ Swift モデルにデコードし、エンコードおよびデコード中に無効な構造を持つリソースを防ぎます。
主要内容
Health アプリは、2018 年から Fast Healthcare Interoperability Resources (FHIR) 臨床記録をサポートします。プロセスは Health アプリで開始され、医療機関の API に直接接続し、FHIR データを iOS デバイスにダウンロードして、HealthKit に安全に保存します。開発者が取得できるのは、HealthKit API によって公開される臨床記録です。
本当に厄介な部分はアプリ側にあります。 FHIR リソースには、文字列、制限されたコード、ISO-8601 スタイルの日付文字列、ブール値、数値、およびマルチレベルの入れ子構造が含まれます。処方箋の状況、日付、薬だけを見る場合は、Swiftを自分で書きますCodableそれで十分だと思われます。完全な処方リソースに直面すると、モデルの数と現場の複雑さは急速に増加します。
Apple が提供するソリューションは FHIRModels です。これは、同じ FHIR リリースですべてのリソースのネイティブ データ モデルを提供し、エンコードおよびデコード時にリソースの整合性をチェックするオープン ソースの Swift パッケージです。このパッケージには、日時解析、コード フィールドの列挙、値の多態性属性の列挙、および DSTU2、R4、および最新のビルド リリースのライブラリも含まれています。
このセッションの例は非常に小さいものです。薬リスト アプリを作成し、薬へのアクセスのみを要求し、HKClinicalRecordFHIR JSON を処方モデルにデコードします。この例では、2 つの実際の境界も明らかになります。HealthKit の承認は、現在の機能に必要なデータのみを要求するという原則に準拠する必要があること、FHIR リリースは外部の世界に長期間共存すること、アプリはリリースに応じて対応するモデルを選択する必要があることです。
詳細
HealthKit 臨床記録からの FHIR モデルのデコード
(04:32) FHIRModel の最初のパスは、HealthKit によって返された臨床記録を Swift モデルに変換することです。セッションで薬の処方箋を使用する例: アプリが取得するHKClinicalRecord、関連する内容を読んでくださいfhirResource、次に使用しますJSONDecoderDSTU2 にデコードされるMedicationOrder。
// 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)")
キーポイント:
import HealthKit対応する臨床記録ソース、import ModelsDSTU2現在の FHIR リリースに対応するモデル ライブラリ。HKClinicalRecordHealthKit API から、clinicalRecord.fhirResource生の FHIR JSON データを保存します。JSONDecoder開発者が手書きした構造にデコードするのではなく、FHIRModels によって提供される構造にデコードします。MedicationOrder。prescription.noteデコードされたオブジェクトはすでに Swift モデルであるため、後でフィールドを読み取るために JSON 辞書を手動で調べる必要がないことに注意してください。
ビジネス表示のレイヤーを入れ子構造に追加します。
(05:04) FHIR リソースは、実際のビジネス フィールドを深くネストして配置します。セッションでは投与量の指示が使用されます。例: 処方指示には発効日の範囲が含まれている場合があり、その日付範囲は次のとおりです。TimingRepeatのbounds期間。この例では、拡張機能を使用して、このネストされたアクセスを表示文字列にカプセル化します。
// 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)"
}
キーポイント:
TimingRepeatこれは、FHIRModes によって提供されるタイプです。拡張機能は、アプリ独自の表示ロジックを追加することのみを担当します。if case .period(let period) = bounds値ポリモーフィック属性で期間分岐を処理します。period.startそしてperiod.endこの例では、ネストされた期間を日付範囲に分割します。prescription.dosageInstruction?.map処方箋のすべての薬の指示に目を通します。guard let period = ...期間を指定せずにケースを保管し、直接返送してくださいdosage.text。- 返される文字列には日付範囲と投薬指示がまとめられており、投薬リストなどのインターフェース表示に適しています。
複数の FHIR リリースを同時にサポート
(06:20) FHIR リリースは、新しいバージョンのリリースとともに一律に移行されません。セッションでは、DSTU2 はあと数年間は人気があるため、アプリは複数のリリースをサポートする必要があると具体的に述べました。 FHIRModes のアプローチは、リリースに応じて異なるモジュールを公開することであり、アプリはリソースが属するリリースに応じて対応するモデルを選択します。
// 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)"
}
キーポイント:
import ModelsDSTU2そしてimport ModelsR4同じアプリが複数のリリース モデル ライブラリを同時に参照できることを示します。release: FHIRReleaseこの例では、既存の解除判定エントリが存在することを前提としています。switch releaseR4 モデルに DSTU2 データを詰め込まないように、解析ブランチを明示的にします。- DSTU2 の例をデコードしたもの
MedicationOrder、R4 の例は次のようにデコードされます。MedicationRequestこれは、異なるリリースのリソース モデルの違いを反映しています。 - 2 つのブランチはメモを読み取るために異なるパスを使用します。これは、リリースの違いがフィールド アクセス方法に影響することを示しています。
defaultサイレントエラーを避けるために、サポートされていないリリース コピーをブランチに提供します。
権限とデータ範囲は機能に応じて絞り込む必要がある
(01:13) 取得後HKClinicalRecordこれを行う前に、アプリはまずユーザーに承認を要求する必要があります。セッションの薬リスト アプリは薬へのアクセス許可のみを要求し、「必要なものに比例する」原則を遵守します。認証インターフェイスにはアプリのInfo.plistここに記載されている説明テキストとプライバシー ポリシーのリンクについては、Apple がこのプライバシー ポリシーを確認します。
キーポイント:
- FHIR 臨床データは、デフォルトでは、すでにデバイス上にあるデータのみを共有します。
- FHIR データの各クエリの前に承認を要求し、ユーザーに新しいデータ アクセスを承認する機会を与える必要があります。 ・新規に認証が必要なコンテンツがない場合、システムシートは表示されません。
- この承認モデルは FHIRModels デコード プロセスに接続されています。まずユーザーに正確なデータ範囲を承認させ、次に HealthKit から返された FHIR リソースを解析します。
重要ポイント
- 薬リスト: 何をするか: ユーザーの処方箋に記載されている注意事項と投与量の指示を表示します。実行する価値がある理由: セッション コードは次から直接取得されます。
HKClinicalRecordデコードMedicationOrder、処方箋の指示を表示する方法を示します。開始方法: 医薬品へのアクセスのみをリクエストし、fhirResource.data後で使用するためにModelsDSTU2.MedicationOrder注意事項と投与量の指示をデコードしてリストにマッピングします。 - 投与量指示タイムライン: 実行内容: 有効日の範囲に従って各投与量指示を表示します。実行する価値がある理由:
TimingRepeatのboundsperiod を使用すると、説明に開始日と終了日を追加できます。始め方:TimingRepeat表示拡張機能を追加して読み取りますperiod.startそしてperiod.end、ピリオドがない場合は、元の説明テキストに戻ります。 - マルチリリース レシピ パーサー: 機能: DSTU2 および R4 レシピ データを同じアプリで処理します。実行する価値がある理由: セッションでは、既存の API は新しいリリースで自動的に更新されず、DSTU2 は引き続きサポートされる必要があると明確に述べられています。開始方法: リソースを保存または決定する
FHIRRelease、使用switch選ぶModelsDSTU2.MedicationOrderまたはModelsR4.MedicationRequest。 - FHIR データ品質検査パネル: 対処方法: デバッグまたはインポート プロセスで、デコードできないリソース、サポートされていないリリースがあるリソース、または無効な構造を持つリソースにフラグを立てます。実行する価値がある理由: FHIRModels は、エンコードおよびデコード時にリソースの整合性をチェックして、無効な構造を持つリソースがビジネス プロセスに入るのを防ぎます。開始方法: デコード エラーとサポートされていないリリース ブランチのログを一元化し、開発者やテスターにリソースごとに表示できる問題のリストを提供します。
- ケア アプリの臨床記録の入り口: 作業内容: ユーザーが承認した HealthKit 臨床記録を、ケア アプリで表示可能なケア データに変換します。実行する価値がある理由: セッションの最後に、CareKit がどのように FHIR を組み合わせてケア アプリを構築するかを引き続き確認することをお勧めします。開始方法: まず、HealthKit の認証と FHIRModes のデコードを完了してから、処方箋、投薬指示、日付範囲を CareKit またはカスタマイズされたケア インターフェイスに接続します。
関連セッション
- HealthKit の概要 - まず HealthKit の承認、読み取りと書き込み、クエリをマスターしてから、臨床記録内の FHIR データを処理します。
- HealthKit の新機能 — 同じ年に HealthKit に追加された新しいデータ型と医療データ機能について学びます。
- HealthKit と健康データを同期する — HealthKit データの変更検出、同期、クロスデバイス管理を補足します。
- CareKit の新機能 - セッションの最後に推奨されるフォローアップ コンテンツでは、ケア アプリで FHIR と CareKit を使用する方法を示します。
コメント
GitHub Issues · utterances