Google+ もご覧ください
ユーザーアイコン

iOS 7 徹底解剖

M7の歩数カウント&状態記録を利用する方法(コード/デモアプリ付)

Gff02521

M7の歩数カウント&状態記録を利用する方法(コード/デモアプリ付)

M7チップの歩数カウント、状態記録を利用する方法(コード、デモアプリ付)

こんにちは。フリーランスとしてプログラマーをしている松山と言います。何者かについてはshinyamatsuyama.comをご覧ください。

今回はiPhone 5sの登場とともに注目されているM7チップの機能の使い方について調べてみましたので、APIや実際のコードを含めて紹介します。

M7ってなに?

今年9月に発売されたiPhone 5sで初めて搭載されたチップです。今までCPUで処理されていた加速度センサ、ジャイロセンサ、磁気センサの処理をまとめてM7チップで行うことによって省電力を実現していると知られています。先日発表されたiPad AirやiPad mini Retinaディスプレイモデルでも採用されていますので、今後は数多くのiOSデバイスに採用されていくようです。

M7を活用したアプリとして有名どころではARGUSがあります。ARGUSは一言で言うとライフログアプリで、M7を使って省電力で歩数カウントが行えるようになっています。

M7対応デバイスでは常にモーションデータを蓄積していますので、アプリ側で処理することなく多くのデータを扱えるという大きな利点があります。ユーザが常にiPhone 5sを持ち歩いていれば、NikeのFuelBandなどと似たようなことが実現できるようになります。

APIはCoreMotionを使う

ではAPIについて見ていきましょう。

M7の機能を呼び出す際にはCoreMotionを使います。CoreMotionは加速度センサ、ジャイロセンサ、磁気センサの値を取り出せるほか、3要素を統合したDeviceMotionをあつかうFrameworkです。iOS 7よりここに新たに機能が追加されました。

まずAppleのReferenceを見てM7何ができるようになったのか読み解きます。

  • CMAccelerometerData
  • CMAttitude
  • CMDeviceMotion
  • CMGyroData
  • CMLogItem
  • CMMagnetometerData
  • CMMotionActivity
  • CMMotionActivityManager
  • CMMotionManager
  • CMStepCounter

上記のようにずらっとクラス名が並んでいます。そのうち太字のものが、M7チップ搭載後に増えたクラスです。

2種類のデータを扱う

歩数カウント(CMStepCounter)と状態記録へのアクセス(CMMotionActivityManager)の2つが主な機能です。どちらも設計は似ています。Notificationのように変化があると処理を呼び出すのと、自動的に記録されている情報にアクセスするという2つの使い方が用意されています。ここで言う自動的に保存されている情報というのは、資料によると最近の7日間分保存されているとのことです。

CMStepCounterについて

とてもシンプルなクラスでメソッドは4つだけです。

+ isStepCountingAvailable

CMStepCounterの機能が使えるかどうかを返すクラスメソッドです。iPhone 5sではYESが帰ってきますが、iPhone 5ではNOが返ってきます。M7が搭載されてるかどうかがわかるという理解で問題なさそうです。

– startStepCountingUpdatesToQueue:updateOn:withHandler:

指定した歩数間隔で歩数カウントのアップデートのたびに処理を呼び出します。歩数間隔の指定は1以上の数で良いのですが、必ずその間隔で呼び出されるという訳ではないようです。またNSOperationQueueを指定してそのQueueにてHandlerをコールするということです。HandlerはBlockで渡します。Handlerの引数は以下になります。

withHandler:^(NSInteger numberOfSteps, NSDate *timestamp, NSError *error)

startを実行してからの歩数の累計とタイムスタンプ、そしてエラーとなっています。

– stopStepCountingUpdates

上記のアップデート処理をストップさせるときに呼び出します。引数はありません。

– queryStepCountStartingFrom:to:toQueue:withHandler:

from(NSDate*)で指定した時間からto(NSDate*)で指定した時間までの記録をたどり、歩数カウントを返します。例えば今から24時間前までの歩数合計を返すというような感じです。処理はほとんど時間がかかりませんがNSOperationQueueとHandlerという構成で、上記のアップデート処理と同じになっています。

Handlerの引数は以下になります。

withHandler:^(NSInteger numberOfSteps, NSError *error) 

歩数の合計とerrorになります。

CMMotionActivityManager

こちらもCMStepCounterと同じ構成で、メソッドは4つだけです。

+ isActivityAvailable

CMStepCounterのisStepCountingAvailableと同じで、機能が呼び出せるかを返します。

– startActivityUpdatesToQueue:withHandler:

CMStepConterと同様で、Activityが変化するたびに処理を呼び出します。Handlerの引数は以下になります。

withHandler:^(CMMotionActivity *activity)

activityのみのシンプルな引数です。CMMotionActivityには、以下のようなプロパティがあります。

/*
 *精度
 *  CMMotionActivityConfidenceLow, CMMotionActivityConfidenceMedium, CMMotionActivityConfidenceHigh
 */
@property(readonly, nonatomic) CMMotionActivityConfidence confidence;

/*
 *アクティビティのスタート時刻
 */
@property(readonly, nonatomic) NSDate *startDate;

/*
 *電源が切れているなどの状態不明の期間を表す
 */
@property(readonly, nonatomic) BOOL unknown;

/*
 *机に置いてあるなどの静止状態を表す
 */
@property(readonly, nonatomic) BOOL stationary;

/*
 *歩いている状態を表す
 */
@property(readonly, nonatomic) BOOL walking;

/*
 *走っている状態を表す
 */
@property(readonly, nonatomic) BOOL running;

/*
 *乗り物に乗ってる状態を表す
 */
@property(readonly, nonatomic) BOOL automotive;

– stopActivityUpdates

上記のアップデート処理を停止させるときに呼び出します。引数はありません。

– queryStepCountStartingFrom:to:toQueue:withHandler:

from(NSDate*)で指定した時間からto(NSDate*)で指定した時間までの記録をたどり、アクティビティの入ったNSArrayを返します。例えば今から24時間前までの間のアクティビティの変化の記録を取り出すというような使い方です。取得する期間が長いとデータ量がかなり多く時間がややかかります。バックグラウンドで処理したほうがよさそうです。

Handlerの引数は以下になります。

withHandler:^(NSArray *activities, NSError *error)

activityの入ったNSArrayとerrorになります。

では次のページから実際のサンプルコードを交えつつ説明していきます。

Ios 7
タグ:

記事をリクエストする

関連記事

コメント