La buena noticia es: lo he hecho ... He descubierto. La mala noticia es que alguien más inteligente que yo tendrá que decirte por qué funciona, mientras que cualquier otra variación de esta solución o cualquiera de las otras ofrecidas no funcionará. Esta fue una victoria muy reñida, pero estoy demasiado avergonzado para decir cuántas horas (días) me tomó resolver esto.Sin más preámbulos:
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.");
}
Nota: por alguna razón, esto no parece funcionar tan consistentemente si la ejecución de este código se retrasa en algún momento después del lanzamiento inicial de la aplicación. Entonces, esto es lo PRIMERO que ejecuto en mi método de inicialización.
Nota: La única otra cosa que agregué a mi aplicación es que cuando necesito utilizar los datos de geolocalización (que, para mí, tiene lugar después de la inicialización de varias otras clases/objetos literales), es verificar para los valores de latitud/longitud. Si existen, continúa; De lo contrario, ejecute el método de geolocalización anterior nuevamente, luego continúe.
Nota: Una de las cosas que me causó mucho tiempo fue que solo necesitaba obtener la posición actual del usuario. No necesité seguir los movimientos de los usuarios. Seguí probando diferentes iteraciones de esto con el método getCurrentPosition(). Por alguna razón, no funciona. Entonces, esta es la solución que se me ocurrió. Ejecútelo como si fuera a rastrear la ubicación de los usuarios (para obtener su ubicación en primer lugar), luego, una vez que haya obtenido su ubicación, borre la ID de watchPosition para evitar que los rastree. Si necesita rastrear su ubicación ya que cambia con el tiempo, puede, por supuesto ... no borrar la ID de watchPosition.
HTH. De todo lo que he estado leyendo, hay muchos desarrolladores que necesitan esta funcionalidad para trabajar con sus aplicaciones de misión crítica. Si esta solución no funciona para usted, no estoy seguro de qué otra dirección pueda darle. Una vez dicho esto, he probado esto cientos de veces y esto recupera con éxito la ubicación de los usuarios en una aplicación web (navigator.standalone) en iOS 6.
Acabo de actualizar a iOS 6.1.1 y esto todavía parece ser un problema. – bjudson