WWDC Quick Look 💓 By SwiftGGTeam
Meet the HealthKit Medications API

Meet the HealthKit Medications API

元の動画を見る

ハイライト

Health アプリは iOS 15 から薬剤トラッキングをサポートしていましたが、サードパーティ app はこれまでこのデータを読み取ることができませんでした。Medications API がついにこの扉を開きました。


主要内容

ユーザーが Health アプリで薬を記録できるようになってから4年が経ちました。毎日の定时服薬、飲み忘れ、遡及記録、アーカイブ――これらのデータはずっと Health の中に閉じ込められていました。サードパーティのヘルスケア app で「服薬と症状の関連付け」「長期アドヒアランス(服薬遵守)のチャート」「副作用のリマインダー」といった体験を実現しようとすると、ユーザーにもう一度入力してもらう必要があり、体験が分断されていました。

iOS 26 がこの扉を開けました。HealthKit に新しく Medications API のセットが追加され、iOS、iPadOS、visionOS で利用可能になりました(00:17)。サードパーティ app は、Health で追加された薬のリストと各服薬記録を読み取ることができ、RxNorm などの臨床コードシステムと組み合わせて、症状、副作用、医学的概念を関連付けることができます。認証のフローも改善されています:ユーザーが Health アプリで新しい薬を追加する際、システムは直接「認証済みの app と共有するかどうか」のスイッチを表示し、app 側で再度権限をリクエストする必要がありません(22:46)。


詳細

二つのコアデータオブジェクト

新しい API は二つのオブジェクトを中心に展開されます(02:16):

  • HKUserAnnotatedMedication:ユーザーが Health に追加した具体的な薬。isArchived(アーカイブ済み/服用終了かどうか)、hasSchedule(リマインダースケジュールが設定されているか)、nickname(ユーザーが付けた別名、例えば Amoxicillin を “Antibiotics” と呼ぶなど)、そして HKMedicationConcept への参照を含みます(02:59)。
  • HKMedicationDoseEvent:新しい HKSample の一種で、「本来あるべき、または実際に発生した一回の服薬」を表します。log status(taken / skipped / snoozed / 未インタラクション)、scheduled date と scheduled quantity、actual dose quantity、そして具体的な薬と紐付ける medication concept identifier を含みます(04:32)。

HKMedicationConcept そのものは処方記録ではなく、「概念としての薬」――デバイス間で安定した identifier、display text(例:“Amoxicillin Trihydrate 500mg Oral Tablet”)、general form(capsule / tablet / liquid)、そして related codings のセット(例:RxNorm code 308192)――です(03:38)。

認証の申請:薬は per-object 認証、用量は自動フォロー

薬は sample ではなく object なので、認証は per-object のルートを通り、object type には新しい HKUserAnnotatedMedicationType を使います(10:18):

HealthDataAccessRequest(
    store: healthStore,
    objectType: HKUserAnnotatedMedicationType(),
    trigger: $triggerAuthorization
) { result in
    // 認証結果を処理
}

要点:

  • objectTypeHKUserAnnotatedMedicationType() を指定すると、システムは object レベルの認証を行い、薬を一つずつ選択する UI を表示します。ユーザーは各薬ごとに現在の app と共有するかどうかを個別に決定できます。
  • trigger は SwiftUI の state binding で、true に設定すると認証シートが表示されます。
  • ユーザーがある薬を認証した後、その薬の用量イベントの読み取り権限を別途申請する必要はありません。dose events は自動的に認証に追随します(11:10)。

「症状」のような sample type(headache、nausea など)も読み取る場合は、別のリクエストで sample type のリストを渡せば OK です(11:23)。

薬のリストをクエリ:新しい query descriptor

let descriptor = HKUserAnnotatedMedicationQueryDescriptor()
let medications = try await descriptor.result(for: healthStore)

要点:

  • HKUserAnnotatedMedicationQueryDescriptor は新しく導入されたディスクリプタで、薬のリストを取得するために特化しています(02:39)。
  • predicate も limit も指定しない場合、active と archived の両方の薬が返されます(12:32)。
  • サポートされている predicate には、isArchivedhasSchedule の二つの新しい述語が含まれます(08:07)。
  • App が見られるのはユーザーが認証した薬だけです。未認証の薬は結果に表示されません。

用量イベントをクエリ:HKSample のクエリ体系を再利用

用量イベントは HKSample の新しいサブタイプなので、sample query、anchored object query、observer query の三つの既存 query をそのまま使えます(08:29)。Demo で「本日服用済みの直近の用量」を問い合わせる際、sample query descriptor を使用し、複合 predicate(medication concept、今日の日付、log status = taken でフィルタリング)を渡し、sort + limit = 1 を設定しています(13:22)。

チャートシーン:anchored object query でリアルタイム追従

「服薬トレンドチャート」のように継続的に更新されるビューを作るには、anchored object query を使います。Eric はいくつかの落とし穴を提醒しています(18:21):

  • 用量イベントは過去のある日付に遡って記録できる;
  • 編集すると古い sample を削除してから新しいものを書き込む;
  • ユーザーがインタラクトしなかったリマインダーも記録が残る。

結果を処理する際、必ず先に deleted objects を消費してから added samples を処理する必要があります。そうしないとデータモデルに幻影のポイントが現れます。Anchored query の Swift async インターフェースは継続的に新しいバッチを yield するため、リアルタイムチャートに非常に適しています(19:57)。

RxNorm で薬を症状に紐付ける

HKMedicationConcept.relatedCodings は clinical coding(system + code)のセットで、そのうち RxNorm システムの URL は http://www.nlm.nih.gov/research/umls/rxnorm です(15:55)。Demo では Srishti が「RxNorm code → 副作用症状リスト」の静的辞書を独自に用意し、薬の RxNorm code から逆引きして表示すべき症状オプションを決定し、emoji でユーザーに症状の強度を記録させ、最後に HealthKit の category sample として保存しています(16:18)。

新規追加薬の「ゼロフリクション認証」

App がすでに薬の認証を申請した後、ユーザーが Health で別の新薬を追加する際、Health アプリは保存前に直接「XX app と共有する」スイッチを表示し、開発者は認証を重複してリクエストする必要がありません(22:46)。App が次回クエリすると、新しい薬が自然に見えるようになります。


重要ポイント

1. Health アプリを薬データのソースとして扱い、重複入力を避ける

なぜ価値があるか:多くのヘルスケア app は以前、ユーザーに薬を再入力してもらう必要があり、体験が分断されアドヒアランスも低くなっていました。今は Health から直接読めるので、ユーザーがどこで薬を追加してもサードパーティは付加価値体験だけに集中できます。

始め方:onboarding に「Health から薬をインポート」の入り口を追加し、HealthDataAccessRequest + HKUserAnnotatedMedicationType() を呼び出して、ユーザーに共有したい薬を選択してもらいます。

2. RxNorm で薬を副作用のナレッジベースに関連付ける

なぜ価値があるか:薬名はデバイスや言語によってテキストが変動する可能性がありますが、RxNorm code は安定したグローバル識別子です。一度副作用、相互作用、教育コンテンツのインデックスを RxNorm 上に構築すれば、ユーザーや地域をまたいで再利用できます。

始め方:HKMedicationConcept.relatedCodings から system が RxNorm URL(http://www.nlm.nih.gov/research/umls/rxnorm)である code をふるい出し、「RxNorm code → 副作用リスト」のルックアップテーブルを構築し、HealthKit に既存の category type(headache、nausea など)に照らしてユーザーに強度を記録させます。

3. anchored object query で「アドヒアランス」チャートを作る

なぜ価値があるか:用量イベントはストリーミングで更新され、古いデータは変更され、過去の日付に遡って記録されることがあります。anchored query は「増分 + 削除リスト」の二つの経路での更新を提供し、チャートシーンに最適です。observer + sample query のセットよりも効率的です(19:50)。

始め方:chart view で swift async の anchored query を起動し、最初の anchor には nil を渡し、その後 yield される各バッチの result に対して先に deletes を適用し次に additions を適用して、チャートのデータソースを更新します。

4. skipped / snoozed のために独立したビューを設計する

なぜ価値があるか:log status は taken だけではありません。skipped を「リマインダーが効かなかった」とみなし、snoozed を「リマインダー頻度を再設計すべき」というシグナルとみなすことで、Health 組み込みの UI よりも深いインサイトを提供できます。

始め方:dose event の log status predicate を使って過去30日間の taken 以外の記録を取得し、medication で集計して、「飲み忘れの集中的な時間帯」をユーザーに提示します。

5. 「新規追加薬の自動認証」を製品コピーの一つにする

なぜ価値があるか:ユーザーは複数の app 間で繰り返し認証するのを最も嫌います。Health は最初の認証後の新薬共有をスイッチとして組み込んでいるので、この仕組みを onboarding の約束に書く――「Health で新薬を追加するときは、共有するにチェックを入れて」――ことでリテンションを安定させられます。

始め方:初回認証完了の成功ページに説明文を追加し、app メイン画面のクエリ経路で「新薬が自動的に現れる」ことを保証し、ローカルキャッシュが新データをブロックしないようにします。


関連セッション

コメント

GitHub Issues · utterances