Ok, il mio codice è sotto quindi spiegherò cosa sto facendo e cosa sto ottenendo per i risultati.navigator.geolocation.watchPosition non funziona
Sto provando ad afferrare la posizione degli utenti utilizzando navigator.geolocation.watchPosition. Ho specificato sia un callback di successo che di errore. La prima volta che ottengo la posizione è di solito molto impreciso, quindi uso watchPosition per mantenere la posizione finché non viene provato 4 volte o se la posizione è precisa a 500 metri.
problemi che sto avendo:
E non entra mai la richiamata di errore per Android (testato su HTC Sensation e Samsung Galaxy S3). Sull'iPhone, invece, sembra che inserisca il callback di errore oltre il 50% delle volte.
Inoltre, non va mai in timeout. Continua a cercare finché non viene ricevuta una posizione .
- Ci vuole da 0 a 60 secondi per recuperare una posizione. A volte lo ha prima che la pagina venga caricata, altre volte impiega la parte migliore di un minuto. Non c'è nemmeno un modello riconoscibile sul perché a volte diventa veloce e perché non altre volte.
Ho cercato molti post sul forum e molte domande sullo stackoverflow oltre alle specifiche per la geolocalizzazione e qualsiasi altro documento disponibile. Non ci sono molte informazioni su di esso, per non parlare di questi problemi. C'è qualcosa che sto sbagliando? O è solo la natura di lavorare con la posizione?
if(navigator.geolocation){
var geo_count = 0;
var wpid = navigator.geolocation.watchPosition(success, error, {
enableHighAccuracy: true,
maximumAge: 0,
timeout: 10000
});
function success(position){
alert(position.coords.accuracy)
geo_count = geo_count + 1;
if(position.coords.latitude && position.coords.longitude && position.coords.accuracy < 500){
navigator.geolocation.clearWatch(wpid);
alert('position obtained!');
}
else if(geo_count > 4){
navigator.geolocation.clearWatch(wpid);
alert('inaccurate position obtained');
}
}
function error(error){
switch(error.code){
case 1:
alert('permission denied');
break;
case 2:
alert('position unavailable');
break;
case 3:
alert('timeout');
break;
default:
alert('unknown error');
break;
}
}
}