[iPhone] CMPedometer で万歩計を作る

CMPedometerを使うと簡単に歩数が測れます。歩数以外に、距離、速度も計測できるようです。


Swift 5.1
Xcode 11.3.1

CMPedometer

CMPedoMeter は各種センサーを扱うCore Motionにある歩数などの情報を取得することができます。

データは過去に遡って1週間程度まで取り出せるようですが、ハードがらみで割り込みはコストがかかるのか瞬時のデータは逆に出しにくくなっています。

プライバシー設定

ユーザーにプライバシー許可を取得しないといけません。(どんだけ歩いたかプライベートなことなんでしょうか…)

This app has crashed because it attempted to access privacy-sensitive data without a usage description….

こういうエラーが表示されたら、説明の通りNSMotionUsageDescriptionをInfo.plistに設定。
stringにはユーザーにこのアプリで使う理由を表示して許可を得られるようにします。
やり方としてはXcodeのInfo.plistに設定するか、直にファイルをエディタで開いて以下のように追加するといいでしょう。

startupdates

ライブのアップデートでデータを取得するためハンドラーを使いますが、UIで値を表示させたい時はメインスレッドで実行させないと遅延が生じます。



ViewController.swift


あとはストーリーボードにUILabelを置き、コードのlabelを紐付けします。

これで、実機にインストールして実際に歩いてみましょう
また、歩数以外にもいくつかのデータを取得できます。

ただし、DispatchQueueを使ってメインスレッドでこれら全てのデータを一度に取得しようとするとデッドロックが生じる可能性があります。

Important
Attempting to synchronously execute a work item on the main queue results in deadlock.

DispatchQueue — Dispatch | Apple Developer Documentation

いずれにしても、データは非同期処理なので結果が出るのに多少時間がかかります。

queryPedometerData

アップデートとは別に時間を区切ってその期間の歩数を取得する方法もあります

 

このような感じになりました。

ViewController.swift

 

これで、Labelは行数を10行程度にしてstartとstopのボタンをstoryboardに紐づければ完成です。



References:
CMPedometer — Core Motion | Apple Developer DocumentationCore Motion | Apple Developer Documentation
CMPedometerData
DispatchQueue — Dispatch | Apple Developer Documentation