2010-03-07
CoreLocationの気まぐれ動作(その2)
先日書いた通り、CLLocationManagerクラスの挙動がアレで、ちょっと悩んでいる。
前回書いたのは「CLLocationManagerからのアップデート通知が必要以上に何回も送られてきて、デリゲートがそのたびに呼び出される」という話だった。
それに加えて「場所を移動し位置情報も変わっているはずなのに、通知される位置情報が更新されない」という問題に直面している。
例えば、5分おきに位置情報を計測するアプリを組み、新宿駅から東側(新宿駅→新宿三丁目→新宿御苑)に歩きながら動作させたとする。
《1回目》
1回目は新宿駅で計測が始まり、新宿駅近辺の緯度経度を入手することができる。これは正常に動作する。
《2回目:5分後》
その5分後、新宿三丁目付近に到着したタイミングで計測が開始されるとする。当然、新宿三丁目付近の緯度経度を入手できるはずだが、何故か新宿駅の緯度経度がデリゲートに送られてくるのである。
《3回目:10分後》
そのまま、5分間、新宿三丁目で立ち止まっていると、次の更新では新宿三丁目近辺の緯度経度を拾ってくれる。
5分間立ち止まらずに歩き続けて新宿御苑付近に到着していたなら、その時の更新では御苑付近の緯度経度を拾ってくれる。
つまり、2回に1回しか最新の位置情報を拾ってくれない。2回に1回はアップデート通知が届いても、届けられる位置情報は古い情報のままなのだ。
半日、あちこちうろうろして出た結果なので、偶然、位置情報を取得しにくい場所にいたため といった理由ではないだろう。*1
なぜなんだろう?そういう仕様なのだろうか?
*1:もしそうした理由であっても、didUpdateToLocationではなく、didFailWithErrorが呼び出されてしかるべきなので、いずれにせよ納得できないのだが
xyz2010/03/08 03:15horizontalAccuracyを調べるといいんじゃなかったっけ。何回かdidUpdateToLocationが呼ばれて精度が上がっていくらしい。新宿あたりはノイズが多くて精度あがらないかも。
ID2nd2010/03/08 22:47!! なるほど…CLLocationクラスの horizontalAccuracyプロパティを調べて、精度の低い情報を落としていけばいいんですね。早速やってみます!