iOSの歩数取得方法の選び方
どうやって歩数取得するのか
方法は3つ
- CoreMotionフレームワークのCMPedometerを使用する
- HealthKitフレームワークのHKHealthStoreを使用する
- CoreMotionフレームワークのCMMotionManagerを使用する
CMPedometerの方法
CoreMotionフレームワークにCMPedometerクラスがあるので、これのstartUpdates()を使用するとCMPedometerDataというのが取れる。
これの中に歩数データがあります。
初回のみ許可ダイアログが出ます

let pedometer = CMPedometer()
pedometer.startUpdates(from: nowDate) { (data, error) in // fromに開始日を設定して取得できる(7日前まで可能)
guard error == nil else {
return
}
print(data?.numberOfSteps)
}
期間を指定して取得も可能
let pedometer = CMPedometer()
pedometer.queryPedometerData(from: startDate, to: endDate) { (data, error) in
guard error == nil else {
return
}
print(data?.numberOfSteps)
}
HKHealthStoreの方法
いろんな書き方があるがここでは一つだけ紹介
HKHealthStoreのHKStatisticsCollectionQueryを作成してある程度フィルターしたデータを取得する方法
まずは許可が必要でHKObjectType.quantityType()の引数のHKQuantityTypeIdentifierで指定できる。(歩数ならstepCount、移動距離ならdistanceWalkingRunningなど)
/// 認証許可
private func usagePermission() {
if HKHealthStore.isHealthDataAvailable() {
print("対応")
} else {
print("非対応")
}
let dictionaryData = [
HKObjectType.quantityType(forIdentifier: .stepCount)!
]
let readDataTypes = Set(dictionaryData)
HKHealthStore().requestAuthorization(toShare: nil, read: readDataTypes) { success, _ in
if success {
self.fetchSteps()
}
}
}
- quantityType = データタイプの統計を取得するか(歩数、血圧、脈拍など)
- quantitySamplePredicate = フィルタリング条件(いつからいつまでのデータを取得するか)
- options = 統計の種類(平均、合算、最小など)
- anchorDate = 統計情報の集計を開始する基準日
- intervalComponents = 統計情報の集計間隔(日毎、週毎、月毎、年毎)
func fetchSteps(completion: @escaping (HKStatisticsCollection?) -> Void) {
// パラメータの値の記述は割愛してます
let query = HKStatisticsCollectionQuery(
quantityType: stepType,
quantitySamplePredicate: predicate,
options: .cumulativeSum,
anchorDate: anchorDate,
intervalComponents: daily
)
query.initialResultsHandler = { query, statisticsCollection, error in
completion(statisticsCollection)
}
HKHealthStore().execute (query)
}
CMMotionManagerの方法
CMMotionManagerの加速度センサーで取得したデータを取得できるので、それを自前で歩数に変換する方法
計算は自分でやる必要があるので詳細は割愛
それぞれの特色
-
CMPedometer
- 歩数の反映が2番目に早い(10秒以内)
- capablity追加の必要なし
- 簡単に実装できる
-
HKHealthStore
- 歩数の反映は遅い(10秒以上)
- 取れるデータが幅広い(血圧、脈拍なども可能)
-
CMMotionManager
- 歩数の反映はリアルタイムだが、歩数データへの変換は自分でやる必要がある
- バッテリーの消耗は激しいと思う
どう選択するか
- ただの歩数計 = CMPedometer or HKHealthStore
- リアルタイムで歩数反映したい = CMPedometer or CMMotionManager
- 1週間以上の期間の健康管理アプリとか = HKHealthStore
- 1週間のデータしか表示しない = CMPedometer
もちろん組み合わせてもいいと思います!
ex:
- 歩数データは早く反映したいのでCMPedometerで、それ以外の健康データはHKHealthStoreからとか
備考
- ヘルスケア連携 (HKHealthStore)は許可ダイアログが一回しか出せないので、確実にユーザーに歩数を取らせたいときはCMPedometerの方が良いかも
- CMPedometerは設定アプリ内の「モーションとフィットネス」へ遷移できるが、ヘルスケアはできない(ユーザーに設定アプリかヘルスケアアプリで設定してもらう必要がある)