🩺

【iOS】HealthKitでの1ヶ月間の歩数を取得する-サンプルコードあり-

2024/05/30に公開

概要

歩数データ取得のためにStatisticsCollectionQueriesを使用して、グラフやチャートのデータを生成します。StatisticsCollectionQueriesは毎日の合計歩数や時間ごとの平均心拍数を計算するために使用されます。

https://zenn.dev/muranaka/articles/8d58f0065f19a7

HKStatisticsCollectionQueryDescriptorについて

HealthKitは、サンプルセットの計算するための2種類のクエリを提供します。HKStatisticsQueryDescriptorは一致するすべてのサンプルに対して単一の値を計算します。HKStatisticsCollectionQueryDescriptorはサンプルを指定したインターバルに分割して、各インターバルの値を計算(合計・平均・最大・最小etc)します。

StatisticsCollectionQueriesは、アンカーとインターバルを使用して、一致するサンプル毎に分割します。アンカーは任意の開始点を定義して、インターバルはこのアンカーポイントから両方向にデータを取得できます。

Anchorに関する図

たとえば、1日のインターバルを使用する場合、Anchorは各データ収集が開始される時刻を定義します。アンカーの正確な日付は問題ではないです。1970年1月1日午前3時34分でも、2065年3月15日午前3時34分でもかまいません。どちらの場合もサンプルを1日ごとに分割し、各インターバルを午前3時34分から開始します。

次に、StatisticsCollectionQueriesは一定の間隔にわたって計算します。StatisticsCollectionQueriesを使用すると、インターバルのサンプル集の最小値・最大値・平均値・合計を計算したりできます。また、StatisticsCollectionQueriesはバックグラウンドキューで実行するクエリとして機能し、HealthKitStoreのデータが変更されたときに更新を受け取ることができます。

クエリを作成する

アンカーの日付とデータ取得期間の条件を作成します。今回の例では、​​過去1ヶ月分の歩数データを1日の間隔に分けてデータ取得します。まずは期間を指定します。1ヶ月前から次の日のAM0:00までのデータを取得するための定数を宣言します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L43-L48

日時の定数を用いて、NSPredicateで条件を宣言します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L50

歩数データを使用するため、歩数のデータタイプを宣言します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L51

データタイプと取得期間を指定したHKSamplePredicate<HKQuantitySample>を宣言します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L52

取得したデータをどれぐらいのインターバルで区切るかを宣言します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L53

上記で宣言した条件を用いて、StatisticsCollectionQueriesを作成します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L55-L59

クエリを実行する

最後に、HealthKitStoreを使用してクエリを実行します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L64

クエリ実行後のデータ型の扱い方

クエリ実行後はHKStatisticsCollectionで返り値が得られる。

  • 得られたデータをすべて取得する
  • 指定したDate型が含まれている期間のデータを取得する。
  • 得られたデータに対して、再度期間を指定してデータを取得する

以下に実装例を示します。

得られたデータをすべて取得する

func statistics() -> [HKStatistics]を使用します。クエリ作成時に指定した条件に基づいた[HKStatistics]が得られます。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L67-L72

指定したDate型が含まれている期間のデータを取得する

func statistics(for: Date) -> HKStatistics?を使用して、指定した日時が含まれているHKStatisticsが得られます。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L77-L82

得られたデータに対して、再度期間を指定してデータを取得する

func enumerateStatistics(from: Date, to: Date, with: (HKStatistics, UnsafeMutablePointer<ObjCBool>) -> Void)を使用します。再度条件指定をして、データを得ることができます。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift#L87-L93

データの変更を監視したい場合

データ更新を監視するクエリ(Long-Running Queries)を実装する必要があります。こちらを以下の記事を参考にしていただければ幸いです。

https://zenn.dev/muranaka/articles/4235520178f9a65

今回使用したサンプルコードは以下になりますので、参考までにご覧ください。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/11_ WalkingOneMonthView.swift

参考

https://developer.apple.com/documentation/healthkit/queries/executing_statistics_collection_queries

最後に

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

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

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

Discussion