2016.4.23 追記:Swift版の記事を書きました。
CoreMotionを使って、歩数カウントを取得する方法をメモしておきます。
実装方法
まずは「CoreMotion.framework」を追加します。
ヘッダをインポートします。
#import <CoreMotion/CoreMotion.h>
インスタンスを生成します。
_stepCounter = [[CMStepCounter alloc] init];
歩数のカウントを開始します。
[_stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:1 withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error) { // 歩数が更新されるたびに呼ばれる }];
- 第1引数:handler を呼び出す queue を指定
- 第2引数:何歩歩いたら handler を呼び出すか(実際にはこの指定通りには動かなかった)
- 第3引数:歩数更新時に呼び出す handler
第3引数で指定する Blocks には、計測を始めてからの累計歩数、更新時のタイムスタンプ、エラー情報が返ってきます。
歩数カウントが不要になったら、忘れずにカウントを停止しておきます。
[_stepCounter stopStepCountingUpdates];
また、歩数以外にもユーザの歩行情報(歩いているのか、走っているか等)も取得できます。
まずはインスタンスを生成します。
_activityManager = [[CMMotionActivityManager alloc] init];
取得を開始します。
[_activityManager startActivityUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:^(CMMotionActivity *activity) {
// 歩行ステータスが更新されるたびに呼ばれる
}];
歩行情報は CMMotionActivity
というクラスで返ってきます。このクラスには次のプロパティが含まれます。
型 | プロパティ | 意味 |
---|---|---|
NSDate | startDate | アクションが発生した時間 |
CMMotionActivityConfidence | confidence | データの精度(Low/Medium/High のいずれか) |
BOOL | stationary | 静止状態 |
BOOL | walking | 徒歩中 |
BOOL | running | ランニング中 |
BOOL | automotive | 自動車や電車等の乗り物に乗っている状態 |
BOOL | unknown | 不明 |
どれかひとつの動作が YES
になるというわけではなく、例えばautomotive
と stationary
が同時に YES
になる状況もありえるようです。
最後は忘れずに停止しておきます。
[_activityManager stopActivityUpdates];