WWDC Quick Look 💓 By SwiftGGTeam
Handling FHIR without getting burned

Handling FHIR without getting burned

元の動画を見る

ハイライト

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 リソースは、実際のビジネス フィールドを深くネストして配置します。セッションでは投与量の指示が使用されます。例: 処方指示には発効日の範囲が含まれている場合があり、その日付範囲は次のとおりです。TimingRepeatbounds期間。この例では、拡張機能を使用して、このネストされたアクセスを表示文字列にカプセル化します。

// 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注意事項と投与量の指示をデコードしてリストにマッピングします。
  • 投与量指示タイムライン: 実行内容: 有効日の範囲に従って各投与量指示を表示します。実行する価値がある理由:TimingRepeatboundsperiod を使用すると、説明に開始日と終了日を追加できます。始め方: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