【iOS】HealthKitでの1ヶ月間の歩数を取得する-サンプルコードあり-
概要
歩数データ取得のためにStatisticsCollectionQueries
を使用して、グラフやチャートのデータを生成します。StatisticsCollectionQueries
は毎日の合計歩数や時間ごとの平均心拍数を計算するために使用されます。
HKStatisticsCollectionQueryDescriptorについて
HealthKitは、サンプルセットの計算するための2種類のクエリを提供します。HKStatisticsQueryDescriptor
は一致するすべてのサンプルに対して単一の値を計算します。HKStatisticsCollectionQueryDescriptor
はサンプルを指定したインターバルに分割して、各インターバルの値を計算(合計・平均・最大・最小etc)します。
StatisticsCollectionQueries
は、アンカーとインターバルを使用して、一致するサンプル毎に分割します。アンカーは任意の開始点を定義して、インターバルはこのアンカーポイントから両方向にデータを取得できます。
たとえば、1日のインターバルを使用する場合、Anchorは各データ収集が開始される時刻を定義します。アンカーの正確な日付は問題ではないです。1970年1月1日午前3時34分でも、2065年3月15日午前3時34分でもかまいません。どちらの場合もサンプルを1日ごとに分割し、各インターバルを午前3時34分から開始します。
次に、StatisticsCollectionQueries
は一定の間隔にわたって計算します。StatisticsCollectionQueries
を使用すると、インターバルのサンプル集の最小値・最大値・平均値・合計を計算したりできます。また、StatisticsCollectionQueries
はバックグラウンドキューで実行するクエリとして機能し、HealthKitStoreのデータが変更されたときに更新を受け取ることができます。
クエリを作成する
アンカーの日付とデータ取得期間の条件を作成します。今回の例では、過去1ヶ月分の歩数データを1日の間隔に分けてデータ取得します。まずは期間を指定します。1ヶ月前から次の日のAM0:00までのデータを取得するための定数を宣言します。
日時の定数を用いて、NSPredicate
で条件を宣言します。
歩数データを使用するため、歩数のデータタイプを宣言します。
データタイプと取得期間を指定したHKSamplePredicate<HKQuantitySample>
を宣言します。
取得したデータをどれぐらいのインターバルで区切るかを宣言します。
上記で宣言した条件を用いて、StatisticsCollectionQueries
を作成します。
クエリを実行する
最後に、HealthKitStoreを使用してクエリを実行します。
クエリ実行後のデータ型の扱い方
クエリ実行後はHKStatisticsCollection
で返り値が得られる。
- 得られたデータをすべて取得する
- 指定した
Date型
が含まれている期間のデータを取得する。 - 得られたデータに対して、再度期間を指定してデータを取得する
以下に実装例を示します。
得られたデータをすべて取得する
func statistics() -> [HKStatistics]
を使用します。クエリ作成時に指定した条件に基づいた[HKStatistics]
が得られます。
指定したDate型が含まれている期間のデータを取得する
func statistics(for: Date) -> HKStatistics?
を使用して、指定した日時が含まれているHKStatistics
が得られます。
得られたデータに対して、再度期間を指定してデータを取得する
func enumerateStatistics(from: Date, to: Date, with: (HKStatistics, UnsafeMutablePointer<ObjCBool>) -> Void)
を使用します。再度条件指定をして、データを得ることができます。
データの変更を監視したい場合
データ更新を監視するクエリ(Long-Running Queries)を実装する必要があります。こちらを以下の記事を参考にしていただければ幸いです。
今回使用したサンプルコードは以下になりますので、参考までにご覧ください。
参考
最後に
間違い・気になる部分がありましたら、コメントいただけると大変うれしいです。
良かったと思ったら記事へのいいね、Xのフォローをよろしくお願いいたします。
個人でアプリを作成しています。良かったら覗いてみてください。
Discussion