LoginSignup
11
11

More than 5 years have passed since last update.

Core Motionで歩数計

Last updated at Posted at 2014-05-20

CMStepCounterを試してみたのでメモ。
ソースコードはGitHubにおいてあります。キモとなるクラスはStepCounter.m/.hです。

はじめに

iPhone 5sは、ユーザーの歩数データを蓄えていて、Core MotionCMStepCounterクラスから歩数情報にアクセスすることができます。

CMStepCounter

CMStepCounterには、おおまかに分けて以下の2つの機能があります。

  1. ユーザーの移動を監視し、移動した時にイベントを発生する
  2. iPhoneに蓄積されている過去の歩数データを取得する

使い方

機能を使う前に、端末が対応しているかどうかを確認しましょう。

if ([CMStepCounter isStepCountingAvailable]) {
    // 歩数計に対応している
}
else {
    // 歩数計に未対応
}

ユーザーが移動した時にイベントが発生するようにするには、監視を開始するメソッドを呼び出します。

// インスタンスを生成
CMStepCounter *stepCounter = [CMStepCounter new];
// 移動の監視を開始する
[stepCounter startStepCountingUpdatesToQueue:[NSOperationQueue mainQueue] updateOn:1 withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error) {
    // 移動した時にこのブロックが呼ばれる
    NSLog(@"累計歩数: %d", (int)numberOfSteps);
}];

また、イベントが不要になったら監視を停止するメソッドを呼び出します。

// 移動の監視を停止する
[stepCounter stopStepCountingUpdates];

使い方は、ストップウォッチのような感じで、start〜を呼ぶと歩数カウントが開始され、移動する度にブロックのnumberOfSteps変数に歩数が通知されます。
ただ、アプリを終了してしまうとカウント中の歩数が失われてしまうので注意が必要です。
iPhoneに歩数データが蓄えられているので、直接問い合わせることもできます。

NSDate *start = ...; // 保存しておいた開始日時
NSDate *end = [NSDate new]; // 現在日時
[stepCounter queryStepCountStartingFrom:start to:end toQueue:[NSOperationQueue mainQueue] withHandler:^(NSInteger numberOfSteps, NSError *error) {
    // 歩数を取得したときにこのブロックが呼ばれる
    NSLog(@"指定期間の歩数: %d", (int)numberOfSteps);
}];

蓄えられている歩数データは1週間分で、1週間より前のデータはなくなってしまいます。
必要であれば取得したデータをアプリ側で保存しておくとよいでしょう。

CMStepCounterの使い方は以上です。これを使えば歩数計アプリが簡単に作れますね!

11
11
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
11
11