良いニュースは: 私はそれをやった.私はそれを理解した. 悪いニュースは、私よりも賢い誰かが、なぜこれが機能するのかを説明する必要があるということです。一方、このソリューションの他のバリエーションや、提供されている他のソリューションは機能しません。これは激戦の勝利でしたが、これを理解するのに何時間 (何日) かかったのか、恥ずかしくて言えません。難しい話は抜きにして:
if (window.navigator.geolocation) {
var accuracyThreshold = 100,
timeout = 10 * 1000,
watchID = navigator.geolocation.watchPosition(function(position) {
$('#latitude').val(position.coords.latitude); // set your latitude value here
$('#longitude').val(position.coords.longitude); // set your longitude value here
// if the returned distance accuracy is less than your pre-defined accuracy threshold,
// then clear the timeout below and also clear the watchPosition to prevent it from running continuously
position.coords.accuracy < accuracyThreshold && (clearTimeout(delayClear), navigator.geolocation.clearWatch(watchID))
}, function(error) {
// if it fails to get the return object (position), clear the timeout
// and cancel the watchPosition() to prevent it from running continuously
clearTimeout(delayClear);
navigator.geolocation.clearWatch(watchID);
// make the error message more human-readable friendly
var errMsg;
switch (error.code) {
case '0':
errMsg = 'Unknown Error';
break;
case '1':
errMsg = 'Location permission denied by user.';
break;
case '2':
errMsg = 'Position is not available';
break;
case '3':
errMsg = 'Request timeout';
break;
}
}, {
enableHighAccuracy: true,
timeout: timeout,
maximumAge: 0
}),
delayClear = setTimeout(function() {
navigator.geolocation.clearWatch(watchID);
}, timeout + 1E3); // make this setTimeout delay one second longer than your watchPosition() timeout
}
else {
throw new Error("Geolocation is not supported.");
}
注: 何らかの理由で、このコードの実行が最初にアプリを起動した後のある時点で遅れた場合、これは一貫して機能しないようです。したがって、これは初期化メソッドで実行する最初のことです。
注: アプリに追加した他の唯一のことは、地理位置情報データを使用する必要がある場合 (私にとっては、他のいくつかのクラス/オブジェクト リテラルの初期化後に行われます)、緯度/経度値。存在する場合は続行します。そうでない場合は、上記のジオロケーション メソッドを再度実行してから続行します。
注: 長い間悩まされていたことの 1 つは、ユーザーの現在の位置を取得するだけでよいということでした。ユーザーの動きを追跡する必要はありませんでした。getCurrentPosition() メソッドを使用して、これをさまざまに繰り返してみました。何らかの理由で、それは機能しません。それで、これが私が思いついた解決策です。ユーザーの位置を追跡するように実行し (最初に位置を取得するため)、位置を取得したら、watchPosition ID をクリアして追跡されないようにします。時間の経過とともに変化する位置を追跡する必要がある場合は、もちろんできます... watchPosition ID をクリアしません。
HTH。私がこれまでに読んだすべてのことから、ミッション クリティカルなアプリで動作するためにこの機能を必要とする多くの開発者がいます。この解決策がうまくいかない場合は、他にどのような指示を与えることができるかわかりません. そうは言っても、これを数百回テストしたところ、iOS 6 の WebApp (navigator.standalone) でユーザーの場所を正常に取得できました。