【iOS】HealthKitでのデータ保存方法
HealthKitとは
HealthKitとは、Appleが開発したiOSデバイス向けのフレームワークで、ヘルスケアとフィットネスのデータを統合して管理するためのプラットフォームです。HealthKitを使用することで、ユーザーは様々な健康データを複数のデバイスで一元管理できます。例えば、身長・体重・歩幅・睡眠etcの身体にまつわるデータを管理できます。
HealthKitは、ユーザのヘルスデータを1つのリポジトリにまとめる枠組みです。ヘルスデータの読み書きができ、データはすべて安全に格納され、デバイス間で同期されます。
HealthKitのセットアップ
HealthKitを用いるためには必要な工程が3ステップあります。
- プロジェクト内でHealthKit機能を有効にする
- プラットフォームがHealthKitに対応しているか確認をする
- HKHealthStoreを作成する
- アクセス権限をリクエストする
1. プロジェクト内でHealthKit機能を有効にする
まず最初にプロジェクトを立ち上げ、プロジェクト内にHealthkitを導入するために以下の手順を行います。
- Targetのプロジェクト名を選択
- Capabilityを選択
- HealthKitを追加
2. プラットフォームがHealthKitに対応しているか確認をする
1つのアプリを複数のデバイスで起動させることがあります。ですが、その際にアプリを起動したデバイスがHealthKitに対応していない場合があるため、対応しているか確認をする必要があります。
3. HKHealthStoreを作成する
HKHealthStore
がヘルスケアデータに接続する入口となる部分です。HKHealthStore
を用いることによって、以下の項目を可能にします。
- ユーザーのヘルスデータへのアクセス許可を求める
- クエリを使ってデータの読み書きができる
- 一度インスタンス生成すれば、アプリ内で
HKHealthStore
を使用できる
HealthKitを用いる上で、HealthKitで用いられているデータ型・関係性を理解する必要があります。このあたりを理解されていない方は、以下リンクを一読いただきたいです。
4.アクセス権限をリクエストする
ヘルスデータにアクセスするにはユーザー認証が必要になります。ユーザー認証には必要なヘルスケアデータの種類を指定して、アクセス権限を要求します。アクセス権限は、「読み込み」と「書き込み」に分かれており、権限の許可が必要になります。アプリを使用する上で、権限の許可が必要であることを説明しなければなりません。アクセス許可を求めると、HealthKitの権限の設定するViewが表示されます。
info.plistでKeyを2つ定義する必要があります。
-
Privacy - Health Update Usage Description
NSHealthUpdateUsageDescription
-
Privacy - Health Share Usage Description
NSHealthShareUsageDescription
下画像の上赤枠が書き込み権限について、下赤枠が読み込み権限について記載が反映されます。
権限情報の管理はHealthKit内に保存されており、ユーザ-はアプリケーション外で権限情報を変更できます。
データの保存を行うための手順
データ保存するための実装手順は3つあります。
- アクセス権限をリクエスト
- 歩行距離などのヘルスデータのSampleを作成する
- 作成したSampleをHealthKitへ保存する
1つずつ説明していきます。
1. アクセス権限をリクエスト
HealthKitStore
にアクセス権限を要求するには、requestAuthorization(toShare:read:)
を呼び出します。
healthStore.requestAuthorization(toShare: shareTypes, read: readTypes) { (success, error) in
if let error = error {
print("認証リクエストのエラー:", error.localizedDescription)
}
if success {
print("HealthKitの認証リクエストが成功しました!")
} else {
print("HealthKitの認証が失敗しました。")
}
completion(success)
}
SwiftUIの場合は、healthDataAccessRequest(store:shareTypes:readTypes:trigger:completion:)
を用いることができます。
2.歩数のデータのSampleを作成する
Sampleは複数が存在しており、HKQuantitySample
に着目して記載します。他のSampleが気になる方はHKSampleType
をご覧ください。
HKQuantitySampleとは?
定量的な尺度で、値の保存できるヘルスデータを用いる際に使用するSampleです。
例としては、歩数・歩行距離・心拍数などが挙げられます。
HKQuantitySample
を使用する際には、以下の項目を指定します。
- ヘルスデータ項目
- 数値
- 単位
- 時間
ヘルスデータ項目
HKQuantitySample
を用いる際はどのヘルスケアデータを使用するかを指定する必要があります。その際に、HKQuantityTypeIdentifier
を用いる必要があります。プロパティのstepCount
(歩数)を使用します。
static let stepCount: HKQuantityTypeIdentifier
単位
単位を指定する際は、HKUnit
を用いる必要があります。
HKUnit
を指定することによって
- 重さの場合は、グラムorポンドetc
- 長さの場合は、メーターorインチetc
単位に応じた値を保存できます。
数値・時間
数値はDouble
型、時間はDate
型で扱います。
詳細の実装方法に関しては、GitHubのメソッドをご覧ください。
3.SampleをHealthKitへ保存する
HealthStore
のメソッドを用いて保存します。メソッドにはコールバック関数とSwift Concurrency(async/await)に対応したメソッドが用意されています。
- コールバック関数
func save(
_ object: HKObject,
withCompletion completion: @escaping (Bool, (any Error)?) -> Void
)
- Swift Concurrency(async/await)に対応したメソッド
func save(_ object: HKObject) async throws
上記のメソッドの引数に、2.歩数のデータのSampleを作成する
で作成したSampleを挿入し保存します。今回はコールバック関数を用いて実装しています。
以上がHealthKitを用いたヘルスデータの保存方法になります。
最後に
間違い・気になる部分がありましたら、コメントいただけると大変うれしいです。
良かったと思ったら、記事へのいいね・Xのフォローよろしくお願いいたします。
個人でアプリを作成しています。良かったら覗いてみてください。
参考URL
Discussion