好消息是:我已经做到了……我已经弄清楚了。坏消息是:比我更聪明的人将不得不告诉你为什么这有效,而此解决方案的任何其他变体或提供的任何其他解决方案都不起作用。这是一场艰苦卓绝的胜利,但我不好意思说我花了多少小时(天)才弄清楚这一点。无需再费周折:
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.");
}
注意:由于某种原因,如果此代码的执行在最初启动应用程序后的某个时间点延迟,这似乎并不能始终如一地工作。所以,这是我在初始化方法中执行的第一件事。
注意:我添加到我的应用程序中的唯一另一件事是,当我需要使用地理位置数据时(对我来说,这发生在其他几个类/对象文字的初始化之后),是检查纬度/经度值。如果存在,继续;如果没有,请再次运行上述地理定位方法,然后继续。
注意:让我很长时间的一件事是我只需要获取用户的当前位置。我不需要跟踪用户的动作。我一直在用 getCurrentPosition() 方法尝试不同的迭代。无论出于何种原因,它都不起作用。所以,这就是我想出的解决方案。像要跟踪用户位置一样运行它(首先获取他们的位置),然后在获得他们的位置后,清除 watchPosition ID 以防止它跟踪他们。如果您需要随着时间的推移跟踪他们的位置,您当然可以......不清除 watchPosition ID。
HTH。从我所阅读的所有内容来看,有很多开发人员需要此功能才能为他们的任务关键型应用程序工作。如果此解决方案对您不起作用,我不确定我还能给出什么其他方向。话虽如此,我已经对此进行了数百次测试,并且成功地在 iOS 6 上的 WebApp (navigator.standalone) 中检索了用户的位置。