🩺

【iOS】HealthKitでのデータ保存方法

2024/05/13に公開

HealthKitとは

HealthKitとは、Appleが開発したiOSデバイス向けのフレームワークで、ヘルスケアとフィットネスのデータを統合して管理するためのプラットフォームです。HealthKitを使用することで、ユーザーは様々な健康データを複数のデバイスで一元管理できます。例えば、身長・体重・歩幅・睡眠etcの身体にまつわるデータを管理できます。

HeathKit概要

HealthKitは、ユーザのヘルスデータを1つのリポジトリにまとめる枠組みです。ヘルスデータの読み書きができ、データはすべて安全に格納され、デバイス間で同期されます。

HealthKitのセットアップ

HealthKitを用いるためには必要な工程が3ステップあります。

  1. プロジェクト内でHealthKit機能を有効にする
  2. プラットフォームがHealthKitに対応しているか確認をする
  3. HKHealthStoreを作成する
  4. アクセス権限をリクエストする

1. プロジェクト内でHealthKit機能を有効にする

まず最初にプロジェクトを立ち上げ、プロジェクト内にHealthkitを導入するために以下の手順を行います。

  1. Targetのプロジェクト名を選択
  2. Capabilityを選択

capabilityを選択

  1. HealthKitを追加

HealthKitを選択

2. プラットフォームがHealthKitに対応しているか確認をする

1つのアプリを複数のデバイスで起動させることがあります。ですが、その際にアプリを起動したデバイスがHealthKitに対応していない場合があるため、対応しているか確認をする必要があります。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/Utilities/HealthData.swift#L53-L55

3. HKHealthStoreを作成する

HKHealthStoreがヘルスケアデータに接続する入口となる部分です。HKHealthStoreを用いることによって、以下の項目を可能にします。

  • ユーザーのヘルスデータへのアクセス許可を求める
  • クエリを使ってデータの読み書きができる
  • 一度インスタンス生成すれば、アプリ内でHKHealthStoreを使用できる

HealthKitを用いる上で、HealthKitで用いられているデータ型・関係性を理解する必要があります。このあたりを理解されていない方は、以下リンクを一読いただきたいです。

https://zenn.dev/muranaka/articles/4dd3fbda1fecb2

4.アクセス権限をリクエストする

ヘルスデータにアクセスするにはユーザー認証が必要になります。ユーザー認証には必要なヘルスケアデータの種類を指定して、アクセス権限を要求します。アクセス権限は、「読み込み」と「書き込み」に分かれており、権限の許可が必要になります。アプリを使用する上で、権限の許可が必要であることを説明しなければなりません。アクセス許可を求めると、HealthKitの権限の設定するViewが表示されます。

info.plistでKeyを2つ定義する必要があります。

  • Privacy - Health Update Usage Description
    NSHealthUpdateUsageDescription

  • Privacy - Health Share Usage Description
    NSHealthShareUsageDescription

下画像の上赤枠が書き込み権限について、下赤枠が読み込み権限について記載が反映されます。

権限シート画像

権限情報の管理はHealthKit内に保存されており、ユーザ-はアプリケーション外で権限情報を変更できます。

データの保存を行うための手順

データ保存するための実装手順は3つあります。

  1. アクセス権限をリクエスト
  2. 歩行距離などのヘルスデータのSampleを作成する
  3. 作成した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:)を用いることができます。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/StepCountSaveView.swift#L58-L72

2.歩数のデータのSampleを作成する

Sampleは複数が存在しており、HKQuantitySampleに着目して記載します。他のSampleが気になる方はHKSampleTypeをご覧ください。

HKQuantitySampleとは?

定量的な尺度で、値の保存できるヘルスデータを用いる際に使用するSampleです。
例としては、歩数・歩行距離・心拍数などが挙げられます。

HKQuantitySampleを使用する際には、以下の項目を指定します。

  • ヘルスデータ項目
  • 数値
  • 単位
  • 時間
ヘルスデータ項目

HKQuantitySampleを用いる際はどのヘルスケアデータを使用するかを指定する必要があります。その際に、HKQuantityTypeIdentifierを用いる必要があります。プロパティのstepCount(歩数)を使用します。

static let stepCount: HKQuantityTypeIdentifier
単位

単位を指定する際は、HKUnitを用いる必要があります。
HKUnitを指定することによって

  • 重さの場合は、グラムorポンドetc
  • 長さの場合は、メーターorインチetc

単位に応じた値を保存できます。

数値・時間

数値はDouble型、時間はDate型で扱います。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/Utilities/HealthKitSupport.swift#L43-L44

詳細の実装方法に関しては、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を挿入し保存します。今回はコールバック関数を用いて実装しています。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/StepCountSaveView.swift#L46-L55

以上がHealthKitを用いたヘルスデータの保存方法になります。

最後に

間違い・気になる部分がありましたら、コメントいただけると大変うれしいです。
良かったと思ったら、記事へのいいね・Xのフォローよろしくお願いいたします。

https://sites.google.com/view/muranakar

個人でアプリを作成しています。良かったら覗いてみてください。

参考URL

https://developer.apple.com/videos/play/wwdc2020/10664/

https://developer.apple.com/documentation/healthkit/hkquantitytypeidentifier

https://developer.apple.com/documentation/healthkit/hkquantitytype

https://developer.apple.com/documentation/healthkit/hkunit

Discussion