こんにちは。プロダクト開発チームでネイティブアプリの開発を担当している大嶋です。
この記事では、Appleが提供する健康データ管理のためのフレームワークであるHealthKitを活用し、健康管理アプリを開発する方法について解説します。
HealthKitを利用することで、iOSおよびwatchOSアプリがユーザーの健康やフィットネスデータを収集・管理できるようになります。具体的には、iPhoneやAppleWatchが収集したデータをアプリから読み込んだり、逆にアプリで収集したデータをHealthKit経由で蓄積することも可能です。
これから健康やフィットネスに関するアプリを開発したいと考えている方は、ぜひ本記事を参考にしてください。
HealthKitの概要
HealthKitは、ユーザーの同意のもとでアクティビティ・心拍数・体重・栄養・睡眠などのデータを統合し、Appleの「ヘルスケア」アプリや「フィットネス」アプリで一元管理するためのフレームワークです。
例えば、月次の運動量を確認するとか、睡眠の質を確認するといった機能のアプリを比較的簡単に作ることができます。
データはデバイス内部のローカルストレージに保存されるため、ユーザーの健康データを安全に管理できます。
HealthKitを使用する利点としては、下記の3点が挙げられます。
HealthKitを使ったアプリ開発の準備(Xcodeでの設定)
ここからは、実際の使用方法を紹介していきます。
HealthKitの利用の前に、Xcodeでの設定が必要です。以下の手順で設定を行います。
- CapabilityにHealthKitを追加
プロジェクトのターゲット設定から「HealthKit」を有効化します。 - Info.plistにHealthKit関連の項目を追加
HealthKitを使用するためには、Info.plistにHealthKitの利用目的を記載します。利用目的は、特にリリース時にはユーザーが理解できるように丁寧に記述する必要があります。
HealthKit実装サンプルの解説
次に、実際のHealthKitの実装についてもサンプルコードとともにご紹介します。実装例はGitHubに公開しているので、以下のリンクから確認してみてください。
アプリの概要
このサンプルアプリは、以下の3つの健康データを表示します。
- 歩数:当日の合計歩数を表示します。
- 平均心拍数:当日の平均心拍数をBPM(beats per minute)で表示します。
- 睡眠時間:当日の睡眠時間(in bedの時間)を時間単位で表示します。
また、画面にある「データを更新」ボタンを押すと、最新のデータが取得され、表示が更新されます。
アプリ開発において、考慮すべき項目がいくつかあります。
HealthKitの権限管理
概要のパートでプライバシー保護について書きましたが、HealthKitを利用する際には、ユーザーから必要なデータのアクセス権を得る必要があります。これを行うのがrequestAuthorizationメソッドです。
func requestAuthorization(completion: @escaping (Bool, Error?) -> Void) { let stepType = HKObjectType.quantityType(forIdentifier: .stepCount)! let heartRateType = HKObjectType.quantityType(forIdentifier: .heartRate)! let sleepType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)! let readTypes: Set = [stepType, heartRateType, sleepType] healthStore.requestAuthorization(toShare: nil, read: readTypes) { (success, error) in completion(success, error) } }
requestAuthorizationメソッドでは、取得したいデータタイプをreadTypesセットで指定し、HealthKitの権限を求めます。ここでは、ユーザーの「歩数」「心拍数」「睡眠データ」にアクセスするための権限をリクエストしています。
このメソッドが実行されると、ユーザーの端末にHealthKit連携を許可するかどうかのポップアップが表示されます。
このメソッドが成功すると(=ユーザーが許可すると)、アプリはこれらのデータタイプに対してアクセス可能となります。
※ユーザーが許可しなかった場合は、アプリ側から再度アクセスを取ることはできません。「ヘルスケア」アプリから指標別にアクセス許可を取ることになります。
データ取得のクエリ
HealthKitでは、健康データを取得するためにクエリを使用します。ここでは、期間内の歩数データの合計を例にして、データ取得の方法を解説します。
歩数データの合計値を取得するためには、HKStatisticsQueryを使用します。これは平均値や合計などの統計値を計算するクエリです。今回は、合計を計算するためのオプション(.cumulativeSum)を指定します。
func fetchStepCount() { 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 = HKStatisticsQuery(quantityType: stepType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, error in if let sum = result?.sumQuantity() { DispatchQueue.main.async { self.stepCount = sum.doubleValue(for: HKUnit.count()) } } } healthStore.execute(query) }
サンプルアプリでは、このクエリが返す合計値をstepCountプロパティに反映しています。
他の健康データ(心拍数や睡眠データ等)も、HealthKitが提供するクエリのオプションを変えることで簡単に取得できます。まずは基本的なクエリの使い方を習得して、徐々に応用してみてください。
データの同期や更新の遅延について
Apple WatchとiPhone間でデータを同期する場合、バックグラウンドでデータのやり取りが行われます。基本的には、バッテリー消費やシステム負荷が考慮され適切なタイミングで更新が行われますが、以下の点は注意が必要だと思います。
- 同期のタイミングについて
両デバイスが適切と判断したタイミングで同期が行われるため、同期が遅延していると感じることがあるかもしれません。一方、 ユーザーの明示的なアクションに対しては即時にデータが更新されます。例えば同期ボタンを配置し、押されたタイミングでHealthKitデータの同期をトリガーすることが可能です。
- バッテリー消費に注意
データの頻繁な更新はバッテリー消費につながるため、必要に応じて更新頻度を見直すことも検討しましょう。例えばユーザーによる同期ボタンの連打を抑止するなどの対策は有効です。
まとめ
HealthKitを活用すれば、ユーザーの健康データを効率的に管理し、アプリの付加価値を高めることができます。さらに進化した健康管理アプリを目指していきましょう!
今回はHealthKitを用いた健康管理アプリ開発の概要と実装方法の一部をご紹介しました。ぜひこの内容を参考に、ご自身のアプリにHealthKitを取り入れてみてください。