今回のエンジニアブログ担当の山下です。
iPhone 5sが発売されてはや一ヶ月が経とうとしています。
5sには大幅に進化したA7プロセッサとは別に、Apple M7と呼ばれるチップが新しく追加されました。
M7チップは加速度センサ、ジャイロセンサ、電子コンパスからのデータ処理を専門的に行います。
A7チップとは独立しているため、ユーザの動きを常に追いかけていてもCPUに負担はかけません。
これによりバッテリ消費の軽減にも貢献しています。
そしてこのM7チップは、一週間分の歩数データを常に記録し続けています。
歩数をカウントするためにアプリ側でセンサを常に監視する必要は一切無く、
M7チップがカウントした歩数を取得して利用するだけです。非常にかんたんですね。
実際に触ってみました。
実装
今日歩いたの歩数を表示する簡単なアプリを作成します。
まず以下の手順でプロジェクトの作成とUI設計を行いました。
- 新しいSingle View Applicationプロジェクトを作成
- CoreMotion.frameworkをプロジェクトに追加
- StoryboardでView ControllerにLabelを一つ設置
- LabelとソースコードとはstepLabelという名前でIBOutlet接続
以下はViewController.mの実装です。
#import "ViewController.h" #import <CoreMotion/CoreMotion.h> @implementation ViewController - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewDidLoad { [super viewDidLoad]; [self updateStepCount]; } // 歩数の表示 - (void)updateStepCount { if([CMStepCounter isStepCountingAvailable]) { // StepCounterのインスタンス作成 CMStepCounter *stepCounter = [[CMStepCounter alloc] init]; // 歩数を取得 [stepCounter queryStepCountStartingFrom:[self startDateOfToday] to:[NSDate date] toQueue:[NSOperationQueue mainQueue] withHandler:^(NSInteger numberOfSteps, NSError *error) { self.stepLabel.text = [NSString stringWithFormat:@"%ld", numberOfSteps]; }]; } } // 今日の0時0分を取得 - (NSDate *)startDateOfToday { NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]]; return [calendar dateFromComponents:components]; } @end
今回はCMStepCounterのインスタンスメソッド-queryStepCountStartingFrom:to:toQueue:withHandler:を使いました。
FromとToで歩数をカウントしたい日時の範囲をNSDate型で指定し、withHandlerで指定したブロックで受け取ります。ブロックの第一引数に歩数がNSInteger型で入ってくるため、これをラベルで表示します。(iPhone 5sは64bitプロセッサなのでNSIntegerは内部的にlongになります。そのためstringWithFormatでは%ldを指定しています)
一日の運動量を計るフィットネスアプリだけでなく、たとえば運動量に応じてキャラクタが育つといったように、ゲーム分野への応用もおもしろそうです。
今のところM7チップを搭載したデバイスはiPhone 5sのみですので、今回の記述は5s以外のデバイスでは動作しないことにご注意下さい。