Appleの HealthKit API 入門

個人データが実用的な洞察力を促進する時代では、iOS HealthKit API は、開発者がフィットネスとウェルネスアプリケーションを構築するためのコーナーストーンになりました。このフレームワークは、iOS 8 で Apple によって導入され、健康と活動情報のための統一された安全なリポジトリを提供します。 HealthKit を統合することにより、アプリは、健康アプリのデータストアから読み書きし、ユーザーが自分のステップ、心拍数、睡眠分析、ダイエットログ、さらには臨床記録の統合ビューを見ることができます。この記事では、API がどのようにして、健康アプリの承認を把握し、最適なデータ ワークフローを把握し、最適な方法、 健康データ ワークフローを把握することができます。

HealthKitのアーキテクチャを理解する

HealthKit は、次の 2 つの主要な概念に関するデータを整理します。] データ型]]のデータオブジェクト。データ型は、や[[]などの測定のカテゴリを定義します。データオブジェクトは、実際のレコードで、のサンプルが(暗号化されたシングルまたはイベント)、または [FLT:]に関連する [[FLT:]]]を[FLT:]]または[FLT:[FLT:[F]]]]]]を、または[[[[[[FLT:[[[FLT:[FLT:]]]]]]]]]]]]]を、または[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[FLT]]]]]]]]]]]]]]]]]]]]]]]]]]]]

主要コンポーネント

  • []HKHealthStore] – 健康キットの全操作の中央エントリポイント。
  • [HKObjectType] – 健康データの種類(量、カテゴリ、または特性)を特定します。
  • [HKSampleQuery] - 保存されたサンプルの固定セットを取得します。
  • [HKStatisticsQuery] - 集計値(sum、平均、min、maxなど)を時間間隔で計算します。
  • []HKObserverQuery] - 指定したデータタイプの変更をモニターし、背景の更新を有効にします。

許可の設定 – アクセスのリクエスト

データ交換の前に、アプリは]を使用して許可を要求しなければなりません。 ]]とキー]の両方の読み取り権限と書き込み権限を宣言する必要があります。 フィットネストラッキングでは、ステップカウント、アクティブなエネルギー、心拍数、および潜在的なワークアウトを書くことができます。

import HealthKit

let healthStore = HKHealthStore()

func requestHealthPermissions() {
 guard HKHealthStore.isHealthDataAvailable() else { return }
 let readTypes: Set<HKObjectType> = [
 HKObjectType.quantityType(forIdentifier: .stepCount)!,
 HKObjectType.quantityType(forIdentifier: .heartRate)!,
 HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
 HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
 ]
 let writeTypes: Set<HKSampleType> = [
 HKObjectType.workoutType()
 ]
 healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { success, error in
 // Handle response
 }
}

常に認可コールバックを適切に処理します。ユーザーが機能のブロックを回避する場合、代わりに、データが必要な理由を説明し、代替(例、マニュアルエントリ)を提供します。 許可は、健康アプリのソースタブで後で変更することができますことを覚えておいてください。

フィットネスデータの問い合わせ

HealthKit は、データを効率的に取得するための複数のクエリタイプを提供しています。フィットネスアプリの最も一般的なのは、サンプルのクエリと統計クエリです。

HKSampleQuery – 生データの取得

過去100の心拍数の読み込みや今日のステップログなど、個々のレコードが必要な場合は、[[を使用します。日付、ソース、または値でフィルタリングする述語を指定します。パフォーマンスのために、常に結果の回数を制限します。

let stepType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startDate = Calendar.current.startOfDay(for: Date())
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: Date(), options: .strictStartDate)

let query = HKSampleQuery(sampleType: stepType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { query, samples, error in
 guard let samples = samples as? [HKQuantitySample] else { return }
 // Process samples
}
healthStore.execute(query)

HKStatisticsQuery - 集計されたデータ

特定の期間(例えば、毎日のステップカウント)の合計、平均値、または最大値については、を使用します。 これは、個々のサンプルを要約するよりもはるかに効率的です。

let statisticsQuery = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { query, result, error in
 let sum = result?.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Update UI with total steps
}
healthStore.execute(statisticsQuery)

HKStatisticsCollectionQuery - タイム・シリーズ・データ

過去1週間に1日あたりのステップのチャートを表示するには、[を使用します。 開始日と終了日の間の統計をバッチでバッチ化し、傾向に理想的です。

let now = Date()
let sevenDaysAgo = Calendar.current.date(byAdding: .day, value: -7, to: now)!
let anchorDate = Calendar.current.startOfDay(for: now)
let daily = DateComponents(day: 1)

let collectionQuery = HKStatisticsCollectionQuery(quantityType: stepType, quantitySamplePredicate: nil, options: .cumulativeSum, anchorDate: anchorDate, intervalComponents: daily)
collectionQuery.initialResultsHandler = { query, results, error in
 results?.enumerateStatistics(from: sevenDaysAgo, to: now) { statistics, stop in
 let steps = statistics.sumQuantity()?.doubleValue(for: HKUnit.count()) ?? 0
 // Append steps for statistics.startDate
 }
}
healthStore.execute(collectionQuery)

フィットネスデータの表示

数値は、視覚化が明確でないと意味がありません。 うまく設計された UI は、 HealthKit データをモチベーションのインサイトに変換します。 次のアプローチを検討してください。

  • [] 概要カード:[] は、今日のステップカウント、アクティブ分、およびコンパクトなダッシュボードで心拍数の傾向を表示します。
  • [Charts:]] 週単位のステップ、月間アクティブエネルギー、または心拍数のゾーンを表示するには、行またはバーチャートを使用します。 [Swift Charts[(iOS 16 +)または[Charts]]のようなライブラリはシームレスに統合されます。
  • ゴールリング:]]Appleの古典的なアクティビティリングは、エネルギー、運動、スタンド時間を視覚化するためにエミュレートすることができます。
  • ワークアウトのサマリー:[] 現行時間、平均心拍数、距離、および各ログアウトのカロリーが焼却した。

例:ステップカウントダッシュボードの構築

上記の統計クエリをSwiftUIと組み合わせて、ライブ・アップ・ステップ・カウンターを作成します。

struct StepCardView: View {
 @State private var steps: Double = 0

 var body: some View {
 VStack {
 Text("Steps")
 .font(.headline)
 Text("\(Int(steps))")
 .font(.largeTitle)
 .bold()
 }
 .onAppear { fetchTodaySteps() }
 }

 func fetchTodaySteps() {
 // Use HKStatisticsQuery as shown earlier
 }
}

HKObserverQuery によるリアルタイム更新

手動で更新せずにダッシュボードを現在の状態に保つには、]を設定します。このシステムは、新しいデータを HealthKit に保存されるときに、アプリがバックグラウンドで表示されている間、バックグラウンドデリバリーに登録している場合に、アプリを通知します。

let observerQuery = HKObserverQuery(sampleType: stepType, predicate: nil) { query, completionHandler, error in
 DispatchQueue.main.async { self.fetchTodaySteps() }
 completionHandler()
}
healthStore.execute(observerQuery)

背景の更新には、[]を呼ぶ必要があります。 iOSスロットルの背景コールバックがバッテリーを節約することに注意してください。 このスパンコールを使用して、完了ハンドラーを常に処理します。

プライバシーとセキュリティのためのベストプラクティス

健康データは機密です。Appleは厳格な規則を実施し、遵守に失敗するとApp Storeの拒絶反応につながる可能性があります。

  • []最小データリクエスト:]]のみ、実際に使用しているデータタイプを要求します。ステップカウントのみが必要な場合は、”健康記録”を尋ねないでください。
  • [] 説明文字列をクリアします:[]] 情報リストの使用法の説明は、例えば「このアプリは、あなたの毎日の活動を示すためにあなたのステップカウントを読みます。」
  • [] 明示的なユーザー同意なしに、生の健康キットデータのオフデバイス[を決して共有します。 バックエンドに同期する場合、匿名化してデータを暗号化します。
  • ] 承認変更の尊重:[]] によるユーザのリベーク権限の承認を、各クエリの前にチェックすることで観察します。
  • [] エラーを優雅に処理します:[])。 HealthKit のクエリは、許可、データの欠如、またはデータベースのエラーが原因で失敗する可能性があります。 常にユーザーフレンドリーなメッセージが表示されます。

Apple Watchとその他のソースとの統合

HealthKit は、Apple Watch、サードパーティのアプリ、およびマニュアルエントリからデータを自動集計します。 iOS アプリは、ソースによってフィルタリングしたいという限り、ソースを区別する必要はありません。 ワークアウトアプリの場合、 HealthKit に オブジェクトを書くことを検討してください。 ユーザーが Apple Watch でワークアウトを開始すると、システムは自動的にメトリックを記録できます。 iOS 仲間のアプリは後でそれらを読むことができます。

ワークアウトデータを作成する:

let workout = HKWorkout(activityType: .running, start: workoutStart, end: workoutEnd, duration: duration, totalEnergyBurned: energy, totalDistance: distance, metadata: nil)
healthStore.save(workout) { success, error in
 // Handle
}

とを使って、ワークアウトに関連したサンプル(例、心拍、ルート)を追加することもできます。

一般的な落札とテムを避ける方法

  • []:データを想定して、常に利用可能な:[:新しいユーザーは、 HealthKit のデータがないかもしれません。 プレースホルダーを表示したり、ユーザーが Health アプリや Apple Watch を介して追跡を開始したりすることを奨励するために、UI を設計します。
  • []:[] 大量のクエリ(過去1年間のすべてのサンプル)が遅く、メモリにクラッシュすることができます。 制限付きの日付の述語とペグナートを使用してください。
  • [] 無視するタイムゾーン:[[ HealthKit のタイムスタンプは UTC にあります。 1 日ごとにグループ化する場合、ユーザのローカルタイムゾーンに切り替えて、不正な設定を回避します。
  • [] メインスレッドのブロック:[] HealthKit のクエリは非同期ですが、その補完ハンドラはメインスレッドで実行されないことがあります。 に UI の更新をディスパッチします。
  • []健康データの利用状況を調べるのを忘れてしまった場合:[[ HealthKitはiPadとiPod touchで利用できません。 常にを呼び出し、やりとりする前に必ず呼び出します。

健康記録と臨床データで拡大

臨床健康に焦点を当てたアプリでは、 HealthKit は Health Records[ (FHIR 経由) もサポートしています。 ユーザーの許可を得て、アプリは免疫、ラボ結果、薬、および条件にアクセスすることができます。 これは、薬物追跡者、アレルギーチェック者、または慢性的な状態管理の可能性を開きます。 しかし、これらのデータタイプは、Apple からの健康記録のエン資格の追加レビューを必要とします。

コンテンツ

iOS HealthKit API は、フィットネスデータの追跡と表示のための堅牢でプライバシー重視の基盤を提供します。その許可モデル、クエリの種類、ベストプラクティスを理解することで、ユーザーの健康エコシステムとシームレスに統合するアプリを構築できます。簡単なステップと心拍数のクエリから始めて、背景の更新、ウォッチの接続、および臨床記録などのより高度な機能を徐々に組み込むことができます。結果は、ユーザーを自分の健康について通知するだけでなく、フィットネス目標を達成するためにそれらを動機づける強力なツールです。

詳細は、公式 [] アップルヘルスキットドキュメント] 、 、および ] のようなコミュニティリソースを読んでください。 レイ・ウィンダーリッハの HealthKit チュートリアル] 、ハンズオン・コードの例。