2012-12-13 2 views
8

Ho creato un'applicazione PhoneGap per iPhone che utilizza la geolocalizzazione tramite JavaScript all'interno di Webview.Come evitare il doppio prompt per la geolocalizzazione nell'app Phonegap?

Quando eseguo l'app per la prima volta, mi verrà chiesto di consentire la geolocalizzazione per questa app.

Quando mi ha colpito "ok", che sarà sollecito me ancora una volta con la stessa domanda, ma questa volta si afferma che "index.html" vuole il permesso di utilizzare la geolocalizzazione.

Questo ha senso perché iOS probabilmente vuole il permesso di consentire geolocalizzazione per la stessa applicazione per la prima volta e la seconda volta che il browser vuole il permesso.

Tuttavia, dal momento che non conduce ad una grande esperienza utente:

Come posso evitare questo doppio pronta? (Mi piacerebbe essere sufficiente se il 2 ° sollecito potrebbero essere evitate)

risposta

14

Ho trovato la causa del problema.

La chiamata a navigator.geolocation.getCurrentPosition(onsuccess, onerror) avviene prima PhoneGap stato completamente caricato.

Ciò significa che è stata attivata la chiamata di geolocalizzazione della webview (e non una chiamata nativa tramite PhoneGap) che chiederà nuovamente il permesso (che ha senso). Confrontalo con il normale browser Safari sul tuo smartphone. Richiederà l'autorizzazione di geolocalizzazione per ogni nuovo sito web. È lo stesso quando si carica index.html tramite PhoneGap all'avvio dell'applicazione.

Tuttavia, la soluzione è quella di attendere l'evento deviceready che viene licenziato quando PhoneGap è a pieno carico:

document.addEventListener("deviceready", function(){ 
    navigator.geolocation.getCurrentPosition(onsuccess, onerror, params); 
}, false); 

questo renderà l'API PhoneGap disponibili che sovrascrive il HTML5 chiamata gelocation di default del browser e ottenere la posizione geografica del dispositivo tramite una chiamata nativa (che hai già accettato nel primo prompt).

Ciò funzionerà perché le chiamate API PhoneGap sono identiche alla chiamata W3C standard per HTML5: http://docs.phonegap.com/en/2.2.0/cordova_geolocation_geolocation.md.html#Geolocation

+0

risposta eccellente timo. tutti gli altri dovrebbero essere cancellati mentre stanno diffondendo la disinformazione. – r3wt

0

Date un'occhiata a questo: Location permission alert on iPhone with PhoneGap

La seconda sembra essere l'avviso Webkit. Per evitare ciò, sembra che tu debba semplicemente spostare tutti i tuoi file js nella directory principale. Dimmi, se funziona, dovrò affrontare lo stesso problema presto.

+0

No, non è questo, ma il tuo link mi ha segnalato nella giusta direzione. Controlla la mia risposta alla domanda. – Timo

0

Infine risolto il problema.

IN l'index.html basta spostare il cordova.js fino

< script src = "cordova.js"> </script>

come il primo file js da inserire (in particolare assicurarsi è sopra le mappe includono js).Questo farà in modo che il prompt mostra solo una volta

+0

utile, ma si verifica un conflitto, quando questo script viene caricato come suggerito, i servizi Web non sono in grado di caricare né dare alcun errore. Qual è la soluzione? – developer

+0

Sto usando sencha touch 2 e in ext.ajax.request che ha un conflitto con quello. come evitare questo? – developer

+0

Questo è pericoloso, stai attento. Potresti imbatterti in condizioni di gara che funzionano nel tuo caso ma potrebbero non funzionare in altri ambienti (a seconda della velocità di Internet dell'utente, del tipo di browser e così via ...). Devi prima leggere e comprendere l'ordine di esecuzione dello script per primo: http://www.html5rocks.com/en/tutorials/speed/script-loading/?redirect_from_locale=de – Timo

0

Ho risolto questo problema spostando il

<script src="cordova.js"></script> 

come l'ultimo script per essere inclusi

+0

Questo è pericoloso, fai attenzione. Potresti imbatterti in condizioni di gara che funzionano nel tuo caso ma potrebbero non funzionare in altri ambienti (a seconda della velocità di Internet dell'utente, del tipo di browser e così via ...). Devi prima leggere e comprendere l'ordine di esecuzione dello script per primo: http://www.html5rocks.com/en/tutorials/speed/script-loading/?redirect_from_locale=de – Timo