iOS11から頻発する駅メモの「位置情報の取得に失敗しました」の謎に迫る
あらすじ
iOS11から位置情報の取得方法が内部的に変更されました。
これにより、位置情報が不安定な場所(地下鉄など)では位置情報が固定されてしまい、
駅メモ界隈のiOS11利用者は地下鉄でのチェックインができず地獄を見ることになりました。
更にこの影響か、「位置情報の取得に失敗しました」というエラーを頻発させるようになるという二重苦。

このエラーは発生までにチェックインしてからエラーが表示されるまで数秒のディレイがかかるため、レスポンス命の駅メモでは致命的です。
iOS11.3から位置情報の取得に改善が見られ、少なくとも地下鉄で位置情報が固定され続けるままという状態は無くなりました。
しかしながら、駅メモでは未だに上記のエラーが発生しているようです。
なぜ?
(以下の情報は独自で調査した結果及び考察を含んでいます。ので間違ってる可能性も十分にありますので、あーこんな感じなのかぐらいに読んでいただけると)
検証用アプリを作って調査してみたんですが、どうやら以下の状態の時にエラーが吐かれるようです。
・最後に位置情報を取得してから一定時間情報が更新されない(位置情報が古くなった)時
・iOS側が何らかのエラーを返した時
それぞれの挙動について説明します。
最後に位置情報を取得してから一定時間情報が更新されない(位置情報が古くなった)時
位置情報の取得を開始すると、iOSは取得した位置情報をアプリに垂れ流します。
この位置情報は必ず一定間隔で流れるわけではなく、GPSが入らない場所にいたり、位置情報の取得が不安定になると、しばらくの間位置情報が流れなくなることがあります。
iOS11.2.6までは位置情報が固定される問題で、しばらくどころか全く位置情報が流れないこともありました。
位置情報が流れなくなると、最後に取得した位置情報は更新されず古い情報となってしまいます。駅メモの場合、新しい位置情報が流れてくるまで待っていて、そのぶん時間がかかっているのではないかと思います。で、一定時間待ったけど情報が来なくてタイムアウトしてエラー、なのではないかと。
ちなみにiOSは常に最新の位置情報を流すとは限らず、過去に取得した位置情報をそのまま流す場合があります。
よく地下鉄でチェックインしてからもう一度チェックインしたら前の駅だった、ということがあると思います。
これは、位置情報が確定していない場合や、すぐに位置情報が取得できない時、以前の位置情報をOS側がアプリに流すためです。
このような不正な位置情報は基本的にアプリ側で弾くのですが、もしこれをそのまま使っているのだとしたら、その影響もあるかもしれませんね。憶測ですが…
iOS側が何らかのエラーを返した時
ユーザーが位置情報サービスをオフにしたり、位置情報の取得を拒否するとiOSからエラーが通知されるのですが、これ以外にも位置情報の取得がうまくいかない時もエラーに含まれるので、これをみてエラーを吐いている可能性もあります。
で、解決策は?
いくつか試してうまくいきそうなのを紹介します。
(18.9.25 追記)
・位置情報→GPSの精度を「低い」にする
こちらを設定することで、駅ろけを起動しながらでも位置情報が取得できました。
ただ、たまに取得に失敗することがあるので確実なのは駅ろけを切ることかもしれません…
(18.4.4 追記)
・駅ろけ(ロガーなどのバックグラウンドで位置情報を利用するタイプのアプリ全て)を切る
おそらくこれで解決できるかもしれません。
どうやらバックグラウンドで常に位置情報を取得するアプリ(駅ろけなど)を立ち上げていると、地下鉄などのうまく位置情報が入らない場所では古い位置情報がほぼ確実に流れてくることがわかりました(iOS側の挙動によるのでバージョンによって違いがあると思います)。
上で説明したように、古い位置情報は駅メモではエラー扱いになります。
実際に駅ろけを切ってみたところ、エラーが発生しなくなりました。
この問題はiOS側の制御によるものなので、駅ろけからはどうすることもできず現状地下鉄では駅ろけを切ってチェックインボタンを連打、あるいはチェックインする時にアプリを切る、が現在の最適解かと思われます。
アプリ作者としてはアプリが使えない状況というのはつらいですが…
また駅ろけに限らず、バックグラウンドで位置情報を取得するアプリ全てが影響を及ぼすみたいなので、GPSロガーやバックグラウンドで動作するマップアプリを使用している場合も注意が必要です。
・位置情報サービスをオン/オフする
強制的に位置情報を再取得させることで一応チェックインできるようになるようです。
ただ位置情報を無理やり更新させることになるのであまりお勧めできません。自己責任で。
・駅奪取から連携チェックインする
駅奪取には上記に記したような仕組みがありません(多分)。なので、駅奪取からだとうまくいくかも。ただ駅奪取って前から地下鉄で駅取りづらいんだよね…。
・運営に懇願する
五反田に向かいお祈りをしてきましょう。もしかしたら対応してくれるかもしれませんよ。
あ、怒られても僕は責任を取りませんので。そこんとこよろしくお願いします。
ちなみに、位置情報がうまく取得できていない時にApple純正マップを開くと位置情報が表示されないか、現在地を示すドットがグレーの状態に変化します。
この状態の時はだいたい駅メモ側でもチェックインできないので、参考にできるかもしれません。
あとがき
iOS11の地下鉄の取れなさに絶望したので少しでもマシに駅が取れるようにと書きました。うまく駅が取れるようになれば幸いです。