読者です 読者をやめる 読者になる 読者になる

M7 と少しだけ戯れてみた

iOS cocoa iPhone

9/20 に無事に iPhone 5s Space Gray 64GB を手に入れました。前日の14時過ぎぐらいからヨドバシ梅田界隈をうろうろし、閉店少し前から列に並び、希望端末の整理券1番を Get し、9時くらいには現品 Get しました。

CMStepCounter と CMMotionActivityManager

そんなことはさておき本題。 iPhone 5s にしか搭載していない M7。これがないと動かない機能が CMMotionActivityManager と CMStepCounter あたりの API です。せっかく iPhone 5s を手に入れたので少し触ってみました。

CMStepCounter

CMStepCounter はその名の通り雑にいうと万歩計。計測自体は特にこのクラスを使わなくても iPhone 5s を持っていると OS 側がカウントしているようです。購入後20日午前中に実行しただけでも2000歩程度カウントされてました。

使い方は超シンプルです。

isStepCountingAvailable で利用可能かどうか確認。

OS の設定画面のプライバシーのところに「モーションアクティビティ」という項目があります。

f:id:griffin-stewie:20130922125426p:plain

以下のようにリストアップされます。

f:id:griffin-stewie:20130922125430p:plain

startStepCountingUpdatesToQueue:updateOn:withHandler: で歩数カウントの更新取得開始です。第1引数が第3引数に渡す handler を呼び出す queue を指定します。 第2引数には handler が呼び出される基準(スパン)の指定です。必ずしも指定した歩数間隔ごとに handler が呼び出されるわけではありません。 第3引数には歩数カウントの更新取得時に呼び出される Blocks を指定します。Blocks にはそのスタート以降の累計歩数、タイムスタンプ、エラーが返ってきます。

stopStepCountingUpdates ストップです。

queryStepCountStartingFrom:to:toQueue:withHandler: は任意の期間の歩数の集計ができます。 第1引数に開始日 第2引数に終了日 第3引数に第4引数に渡す handler を呼び出す queue を指定 第4引数に集計結果を受けとる Blocks を指定します。Blocks には歩数合計とエラーが返ってきます。

API や実際の挙動を見る限り、リアルタイムに(といってもタイミングとしては誤差あり)歩数情報を取得する必要がなければ、queryStepCountStartingFrom:to:toQueue:withHandler: だけで十分に歩数計的な用途として使えそうです。

実際に歩数を測りながら歩いてみましたが僕の場合ほぼ実際の歩数と同じくらいの測定精度に感じました。

CMMotionActivityManager

CMMotionActivityManager はユーザーの移動に関する情報を取得できます。情報の種別としては以下の通りです。

  • stationary・・・静止状態
  • walking・・・徒歩
  • running・・・ランニング中
  • automotive・・・自動車や電車等の乗り物に乗っている状態
  • unknown・・・不明

CMMotionActivityManager の提供する API に関しては CMStepCounter とほぼ同じです。 MotionActivity の更新タイミングの通知受けとりの開始と停止。それと任意の期間の情報取得です。 CMMotionActivityManager はその Motion 情報を CMMotionActivity というモデルクラスに格納して返します。

CMMotionActivity

先に挙げた5種類の状態情報を BOOL で返すインターフェイスと

  • startDate・・・発生時間
  • confidence・・・データの精度

を持っています。

状態情報がなんで enum じゃなく BOOL なのかと思ったのですが、リファレンスによると車で移動中の信号待ちなどでは automotive 且つ stationary という状態があるということなので enum じゃないようです。

用途としてはリファレンスにも書かれているようにナビゲーション系のアプリでユーザーの移動手段に応じたルートの提案等に使えると書かれています。

まとめ

CMStepCounter と CMMotionActivityManager も API としては非常にシンプルです。あとはこれをウマく使えるアイディア次第でおもしろい物が作れるかもしれませんね。

サンプルコード

手っ取り早く試してみたい方は以下にサンプルをおいてますので試してみてください。

griffin-stewie/M7MotionSample

余談

翌日 21 日の昼過ぎにヨドバシ梅田に行ったら Space Gray は容量問わず予約なしですぐに持ち帰れる状況でした \(^O^)/

妻が言ってくれました「リヴァイ兵長もこんな事を言ってたじゃない」

結果は誰にもわからなかった… だから… まぁ せいぜい… 悔いが残らない方を自分で選べ

僕は当日に iPhone 5s Space Gray 64GB が手に入らなければ悔いが残ってしまっていたわけでしたからこれでいいのです。