working ubicacion react obtener not gratis getcurrentposition expired enablehighaccuracy chrome javascript jquery geolocation

javascript - ubicacion - navigator.geolocation.getCurrentPosition a veces funciona, a veces no



navigator.geolocation.getcurrentposition timeout expired (21)

Así que tengo un poco de JS bastante simple usando el navegador navigator.geolocation.getCurrentPosition jammy

$(document).ready(function(){ $("#business-locate, #people-locate").click(function() { navigator.geolocation.getCurrentPosition(foundLocation, noLocation); }); navigator.geolocation.getCurrentPosition(foundLocation, noLocation); function foundLocation(position) { var lat = position.coords.latitude; var lon = position.coords.longitude; var userLocation = lat + '', '' + lon; $("#business-current-location, #people-current-location").remove(); $("#Near-Me") .watermark("Current Location") .after("<input type=''hidden'' name=''business-current-location'' id=''business-current-location'' value=''"+userLocation+"'' />"); $("#people-Near-Me") .watermark("Current Location") .after("<input type=''hidden'' name=''people-current-location'' id=''people-current-location'' value=''"+userLocation+"'' />"); } function noLocation() { $("#Near-Me").watermark("Could not find location"); $("#people-Near-Me").watermark("Could not find location"); } })//end DocReady

Básicamente, lo que sucede aquí es que obtenemos la posición actual; si se obtiene, se colocan dos "marcas de agua" en dos campos que dicen "Posición actual" y se crean dos campos ocultos con los datos de larga duración como su valor (se eliminan al principio para que no se dupliquen cada vez). También hay dos botones que tienen una función de clic vinculada a ellos que hacen lo mismo. Desafortunadamente, cada tercera vez más o menos, funciona. ¿Cuál es el problema aquí?


Aquí está mi solución gracias a un cierre:

function geoloc(success, fail){ var is_echo = false; if(navigator && navigator.geolocation) { navigator.geolocation.getCurrentPosition( function(pos) { if (is_echo){ return; } is_echo = true; success(pos.coords.latitude,pos.coords.longitude); }, function() { if (is_echo){ return; } is_echo = true; fail(); } ); } else { fail(); } } function success(lat, lng){ alert(lat + " , " + lng); } function fail(){ alert("failed"); } geoloc(success, fail);


Así que estaba corriendo en la misma cosa. Probé la solución de tiempo de espera que funcionó pero no de manera confiable. Encontré que si lo llamas dos veces, la ubicación se actualiza correctamente

function getLocation(callback) { if(navigator.geolocation) { navigator.geolocation.getCurrentPosition(function(position) { navigator.geolocation.getCurrentPosition(callback, function(){},{maximumAge:0, timeout:10000}); },function(){}, {maximumAge:0, timeout:10000}); } return true; }

esto, por supuesto, es un poco más lento, pero no me ha dado una vez la posición incorrecta. He tenido que alcanzar el tiempo de espera varias veces y no devolver nada, salvo que funcione bien. Sé que esto todavía es un poco intrincado y espero que alguien encuentre la solución real.

O si quieres asegurarte de que va a seguir intentándolo hasta que desees rendirte, puedes intentar algo como esto.

//example $(document).ready(function(){ getLocation(function(position){ //do something cool with position console.log(position); }); }); var GPSTimeout = 10; //init global var NOTE: I noticed that 10 gives me the quickest result but play around with this number to your own liking //function to be called where you want the location with the callback(position) function getLocation(callback) { if(navigator.geolocation) { var clickedTime = (new Date()).getTime(); //get the current time GPSTimeout = 10; //reset the timeout just in case you call it more then once ensurePosition(callback, clickedTime); //call recursive function to get position } return true; } //recursive position function function ensurePosition(callback, timestamp) { if(GPSTimeout < 6000)//set at what point you want to just give up { //call the geolocation function navigator.geolocation.getCurrentPosition( function(position) //on success { //if the timestamp that is returned minus the time that was set when called is greater then 0 the position is up to date if(position.timestamp - timestamp >= 0) { GPSTimeout = 10; //reset timeout just in case callback(position); //call the callback function you created } else //the gps that was returned is not current and needs to be refreshed { GPSTimeout += GPSTimeout; //increase the timeout by itself n*2 ensurePosition(callback, timestamp); //call itself to refresh } }, function() //error: gps failed so we will try again { GPSTimeout += GPSTimeout; //increase the timeout by itself n*2 ensurePosition(callback, timestamp);//call itself to try again }, {maximumAge:0, timeout:GPSTimeout} ) } }

Probablemente tengo algunos errores tipográficos y algunos errores ortográficos aquí, pero espero que se te ocurra. Déjeme saber si alguien tiene preguntas o si alguien encuentra algo mejor.


El segundo parámetro pasado a Geolocation.getCurrentPosition() es la función que desea manejar cualquier error de geolocalización. La función del controlador de errores recibe un objeto PositionError con detalles sobre por qué falló el intento de geolocalización. Recomiendo enviar el error a la consola si tiene algún problema:

var positionOptions = { timeout: 10000 }; navigator.geolocation.getCurrentPosition(updateLocation, errorHandler, positionOptions); function updateLocation(position) { // The geolocation succeeded, and the position is available } function errorHandler(positionError) { if (window.console) { console.log(positionError); } }

Al hacer esto en mi código, apareció el mensaje "Proveedor de ubicación de red en '' https://www.googleapis.com/ '': Código de error devuelto 400". Resulta que Google Chrome usa las API de Google para obtener una ubicación en dispositivos que no tienen GPS incorporado (por ejemplo, la mayoría de las computadoras de escritorio). Google devuelve una latitud / longitud aproximada según la dirección IP del usuario. Sin embargo , en las versiones de desarrollador de Chrome (como Chromium en Ubuntu) no hay una clave de acceso a API incluida en la versión del navegador. Esto hace que la solicitud de API falle silenciosamente. Ver Chromium Issue 179686: Geolocalización que da error 403 para más detalles.


Encontré, que de esta manera no funciona.

navigator.geolocation.getCurrentPosition(function() {...}, function(err) {...}, {});

Pero

esta manera funciona perfecto

function storeCoordinates(position) { console.log(position.coords.latitude, position.coords.longitude); } function errorHandler() {...} navigator.geolocation.getCurrentPosition(storeCoordinates, errorHandler, { enableHighAccuracy: true, timeout: 20000, maximumAge: 0 });


Esta es la forma de pirateo con la que me estoy moviendo, al menos funciona en todos los navegadores actuales (en Windows, no tengo una Mac):

if (navigator.geolocation) { var location_timeout = setTimeout("geolocFail()", 10000); navigator.geolocation.getCurrentPosition(function(position) { clearTimeout(location_timeout); var lat = position.coords.latitude; var lng = position.coords.longitude; geocodeLatLng(lat, lng); }, function(error) { clearTimeout(location_timeout); geolocFail(); }); } else { // Fallback for no geolocation geolocFail(); }

Esto también funcionará si alguien hace clic en el cierre o elige no o elige la opción Nunca compartir en Firefox.

Clunky, pero funciona.


Esta ya es una pregunta antigua, pero todas las respuestas no resolvieron mi problema, así que agreguemos la que finalmente encontré. Huele como un hack (y es uno), pero funciona siempre en mi situación. Esperanza en tu situación también.

//Dummy one, which will result in a working next statement. navigator.geolocation.getCurrentPosition(function () {}, function () {}, {}); //The working next statement. navigator.geolocation.getCurrentPosition(function (position) { //Your code here }, function (e) { //Your error handling here }, { enableHighAccuracy: true });


Esto me funciona cada vez:

navigator.geolocation.getCurrentPosition(getCoor, errorCoor, {maximumAge:60000, timeout:5000, enableHighAccuracy:true});

Aunque no es muy preciso. Lo gracioso es que en el mismo dispositivo, si ejecuto esto, me quita unos 100 metros (cada vez), pero si voy a los mapas de Google, encuentra exactamente mi ubicación. Entonces, aunque creo que enableHighAccuracy: true ayuda a que funcione de manera coherente, no parece hacerlo más preciso ...


Finalmente encontré una versión de trabajo para Firefox, Chrome y navegador predeterminado en Android (solo 4.2 probado):

function getGeoLocation() { var options = null; if (navigator.geolocation) { if (browserChrome) //set this var looking for Chrome un user-agent header options={enableHighAccuracy: false, maximumAge: 15000, timeout: 30000}; else options={maximumAge:Infinity, timeout:0}; navigator.geolocation.getCurrentPosition(getGeoLocationCallback, getGeoLocationErrorCallback, options); } }


Gracias a todos por su aporte, esto me ayudó.

Además de tener que usar watchPosition () en lugar de getCurrentPosition (), también encontré que necesitaba mover la llamada desde dentro de document.ready () a la cabeza.


He estado teniendo exactamente el mismo problema y casi no he encontrado información en línea al respecto. Nada de nada en los libros. Finalmente encontré esta consulta sobria sobre y (¡ja!) Fue el ímpetu final que necesitaba para configurar una cuenta aquí.

Y tengo una respuesta parcial, pero desgraciadamente no es completa.

En primer lugar, comprenda que el tiempo de espera predeterminado para getCurrentPosition es infinito (!). Eso significa que nunca se llamará a su controlador de errores si getCurrentPosition se cuelga en algún lugar en el extremo posterior.

Para asegurarse de obtener un tiempo de espera, agregue el tercer parámetro opcional a su llamada a getCurrentPosition, por ejemplo, si desea que el usuario espere no más de 10 segundos antes de darles una pista de lo que está sucediendo, use:

navigator.geolocation.getCurrentPosition(successCallback,errorCallback,{timeout:10000});

En segundo lugar, he experimentado una fiabilidad muy diferente en diferentes contextos. Aquí en casa, recibo una devolución de llamada dentro de uno o dos segundos, aunque la precisión es baja.

Sin embargo, en el trabajo, experimento variaciones bastante extrañas en el comportamiento: la geolocalización funciona en algunas computadoras todo el tiempo (a excepción de IE, por supuesto), otras solo funcionan en chrome y safari, pero no en Firefox (¿cuestión de gecko?), Otras funcionan una vez y luego posteriormente falla, y el patrón cambia de hora en hora, de día en día. A veces tienes una computadora ''afortunada'', otras veces no. Tal vez el sacrificio de cabras en luna llena ayudaría?

No he podido comprender esto, pero sospecho que la infraestructura de back-end es más desigual de lo que se anuncia en los diversos libros y sitios web de Gung-Ho que promueven esta función. Realmente deseo que sean un poco más claros acerca de qué tan importante es esta característica y cuán importante es la configuración del tiempo de espera, si desea que su controlador de errores funcione correctamente .

Hoy he estado tratando de enseñar estas cosas a los estudiantes, y tuve la vergonzosa situación en la que mi propia computadora (en el proyector y varias pantallas grandes) estaba fallando en silencio, mientras que aproximadamente el 80% de los estudiantes obtenían un resultado casi al instante (usando el exactamente la misma red inalámbrica). Es muy difícil resolver estos problemas cuando mis estudiantes también están cometiendo errores tipográficos y otros errores, y cuando mi propia PC también está fallando.

De todos modos, espero que esto les ayude a algunos de ustedes. Gracias por la prueba de cordura!


He estado teniendo problemas similares y he estado estudiando la posibilidad de que los navegadores tengan límites en la frecuencia con la que se puede llamar a getCurrentPosition. Parece que a menudo puedo obtener una ubicación, pero si actualizo la página de inmediato, se agotará el tiempo de espera. Si espero un poco, usualmente puedo obtener una ubicación nuevamente. Esto suele suceder con FF. En Chrome y Safari, todavía no he notado el tiempo de espera de getCurrentPosition. Solo un pensamiento...

Aunque no puedo encontrar ninguna documentación que respalde esto, fue una conclusión a la que llegué después de muchas pruebas. Tal vez alguien más tiene algo de información sobre eso?


Igual que aquí, esto funciona perfectamente en Chrome (estable, dev y canary), pero no en FF y Safari. También funciona perfecto en mi iPhone y iPad (Safari!). Esto podría deberse a la novedad relativa de esta característica (es decir, es un error). Paso casi una semana en esto ahora y simplemente no puedo hacerlo funcionar en esos navegadores

Esto es lo que encontré:

La primera vez que llamas a getCurrentPosition funciona perfecto. Cualquier llamada subsiguiente nunca regresa, es decir, no dispara las funciones successCallback o errorCallback. Agregué algunas opciones de posición a mi llamada para probar mi punto:

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, {timeout: 10000});

y se agota cada vez (después de la primera llamada exitosa). Pensé que podría arreglarlo con maximumAge, pero eso no parece estar funcionando como se supone que funciona tampoco:

navigator.geolocation.getCurrentPosition(successCallback, errorCallback, {maximumAge:60000, timeout: 2000});

esto debería evitar realmente llamar a la función getCurrentPosition si la llama dentro de 60 segundos, pero ignora esto (sin embargo, esto podría deberse a que realmente actualizo mi página para activar la segunda llamada, no estoy seguro si esto es persistente en todas las llamadas)

por cierto, incluso los ejemplos de google fallan en estos navegadores, lo que me lleva a creer que estos son, de hecho, errores del navegador, pruébelo, cárguelo dos veces en Safari y no funcionará la segunda vez.

Si alguien encuentra una solución para esto, POR FAVOR, hágamelo saber :-)

Aclamaciones.


La respuesta de @ brennanyoung es excelente, pero si se pregunta qué hacer en el caso de falla, podría usar una API de geolocalización IP como https://ipinfo.io (que es mi servicio). Aquí hay un ejemplo:

function do_something(coords) { // Do something with the coords here // eg. show the user on a map, or customize // the site contents somehow } navigator.geolocation.getCurrentPosition(function(position) { do_something(position.coords); }, function(failure) { $.getJSON(''https://ipinfo.io/geo'', function(response) { var loc = response.loc.split('',''); var coords = { latitude: loc[0], longitude: loc[1] }; do_something(coords); }); }; });

Consulte http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition para obtener más detalles.


No recibe un mensaje de error porque no tiene tiempo de espera por defecto (al menos eso creo). He tenido el mismo problema con Firefox solo para mí Firefox siempre da un tiempo de espera. Usted puede establecer un tiempo de espera de esta manera.

He establecido la edad máxima en Infinito para asegurarme de que no haya problema. Mi función funciona muy bien en Chrome, pero siempre tengo un tiempo de espera en Firefox.

navigator.geolocation.getCurrentPosition( function(position) { //do succes handling }, function errorCallback(error) { //do error handling }, { maximumAge:Infinity, timeout:5000 } );

Te recomiendo vigilar tus errores con cuidado. Se espera para todo. Tener un plan de respaldo para todo. Yo mismo uso algunos valores predeterminados o valores de mi base de datos en caso de que falle la geolocalización de google y la geolocalización del navegador.


Para cualquiera que trabaje en una aplicación de iPhone ...

Si su código se está ejecutando en un UIWebView en iOS 9+, debe configurar NSLocationWhenInUseUsageDescription dentro del NSLocationWhenInUseUsageDescription su aplicación.

Si no lo configura, getCurrentPosition nunca devolverá la llamada y nunca se le preguntará al usuario.


Pondré esto aquí en caso de que sea útil para alguien ...

En iOS Safari, las llamadas a navigator.geolocation.getCurrentPosition caducarán si tuviera una función activa de navigator.geolocation.watchPosition ejecución.

Iniciar y detener watchPosition correctamente usando clearWatch() como se describe aquí, funcionó: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation/watchPosition


Puede ser una buena idea usar un servicio de ubicación geográfica de direcciones IP como método de reserva cuando falla la posición de posición getCurrentPosition . Por ejemplo, con nuestra API https://ip-api.io

$.getJSON("http://ip-api.io/json/", function(result) { console.log(result); });


Tengo este problema en Mozilla. Todo el tiempo: Error : Error desconocido al adquirir la posición .

Ahora estoy usando 47 Mozilla. Lo he intentado todo, pero todo el tiempo este problema. PERO luego abro about: config en mi barra de suma, vaya a geo.wifi.ui y cambie su valor a " https://location.services.mozilla.com/v1/geolocate?key=test ". ¡trabajos!

Si tienes un error de tiempo de espera de adquisición de posición , intenta aumentar el valor de tiempo de espera:

var options = { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 }; navigator.geolocation.getCurrentPosition(success, error, options);


Todavía estoy obteniendo resultados irregulares en 2017, y tengo una teoría: la documentación de la API dice que la llamada ahora solo está disponible "en un contexto seguro", es decir, a través de HTTPS. Estoy teniendo problemas para obtener un resultado en mi entorno de desarrollo (http en localhost) y creo que esta es la razón.


Yo mismo noté este problema recientemente, y no estoy seguro de cómo se produce, pero parece que a veces Firefox se atasca en algo cargado en la memoria caché. Después de borrar la memoria caché y reiniciar Firefox, parece funcionar de nuevo.


Esta biblioteca agrega una opción de precisión y maxWait a las llamadas de geolocalización, lo que significa que seguirá intentando obtener una posición hasta que la precisión esté dentro de un rango específico.