【iPhone】加速度センサーのバックグランド動作(1)

iPhoneで万歩計(歩数計)を作ろうかなと思ったら、加速度センサーをバックグラウンドで動作させる方法がわからずいろいろ調べたので、それをメモしておきます。
iOS4からマルチタスクに対応したiOS Devicesですが、一言でマルチタスクと言ってもいろいろな機能があります。iOS 4マルチタスクまとめ | iPhoneWalkerから抜粋させてもらうと、下記がマルチタスク関連の機能になります。

  • Fast App Switching
  • Background Audio
  • Background Navigation
  • Background Location
  • Background VoIP
  • Task Compression
  • Push Notification
  • Local Notification

最初のFast App Switchingは、iOS4以上のSDKを使っていれば特に意識しなくても動くもので、iOS3まではアプリを終了すると完全に終了していたものが、自動的にSuspendedの状態に遷移するようになりました。Suspendedは、アプリの状態は保存されるものの、何かをバックグランドで動作させることはできません。(それでもだいぶ楽になりましたが)
バックグラウンドで任意の動作をさせるには、Task Compressionを使用します。これですと大抵のことはバックグラウンドでできるようになるのですが、10分まで、という大きな制約があります。10分しか動かない万歩計って使えないよ。。(もちろん常にアプリが前面にあればいいのですが、ロックされたり電話がかかってきたりしたらもうダメです)
Push Notification/Local Notificationは、動作していないアプリを通知を使ってユーザーに起動してもらうためのものなので、今回の用途には使えません。ちなみに、目覚まし時計アプリを作るのにLocal Notificationをかなり調べたのでだいぶ理解できましたが、それはまた別のお話で(はてしない物語風w)
ということで、10分以上バックグランドで動作させることができるのは、Backgound Audio / Navigation / Location / VoIPのみとなります。え!?ということは加速度センサーは無理!?と思いきや、いろいろ試していたら加速度センサーも一緒に動かすことができました。
これが公式な動きかどうかわからないのですが、Backgroud Locationを有効にして、バックグラウンドでの位置情報取得ができるようにします。その状態で、加速度センサーをCoreMotion(CMMotionManager)を使ってモニタリングすると、なんと値が取れてしまいます(ただしCoreMotionはiOS5以上でないと使えません)。位置情報だけでいいはずなのに、他でモニタリングしているセンサーの値もついでに取れてしまうような動きをします。
ということで、具体的なObjective-Cのコードは次回掲載!
今回お世話になった本はこちら。マルチタスク関連とGrand Central DispatchとBlock構文は知っておくと良さそう。

はてしない物語を買うなら絶対にハードカバー仕様です。物語と現実がリンクするあの感覚、すばらしい。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク

コメント

  1. […] 【iPhone】加速度センサーのバックグランド動作(1)の続きです。 […]