2012-11-28 10 views
6

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; 
      } 
     } 
    } 

risposta

2

vi consiglio di controllare utilizzando:

if (typeof navigator.geolocation === 'object' && typeof navigator.geolocation.watchPosition === 'function') { 
    ... 
} 

"The Geolocation.watchPosition() viene utilizzato per registrare una funzione del gestore che verrà chiamata automaticamente ogni volta che il posizione del dispositivo cambia È anche possibile, facoltativamente, specificare un errore nella gestione della funzione di callback. "

Maby non si attiva perché la posizione è sempre la stessa? ^^

tenta di debug usando Geolocation.getCurrentPosition() con un intervallo o WebWorker: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

Buona fortuna