Apple WatchとHealthKitで何ができるかを調査（主に心拍系）


## [HealthKit](https://developer.apple.com/healthkit/)の概要

- HealthStoreというHealthKitが管理している保存領域がある。
	- HealthStoreへは扱えるデータがあらかじめ決まっており、健康データならなんでも扱えるというわけではない。
	- HealthStoreへの書き込み、読み込みはユーザの許可がデータごとに許可が必要
		- ユーザは、心拍データは許可、血圧は拒否などデータ単位でのパーミッションの制御が可能
	- HealthStore内のデータは、iPhoneやApple Watch、サードパーティアプリが書き込みと読み込みができるという仕組み

## HealthKitで扱えるデータ

- [HealthKit データ一覧](https://qiita.com/sato-shin/items/d7a0099750a0b9eddfd1)（iOS 11までカバーされている）
	- iOS 12では病状、検査室、薬、バイタルなどの健康記録データである[Health Records](https://qiita.com/aqubi/items/3f9c6ebefb233c2c4105#health-records)が増えている
	- wathcOS 5で[ワークアウトAPI](https://developer.apple.com/jp/watchos/whats-new/)がアップデートされ、[低心拍数の通知](https://support.apple.com/ja-jp/HT204666)が追加されている
- HealthKitはあくまでもデータを取り扱えるだけなので、例えば[睡眠分析](https://qiita.com/sato-shin/items/d7a0099750a0b9eddfd1#睡眠-1種)をApple Watchが書き込むわけではない
    - [AutoSleep](https://itunes.apple.com/jp/app/id1164801111)のようなサードパーティアプリが心拍数などから睡眠状況を書き込んだりする

## Apple Watchが書き込むデータ

- 書き込み頻度は、Apple Watch 2（watchOS 4.3.2） と Apple Watch 4（watchOS 5.0）で差がみられなかった

### 心拍系

- Watchアプリ内に設定があり、許可すればその後自動で書き込み続けられる

![watch1.png](https://qiita-image-store.s3.amazonaws.com/0/16700/4aa7bd61-cb9d-0994-9bd2-99714425c30c.png)

#### 心拍数

- 1分間あたりの心臓の鼓動の回数を示し、心血管の健康状態を表す（ヘルスケアアプリの説明より）
- 概ね5分間隔くらいで書き込まれていた

![ss1.png](https://qiita-image-store.s3.amazonaws.com/0/16700/db171d16-b096-d157-ff72-d9d02371fab1.png)

#### 安静時心拍数

- 数分間の安静した状態またはリラックスした状態で測定される1分間あたりの平均心拍数（ヘルスケアアプリの説明より）
- 1日に1回を限度に安静した状態を検知したときに書き込まれる？

![ss2.png](https://qiita-image-store.s3.amazonaws.com/0/16700/3573f3ed-aa90-ce89-f858-13496efc1f42.png)

#### 歩行時平均心拍数

- 1日を通して、安定したペースでの歩行時にApple Watchで測定された1分あたりの平均心拍数（ヘルスケアアプリの説明より）
- 安定したペースでの歩行が検知されたら書き込まれる？

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/16700/66667310-8037-f36b-b12a-8778a24f1ca9.png)

#### 心拍変動

- 1日に数回書き込まれていた

![ss4.png](https://qiita-image-store.s3.amazonaws.com/0/16700/9a1fe5f6-e660-fe8f-44cc-19eb89c2f719.png)

#### 高心拍数の通知/低心拍数の通知

- 安静時心拍数が選択した閾値より高い（or 低い）心拍数が10分間続いていることが検出された場合通知される（ヘルスケアアプリの説明より）
- Watchアプリ内に設定があり、許可すればその後通知がされれば自動で書き込まれる
- 低心拍数の通知はwatchOS 5.0から有効

![watch2.png](https://qiita-image-store.s3.amazonaws.com/0/16700/673b0574-e7ec-1dd0-3204-2b59e6b4a33a.png)

### アクティブエネルギー

- 安静時消費エネルギーを超えるエネルギー燃焼量の推定値（ヘルスケアアプリの説明より）
- 最短で1分ごとに書き込まれていた
- 睡眠中などほぼ動いてなくて推定できない場合は書き込まれていなかった
    - デスクワークでほぼキーボードを打っているだけくらいの動きでも書き込まれていたため、Apple Watchをしている方の腕を完全に動かさないくらいしない限り推定されるような挙動だった

![active.png](https://qiita-image-store.s3.amazonaws.com/0/16700/90729486-53dd-f0ac-c6b8-5636b2f01488.png)

## 開発メモ

### クエリ

- クエリが豊富なので全件取得、1日単位で取得、特定条件で取得などほとんどのケースに対応できそう
    - [[iOS 8] HealthKitを実装する(1) HealthKit簡易リファレンス](https://dev.classmethod.jp/references/ios-8-healthkit-app-1/)

### バックグラウンドでHealthKitのデータにアクセスできるか

- 端末がロックされているとHealthKitのデータにアクセスできない
    - [HealthKitに保存された情報を、バックグラウンドで取れるのか検証](https://qiita.com/sasanao/items/1e90cba878f69606ba86)
- Background Fetchでアプリが定期的にHealthKitのデータにアクセスしてデータを集計するというのはできないと考えた方良い（ロック解除した状態で他のアプリを操作しているときは可能だけど状況が限定的過ぎる）
	- アプリの起動時にアクセスや、明示的な更新ボタンなどを設ける必要がある

### その他

- Capabilitiesあり
- [RxHealthKit](https://github.com/DaylightLtd/RxHealthKit)
- 情報は古いけど参考にできそうな概要
	- [[iOS 8] HealthKitを実装する(1) HealthKit簡易リファレンス](https://dev.classmethod.jp/references/ios-8-healthkit-app-1/)
	- [HealthKit.framework概要](http://azu.github.io/slide/tech_ios/)
- [AppleWatchで心拍数を測定するアプリ](https://qiita.com/YutaKase6/items/bad75a331478eca38cdf)
- リアルタイムの心拍数を取得する場合には、アプリ側でワークアウト（WorkoutSession）を開始させる必要がある
    - [【AppleWatch】リアルタイムの心拍数取得](https://www.skysense.co.jp/applewatch/277/)
    - Apple Watchがデフォルトで動いている心拍計はリアルタイムで動作しているわけではないため、ワークアウトで明治的にApple Watchの心拍計を動作させ、それをHealthStoreに書き込み、読み込みを行うということが必要だと思われる
		- ワークアウトのアップデートハンドラがあるので、ワークアウト中アプリ画面内で現在の心拍数を表示するということは可能
- [shu223/watchOS-2-Sampler](https://github.com/shu223/watchOS-2-Sampler)
	- [Heart Rate](https://github.com/shu223/watchOS-2-Sampler#heart-rate-created-by-kitasuke)
	- [Accelerometer](https://github.com/shu223/watchOS-2-Sampler#accelerometer)
- [プライバシーポリシーが必須](https://qiita.com/ryusukefuda/items/3543fd166dd88241dbab)
    - どちらにせよHealthKitを使っていなくても[2018/10/3から全アプリでプライバシーポリシーは必須](https://japan.cnet.com/article/35125024/)になる

## 禁止事項

- HealthKitを利用して集取したデータでターゲット広告などの利用は禁止
    -  [アップル、「HealthKit」収集データの広告ネットワークへの販売を禁止](https://japan.zdnet.com/article/35053123/)

> 開発者が「HealthKit APIで収集したエンドユーザーの健康情報を広告プラットフォームや情報ブローカー、データ再販業者に販売することが禁止」されたという。
> ユーザーの許可を得たうえで「医療研究を目的にサードパーティーと」データを共有することは認められている。



# HealthKitに関連するその他のフレームワーク

- HealthKitと連携するAppleのフレームワークがいくつかある
- 一般的なアプリでの利用を想定したものではなく、医学的な研究目的のためのフレームワークだと思われる

## [ResearchKit](https://www.apple.com/jp/researchkit/)

> このソフトウェアフレームワークで開発したアプリケーションを使うと、医学研究者が意味のある確実なデータを収集できるようになります。

## [CareKit](https://www.apple.com/jp/researchkit/)

> このソフトウェアフレームワークで開発したアプリケーションを使うと、みんなが自分の症状をもっと良く理解し、自分でそれを管理できるようになります。