ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
HealthKitの新しいデータ形式について
HealthKitでは、Appのユーザーが利用できるヘルスケアデータの種類が拡充されています。このセッションでは、更新頻度が高い種類のヘルスケアデータ用の最新ストレージ、1心拍ごとの心拍数データの利用、聴覚の健康のための新機能によってユーザーにまったく新しい側面での健康を届ける方法についてご確認いただけます。
リソース
関連ビデオ
WWDC19
-
ダウンロード
(音楽)
(拍手と喝采) こんにちは ルーク・スパイサーです 今日は 同僚のディヴィヤと iOS 13で拡張した HealthKitのデータ表現を紹介します
ご存じのとおり HealthKitはヘルスケアデータを まとめて保存します またヘルスケアAppと 相互運用できます まだ関心のない方にひと言 App Storeのヘルスケア分野には 7万以上のAppがあります その全部が HealthKitの相互運用性と 機能を享受しています HealthKitのデータ表現について お話しします まず HealthKitデータモデルの レビュー 次に数量データを中心とした APIについてです あとでディヴィヤが 心拍間測定や心拍イベント 耳の健康に関する 最新のAPIを説明します
まず HealthKitのデータモデルです HealthKitでは
データをサンプルで表現します サンプルとはある時間間隔で 測定した値です
ほとんどの測定値はシンプルです 例えば Apple Watchで測った心拍数や Bluetooth接続の体重計で 測った体重です
他の測定値はもっと複雑です ワークアウトや iPhoneにダウンロードした 健康データなどです
複雑なデータ表現が持つ 共通の構造とは 特化したデータ表現で裏打ちされた 最上位サンプルです 例をあげましょう
血圧測定値は相関サンプルで 表現できます アレルギー記録は臨床記録 ワークアウトルートは シリーズサンプルです これら全部は特化したサンプルタイプで 独自の裏打ちデータフォーマットを 持ちます 例えば血圧の相関は 血圧測定値です アレルギー記録は ファイルリソースが裏打ちし ワークアウトルートは CL位置データの配列です このような特別な測定値の データ表現と同じように 最も一般的な測定値の データ表現も拡大しました 数量データです 詳しい説明を続けます
HealthKitの数量データは ごく普通の測定コンセプトで 歩行距離や体重 心拍数が当てはまります これらを数量タイプと呼び このような測定値を持ちます
各測定値は 値と単位である数量と 測定した間隔を示す データ間隔からなります 各測定値を 数量サンプルと呼びます
この発表では 数量タイプと数量サンプルについて いかに多くの数量を 効率的に表現するか話します 基本的なコンセプトは 2014年のIntroducing HealthKitをご覧ください あるシナリオを想定し話を進めます 一緒に新しいAppを 開発していると思ってください ゲームコントローラ内臓の 心拍数センサに接続するAppです センサからの測定値を HealthKitにセーブし ゲーム中のユーザの心拍数が 分かるようにします
センサからの心拍数は こんな感じです プレイの間中 Appに測定値が入ってきます では セーブするための データ表現方法は? 1つは単一の数量サンプルを 使う方法です このようになります 測定中 つまりゲームの間中 単一の数量サンプルが続き センサからの測定値を全部 単一数量または平均で表現します この表現は1つのオブジェクトを与え 測定値を示します ゲーム中の心拍数の変化は この方法では見られません
もう1つの方法は このように 複数の数量データを使う方法です 各測定値が 異なる数量サンプルで表現され センサの測定値を 全部保つことができます しかし冗長なため 効率的ではありません 同じメタデータとデバイス情報が 全部にあります それに実際の測定値 つまりゲーム中の心拍数を 単一オブジェクトで表せません 幸い 3つ目の方法があります 数量シリーズです こんなふうに表現されます 測定間隔全般におよぶ 単一の数量サンプルが この場合は複数の数量に裏打ちされます 最初の2つの方法の いいとこ取りといえます センサの全測定値を保ちつつ 単一オブジェクトで表現します 個々の数量サンプルにあった 冗長な情報を動かして 数量シリーズサンプルレベルで 単一コピーを保存します ユーザのデバイスのストレージや性能を これなら尊重できます
数量シリーズサンプルは 数量サンプルなので 単一値で量のシーケンスを 表す方法が必要です HealthKitでは集約を使います 基本の2つの集約スタイルは CumulativeとDiscreteです Cumulativeは一般的な数量タイプの カロリーや歩数に使われます これらの数量タイプは ユーザが蓄積する― 歩数や燃焼カロリー 移動距離などです 複数の数量を集約する 自然な方法は合計でしょう
一方 合計が無意味な 数量タイプもあります 例えば心拍数や体重 高さは 合計すると意味をなしません 1日の心拍数を足せば バカげた数値になります こうした数量タイプの集約には 平均が自然です 最小 最大 最新値などの 集約統計量の場合もあるでしょう
Cumulativeな数量の シーケンスが表現され 合計されて集約されます 心拍数などの Discreteな数量は集約されて 最小 最大 平均 最新値などの 要約統計量を作ります
HealthKitではタイプに合った 集約スタイルが分かります iOS 13では集約スタイルを Discreteに代えて― 新たにDiscreteArithmeticを 採用しました この集約の平均値は 算術平均だということを 明白にするためです 新しい集約スタイルも導入しました discreteTemporallyWeightedは 心拍数の集約に 時間加重平均を使う集約方法です discreteEquivalentContinuousLevelは 音の暴露量に使われる集約スタイルです ディヴィヤがあとで 詳しく説明します
数量を集約し要約統計量を作る方法は 分かりました この情報を保存する必要があります iOS 13では2つの新たな 数量サンプルサブクラスを導入 合計プロパティを持つ CumulativeQuantitySampleと 平均 最小 最大 最新値プロパティを 持つDiscreteQuantitySampleです 数量サンプル抽象基底クラスも 作りました つまり今後インタラクトする 数量サンプルのインスタンスは 集約スタイルによって 2つのサブクラスのいずれかとなります すべての数量サンプルは たまたま1つだけの 数量シリーズと考えることができます
また対応するPredicateKeyPathを 導入したので
サンプルの対応プロパティを クエリできます 数量シリーズサンプルの例です 平均 最小 最大 最新値の 集約統計量でまとめることができます では この数量シリーズを 作っていきます
始まりは測定が開始された時間です ここではゲーム開始時です センサから測定値を受け取り 数量シリーズに挿入 センサからの測定値の 受け取りと挿入が ゲームの間 続きます 測定終了で数量シリーズが終了すると 数量シリーズの要約に戻ります
このコードを見てみましょう
HealthKitの最初はすべて― 読み書きするデータタイプの オーソリのリクエストからです ここでは心拍数に対してです リクエストしたら Quantity Series Sample Builderを 作ります healthStore データタイプ 測定開始日 任意でHKデバイスを使います
測定値を受け取る限り これらをビルダに挿入します ゲームが終了すると 任意のメタデータと測定終了日で ビルダが終わります
効率的に数量データを表現し シリーズとしてセーブできました 次はどうAppに 活用するか考えましょう 心拍数の他に カロリー情報が記録できれば ユーザはゲームで消費したカロリーを 見られます グラフやチャートで 視覚的に見ることもできます ある時間内の平均消費カロリーや
ゲーム中の最小と最大心拍数も 見られます あるいはUIをライブにして センサからのデータを 更新するのもいいでしょう
全部が 1つのHealthKitクエリで可能です
それが HKStatisticsCollectionQueryです 皆さんはもうご存じでしょうが どんなことができるか 改めて説明したいと思います StatisticsCollectionQueryは データソースで分けられる 複数の統計値を計算できます 新しいデータがセーブされると 更新を受け取れます
StatisticsCollectionQueryを更新し 新しい集約スタイルの サポートを可能にしました また数量シリーズサンプルに保存された 数量データを自動的に保存できます StatisticsCollectionQueryと HKStatisticsの詳細は Introducing HealthKitで ご確認ください
StatisticsCollectionQueryは 数量データと効率的な インタラクションが可能です でも時に 数量シリーズの 個々の数量を列挙したい時もあります 例えばゲーム中に測定した心拍数を Appでプロットしたい時 QuantitySeriesSampleQueryで できます iOS 13は このクエリ向上のため 数量サンプル引数を NSPredicateの数量タイプに 代えました
単一の数量サンプルの数量だけでなく 複数の数量サンプルと 裏付け数量データを列挙できます またDateIntervalで 日付パラメータも更新 列挙中に 各単一数量の 日付間隔も得られます また任意のサンプルパラメータが 列挙中の数量シリーズデータを 与えます
図で見るのが分かりやすいでしょう 2つの数量シリーズサンプルです 最初のサンプルは ゲームコントローラ内臓のセンサが 測定した数量 2番目はApple Watchの測定数量です 両方のデバイスを 同時に使用しているので シリーズがオーバーラップします QuantitySeriesSampleQueryは デフォルトで 開始日順に両方のシリーズの数量を 全部 列挙します こんな感じです 数量シリーズの最後は doneパラメータをtrueに設定します
メタデータなど数量シリーズサンプルの プロパティにアクセスする場合 実行前にincludeSampleを trueに設定します この場合 数量シリーズを列挙しながら 数量のハンドラの 対応するシリーズサンプルが得られます
数量シリーズを使った 数量データとのインタラクションです ではゲームのサポートが 簡単にできることをお見せします Xcodeでデモをお見せしましょう
現在のフォーマットのゲームです 心拍数センサは コントローラに内臓していません 作りたい方は あとで来てください 外部心拍数センサを使って Appに情報を取得します 数量シリーズは心拍数の他 どんな数量タイプにも使えます データは外部のセンサやデータベース ディスクからでも 直接入力でも構いません このゲームのタブは2つ PlayタブでPlayViewControllerを 立ち上げます Last Gameタブで ResultsViewControllerを立ち上げ 直近のゲーム時の心拍数を見ます
PlayViewControllerで ゲームの様子をお見せします
ホットドッグをクリックし ブロッコリを避けるゲームです ヘルスAppとしては 少々問題ありですね ゲーム中 心拍数は 上昇する傾向にあります Last Gameタブに戻っても 心拍数は表示されません では表示させましょう まずオーソリをリクエストします さっきも出てきましたね ゲーム中の心拍数を 読み書きするAppなので App立ち上げ直後に リクエストします Appデリゲートの didFinishLaunchingWithOptionsを追加
リクエストしています 心拍数に特化した数量タイプを作り HK healthStoreで オーソリをリクエストします
リクエスト後 測定値を取得し 数量シリーズにセーブします センサ接続をカプセル化するクラスは 作成済みです 関連サンプルプロジェクトで 仕組みを見られます PlayViewControllerに戻って ゲーム中の心拍数を記録するため 接続を追加します project navigatorを開き PlayViewControllerに切り替えます
startNewGameという関数があり Start Gameボタンを押すと 呼び出されます ここで外部センサとの接続を作り Quantity Series Sample Builderを 開始します まずセンサとの接続を作ります
HeartSensorSessionはセンサ接続の カプセル化のために書いたもので HeartSensorSessionのデリゲートとして PlayViewControllerをセットします Quantity Series Sample Builder for Heart Rateを始めます
これは心拍数タイプの healthSstoreで作ります 測定開始日は現在の日付です HeartSensorSessionから HKデバイス情報を取得します デリゲートプロトコルを通じて PlayViewControllerと通信します HeartSensorSessionDelegateは 2つのメソッドがあります sessionDidReceiveHeartRateと sessionDidEndです sessionDidReceiveHeartRateで HeartSensorSessionは デリゲートに心拍測定値を提供 ここで測定値を取り Quantity Series Sample Builderに 挿入します
HeartSensorSessionからの 心拍数と日付間隔を Quantity Series Sample Builderに 挿入しています
ゲーム終了で HeartSensorSessionが終了し sessionDidEndが呼び出されます Quantity Series Sample Builderを 終了し 挿入した心拍数量を永続化します また メタデータと数量シリーズを 関連させます ここで 終了したゲームと 心拍数を関連させることで 直近のゲームと関連づけた 心拍数をクエリできます
MetadataKeyExternalUUIDを使い メタデータディショナリを作成し これを心拍センサのUUID文字列に セット HeartSensorSessionからの メタデータと測定終了日で 数量シリーズを終わります
HealthKitに心拍数データを セーブしたので ResultsViewControllerに データを表示します ResultsViewControllerに 移動しましょう
viewDidLoad関数には 効用関数 loadHeartRateQuanititesがあります 直近のゲームと関連した 心拍数データをクエリし 数量を表ビューで表示するよう 文字列配列を生成します 最初に追加するのは 直近のゲームに関連した心拍数の Quantity Series Sample Queryです
未プレイのケースに対して ガードします ゲーム識別子があれば MetadataExternalKeyUUIDの クエリ述語を作ります このメタデータを使うのは 直近のゲームの 心拍数データのクエリのためです
次に心拍数タイプの Quantity Series Sample Query を 前述の述語を使い作ります クエリのハンドラ内で 直近のゲームと関連付けした 数量と日付間隔を列挙します それぞれの文字列表現を作り 次に 結果文字列の保存に使う 文字列配列を作ります
これをクエリハンドラ内で使います
まず 列挙中のエラーをガードします エラーがなければ 列挙した数量と日付間隔を使い heartRateDetailsStringsを作ります これらをheartRateStringsに 追加します 最後に 列挙完了時に doneパラメータをtrueにします ここはメインキューに ディスパッチするのに最適で ResultsViewControllerをリロードし 文字列を表示します
Appを再実行してみましょう 心拍数データの読み書きを サポートしています App起動で最初にするのは オーソリのリクエストです
心拍数データの読み書きの オーソリをオンにし もう一度ゲームをします
ホットドッグを当てます ああ 失敗した では もう一度
2ポイント獲得 心拍数を見てみましょう 直近のゲームの時の心拍数です
(拍手) Quantity Series Sample Builderを使って 効果的に数量データを セーブできました QuantitySeriesSampleQueryで データのクエリもできます このあと ディヴィヤが登場します 心臓分野での HealthKitのプレゼンスの拡大や 新規の聴覚ヘルスについて説明します ありがとう (拍手) ルークがiOS 13へのHK数量の 効率的な保存方法をお話ししました HealthKitはユーザの 健康データのリポジトリです 保存するデータの量だけなく 種類も増えています 今年は心臓に加え新たに 聴覚ヘルスのサポートを追加しました
iOS 8から心臓関連の機能が 導入されました Apple Watchや Appと接続したセンサから 心拍数を見ることができます データはヘルスケアAppで見られます
HealthKitは心拍数を サポートしています 例えば このような心拍数の場合 5秒間の心拍数から 平均心拍数が 1秒間68拍だと分かります これをHK数量サンプルとして セーブできます
iOS 11で 心拍変動SDNNを導入しました 心拍変動は心拍間隔時間の変化のことで SDNNはNN間隔の標準偏差の略です Apple Watchが 同じ心拍数を読み取ります 各拍の時間間隔から 標準偏差を計算し HealthKitに数量サンプルとして セーブします 心拍数と心拍変動は 心臓血管系の健康に 重要なメトリクスです こうしたデータがひと目で分かります 詳細に見ることもあるでしょう
再度 同じ心拍数を見てみましょう ここまで心拍数データを 要約した形で見てきましたが その基礎データを見たい時もあります 例えば 拍動する時間が 知りたいとしましょう ゲームコントローラに 付いているセンサで ゲーム中 心拍を打つ時間が 分かるとします 最初の心拍はデータ収集開始から 0.5秒後です 2回目は1.49秒後というふうに データ収集開始から終了まで 拍動する時間を測ります 心拍は一定の間隔で打っており このまとまりが 心拍のシリーズとなります データをセーブするために HKHeartbeatSeriesSampleがあり 心拍のシリーズを タイプスタンプで保存します ルークが先ほどお見せしたAPIに 似ていますね でも重要なのは心拍のシリーズが 逸脱したデータを カプセル化していることです 基礎データのHKQuantitiesと違い 値や単位はなく 効率的にタイムスタンプを保存し 心拍のシリーズを表示できます
大きくなる可能性のある データシリーズを保存するので 数量シリーズと似た APIを設計しました ビルダとカスタムクエリに HeartbeatSeriesSampleを実装しました
心拍のシリーズサンプルも ビルダで作られセーブ後に終了します コードを見ましょう 最初は常にオーソリのリクエストです それには 新しい心拍のシリーズタイプと 数量タイプの heartRateVariabilitySDNNが必要です 両方のタイプのオーソリが必要なのは 心拍変動が心拍のシリーズから 直接派生したメトリックだからです これでユーザはシェアするデータの 種類が明確に分かります
オーソリリクエスト後 HeartbeatSeriesBuilderを初期化し healthStoreとgameDevice gameStartDateをセットします
ユーザがゲームをしている間 開始日からの心拍を時間間隔と ビルダに追加します
センサがダウンすることも あるかもしれません 2秒と3秒の間に ギャップができました 2つ目と3つ目の心拍間の 1.99秒のギャップは 心臓データの解釈の誤りに つながりかねません 解決には precededByGapをYESに設定します 収集データのギャップに気付くと 心拍を調整することができます
他のHKサンプル同様 メタデータをビルダに追加します データをセーブし シリーズを終えると heartbeatSeriesSampleが HealthKitにセーブされます
心拍間隔測定のサポートが 追加できました 基礎となる心拍測定の クエリを始めましょう
ルークが説明したように 標準のHKクエリとインタラクトし 高位サンプルをフェッチします そして細かいデータを カスタムクエリします 最初に 標準のHKサンプルクエリを実行し 対象の心拍サンプルをフェッチします その後 heartbeatSeriesQueryを サンプルで初期化 これにより各心拍の列挙ができます
クエリを実行しましょう
HealthKitには他にも 心臓関連の優れた機能があります iOS 12でApple Watchに アラート機能が付きました 一定のBPM以下の心拍数を検知すると アラートを表示します あるBPMを超える場合も アラートが表示されます 心房細動を示唆する心拍を 検知した場合もアラートが出ます
アラートは 3つのカテゴリータイプがあり アラートのたびに HelathKitにセーブされます
心臓の健康サポートに加え iOS 13から 新たな分野が始まりました HealthKitの聴覚ヘルスに関して お話しします
聴覚検査を 受けた経験があるでしょう ヘッドフォンから流れてくる音を聞き 聞こえた時点で 手を上げるというものです これは純音聴力検査の一例です 純音とは単一周波数の音をいいます
検査は異なる周波数で聞こえる 一番小さな音を特定し 聴覚機能に問題がないか 評価するものです 検査の結果は一般的に オージオグラムという グラフで表示されます
軽度の聴覚障害を持つ人の オージオグラム例です グラフ部分を拡大し どんなデータが保存されているか 見ましょう
この2本の線は それぞれ左右の耳から聞こえる 聴覚検査の結果です 125ヘルツの最初の2つの データポイントを見ましょう この人の場合 125ヘルツの音を聞くのに 左耳は約11デシベル 右耳は約31デシベル必要です デシベルは音の強さ表す単位で 健康な若者が聞こえる最小音に対する 比率単位です 残りのデータポイントを取得しました HealthKitへのデータ保存のため HKAudiogramSampleを導入 聴覚検査に関連する 聴覚感度の配列を保存します サンプルとコードを作りましょう
最初に作るのは HKAudiogramSensitivityPointで ある周波数を聞くのに必要な 音の強さをカプセル化します 新しいHKUnitとhertzで周波数量を 新しい単位decibelHearingLevelで 左右の耳の感度量を作ります これでAudiogramSensitivityPointが 作れます AudiogramSensitivityPointの 配列を作ったら audiogramSampleに保存します sensitivityPointがユニークで 順番どおりなことを確認します あとで分析やチャート作成に 使うからです ではデータを保存しましょう HealthKitで オージオグラムサンプルや 聴覚ヘルスAppが簡単に作れます ですがオージオグラムサンプルは 検査した時点の耳の状態を 示すだけです 私たちは常に音に接しています ヘッドフォンの音や 道を歩く時の環境音など 耳の健康に影響を与えます
ヘッドフォンからの音を記録するのが 読み書きタイプの headphoneAudioExposureです
それ以外の道を歩いている時の音や 工事現場の音などは Apple Watchが環境音の暴露レベルを とらえます それがアナログ式読み書きタイプ environmentalAudioExposureです 環境音の暴露レベルが 高くなりすぎると Apple Watchがアラートを発します 聴覚ヘルスに影響する恐れを 気付かせてくれます カテゴリーサンプルとして セーブされます 使うのはaudioExposureEvent カテゴリータイプ識別子です
HealthKitとiOS 13で可能な データ表現についてお話ししました 効率的なシリーズ表現や 聴覚ヘルスのサポートなどです
これでHealthKitに大量で 最も豊富な種類のデータが保存できます 心臓や聴覚ヘルス関連で さらに豊富なデータ表現も可能です
さらに詳しく知りたい方は セッションのサイトを見るか このあとのHealth and Fitness Technologies Labに来てください ありがとう WWDCを楽しんでくださいね (拍手と喝采)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。