CMStepCounterを試してみたのでメモ。
ソースコードはGitHubにおいてあります。キモとなるクラスはStepCounter.m/.hです。
はじめに
iPhone 5sは、ユーザーの歩数データを蓄えていて、Core MotionのCMStepCounterクラスから歩数情報にアクセスすることができます。
CMStepCounter
CMStepCounterには、おおまかに分けて以下の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の使い方は以上です。これを使えば歩数計アプリが簡単に作れますね!