koogawa blog

iOS、Android、foursquareに関する話題

【Tips】iOSで歩数をカウントする

2016.4.23 追記:Swift版の記事を書きました。

blog.koogawa.com


CoreMotionを使って、歩数カウントを取得する方法をメモしておきます。

実装方法

まずは「CoreMotion.framework」を追加します。

f:id:koogawa:20131122152458p:plain

ヘッダをインポートします。

#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 になるというわけではなく、例えばautomotivestationary が同時に YES になる状況もありえるようです。

最後は忘れずに停止しておきます。

[_activityManager stopActivityUpdates];

サンプル

注意点

リンク