#swiftで歩数を取得するぞ!
appleが提供しているコアモーションというフレームワークの,
歩数まわりを取り扱うCMPedometerを使います.
公式ドキュメント
意外とつまづいたので備忘録のようなものです.
swift初学者なので間違ってたら教えてください
##stepCountとCMPedometer
前はCMStepCounterというのがあったらしい.
今は非推奨のようなのでCMPedometerを使います.
##準備
-
CoreMotionをインポートする
...その前にプロジェクト名をクリックして出てくる画面でCoreMotionのフレームワークを追加しておきます.
-
Info.plistに書き込む
適当なところに行を追加して
KeyにPrivacy - Motion Usage Description
,
TypeをString,Valueに使用用途を入力する.
初めて使う時に使っていいか聞くやつです.
これがないとクラッシュなんとかってエラーが出てきます.
##コードを書きます!
let pedometer = CMPedometer()
//CMPedometerが利用可能かどうか
if CMPedometer.isStepCountingAvailable() {
//計測
pedometer.startUpdates(from: Date(), withHandler: {(pedometerData, error) in
if let e = error {
print(e.localizedDescription)
return
}
guard let data = pedometerData else {
return
}
let step = data.numberOfSteps
DispatchQueue.main.async {
label.text = "\(step) 歩"
}
})
}
//終わらせたいタイミングで
pedometer.stopUpdates()
CMPedometer()
はメンバ変数になるようにしないと不具合が起きるっぽいです
###isStepCountingAvailable
まずデバイスでCMPedometerが利用可能か調べます
Bool値で返ってきます
###startUpdatesとstartPedometerUpdatesFromDate
調べてるとstartPedometerUpdatesFromDate
というのも出てくるが,
Xcodeでは無いと言われる
startUpdatesのドキュメント
startPedometerUpdatesFromDateのドキュメント
多分引数にNSDateを使うかDateを使うかという違いなのかなと思う.
NSDateは非推奨らしいので,Dateを使うstartUpdates
を使います.
####queryPedometerDataは?
過去の指定期間の歩数を取得するメソッド
queryPedometerDataのドキュメント
startUpdates
は過去の指定日時から現在までのデータを取得出来ます.
###startUpdatesの引数について
Date()
メソッドを宣言した時にその時点の時刻を取得できるので
これを計測しはじめの時刻として第一引数に渡してます
第二引数にはCMPedometerHandler
を渡します.
{(pedometerData, error) in 処理}
と書いているところです.
CMPedometerHandlerのドキュメント
###DispatchQueue.main.async
ラベルに歩数を表示する時にメインスレッドに非同期処理しないと遅延するらしいのでこうしています.
(...それでも表示遅いと感じます)
##CMPedometerData
CMPedometerでは歩数以外にも推定移動距離や移動ペース,階段を登った段数など色々取得できます
CMPedometerで取得できるデータ
なんだか似たようなものが使えたり使えなかったり混乱したのでまとめてみました.
他にもHealthCareを使ったものもあるみたいです
###参考にしました
https://faboplatform.github.io/SwiftDocs/4.coremotion/003_coremotion/
https://teratail.com/questions/90251