■補講 iOS5+Safariでリアルタイムにコンパスの値を取得する iPhone/iPadのOSであるiOSも2011年10月にバージョン5がリリースされました。iOSはバージョンアップにともないブラウザであるSafariにも新機能が追加されてきました。 iOS5のSafariでは「コンパス」「Web Workers」に対応しました。ここでは「コンパス」について説明します。 ------------------------------------------------------------------------------------------------ ■Geolocation APIのコンパスとiOS5のコンパスの違い 本書の5章でGeolocation APIについて説明し、そこでも方角の値を取得することができると書きました(154ページ)。154ページにも書いてあるようにGeolocation APIでは方角の値を取得するには「一定速度で移動」していなければいけません。これはつまり、立ち止まって方角を確認することができないという事になります。 一定速度で移動しないと方角が分からないというのは実際にやってみると不便すぎて使い物になりません。このため、iOS5ではリアルタイムにコンパスの値を取得するための機能が追加されています。 iOS5のコンパスはGeolocation APIとは異なり方角が変化するとイベントが発生します。このイベントは「deviceorientation」です。実際にイベントを取得するにはwindowオブジェクトに対して割り当てます。deviceorientationイベントは、かなりの高頻度で発生する点には注意が必要です。 ------------------------------------------------------------------------------------------------ ■コンパス値を取得 deviceorientationイベントが発生すると、呼び出されるイベントハンドラにはイベントオブジェクトが渡されます。このイベントオブジェクトのwebkitCompassHeadingプロパティに方角の値が入っています。方角は0〜360未満でGeolocation APIと同様に0が北、90が東、180が南、270が西になります。 コンパス値の誤差はイベントオブジェクトのwebkitCompassAccuracyプロパティに入っています。どのくらいの角度の誤差があるかを示すことになります。 また、コンパス特有の事情として近くに磁石があると干渉し値が得られない場合があります。iPhone/iPadに標準で入っている地図アプリでも、たまに「コンパスの干渉」というメッセージが表示され8文字に振るように表示がでることがあります。このようなコンパスの干渉が発生した場合は、エラーが発生するのではなくwebkitCompassHeadingの値が-1になります。つまり、-1になったら画面に何らかのメッセージを表示するなりしてコンパスの干渉をユーザーに解消してもらう必要があります。 実際のプログラムは以下のようになります。iPhone/iPadを動かせばリアルタイムにコンパスの値が表示されます。なお、コンパスの値は時々おかしくなる事があるので、フィルタ処理などを使って誤差を軽減する方がよいかもしれません。 ------------------------------------------------------------------------------------------------ ■HTML (index.html) ------------------------------------------------------------------------------------------------