2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

iOSの歩数取得方法の選び方

Posted at

iOSの歩数取得方法の選び方

どうやって歩数取得するのか

方法は3つ


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は設定アプリ内の「モーションとフィットネス」へ遷移できるが、ヘルスケアはできない(ユーザーに設定アプリかヘルスケアアプリで設定してもらう必要がある)

参考

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?