2012-12-13 2 views
8

Ich habe eine PhoneGap-App für das iPhone erstellt, die Geolocation über JavaScript in Webview verwendet.Wie kann man eine doppelte Eingabeaufforderung für die Geolokalisierung in der Phonegap App verhindern?

Wenn ich die App das erste Mal starte, werde ich aufgefordert, Geolocation für diese App zuzulassen.

Wenn ich "ok" drücke, wird es mich erneut mit derselben Frage auffordern, aber dieses Mal heißt es, dass "index.html" die Erlaubnis haben soll, Geolocation zu verwenden.

Das macht Sinn, weil iOS wahrscheinlich die Erlaubnis haben soll, Geolocation für die App selbst zum ersten Mal zuzulassen und das zweite Mal, dass der Browser eine Erlaubnis benötigt.

jedoch nicht führen, da nicht zu einem großen User Experience:

Wie kann ich diese doppelte Aufforderung verhindern? (Ich wäre genug, wenn die zweite Aufforderung konnte verhindert werden)

Antwort

14

Ich habe die Ursache für das Problem gefunden.

Der Anruf an navigator.geolocation.getCurrentPosition(onsuccess, onerror) passiert, bevor Phonegap vollständig geladen wurde.

Das bedeutet, dass der Geolocation-Aufruf von webview (und nicht ein nativer Anruf über PhoneGap) ausgelöst wird, die erneut um Erlaubnis fragen (was sinnvoll ist). Vergleichen Sie es mit dem normalen Safari-Browser auf Ihrem Smartphone. Für jede neue Website wird eine Geolocation-Berechtigung benötigt. Das gleiche gilt beim Laden von index.html über PhoneGap beim Start der Anwendung.

Allerdings ist die Lösung für das deviceready Ereignis warten, das ausgelöst wird, wenn PhoneGap voll geladen ist:

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

Dies wird die PhoneGap API zur Verfügung stellen, die den Standard-HTML5 gelocation Aufruf des Browsers überschreibt und erhalten Geoposition des Geräts über einen nativen Anruf (den Sie bereits in der ersten Eingabeaufforderung akzeptiert haben).

Dies funktioniert, weil PhoneGap API Aufrufe an den Standard W3C Aufruf für HTML5 identisch sind: http://docs.phonegap.com/en/2.2.0/cordova_geolocation_geolocation.md.html#Geolocation

+0

ausgezeichnete Antwort Timo. alle anderen sollten gelöscht werden, da sie Desinformation verbreiten. – r3wt

0

Werfen Sie einen Blick auf diese: Location permission alert on iPhone with PhoneGap

Die zweite scheint die Webkit, wachsam zu sein. Um dies zu verhindern, müssen Sie einfach alle Ihre js-Dateien in das Stammverzeichnis verschieben. Sag mir, ob es funktioniert, da ich bald das gleiche Problem ansprechen muss.

+0

Nope aufgenommen werden, das ist es nicht, aber Ihr Link wies mich in die richtige Richtung. Überprüfen Sie meine Antwort auf die Frage. – Timo

0

schließlich das Problem behoben.

IN index.html nur Ihre cordova.js nach oben

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

als die erste js-Datei aufgenommen werden (vor allem sicherstellen, dass Es ist über Karten js).Dies wird sicherstellen, dass die Aufforderung nur einmal zeigt

+0

nützlich, aber ein Konflikt tritt auf, wenn dieses Skript wie vorgeschlagen geladen wird, können die Webdienste weder geladen noch Fehler ausgegeben werden. Was ist die Lösung? – developer

+0

Ich benutze Sencha Touch 2, und in Ext.ajax.request, dass ein Konflikt damit hat. Wie vermeide ich das? – developer

+0

Das ist gefährlich, sei vorsichtig. Es könnte sein, dass Sie in Race-Bedingungen geraten, die in Ihrem Fall funktionieren, aber möglicherweise nicht in anderen Umgebungen funktionieren (abhängig von der Internetgeschwindigkeit des Benutzers, dem Browsertyp usw.). Sie sollten die Ausführungsreihenfolge des Skripts zuerst vollständig lesen und verstehen: http://www.html5rocks.com/en/tutorials/speed/script-loading/?redirect_from_locale=de – Timo

0

ich dieses Problem gelöst, indem die

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

als letzten Skript bewegt

+0

Dies ist gefährlich, seien Sie vorsichtig. Es könnte sein, dass Sie in Race-Bedingungen geraten, die in Ihrem Fall funktionieren, aber möglicherweise nicht in anderen Umgebungen funktionieren (abhängig von der Internetgeschwindigkeit des Benutzers, dem Browsertyp usw.). Sie sollten die Skriptausführungsreihenfolge zuerst vollständig lesen und verstehen: http://www.html5rocks.com/en/tutorials/speed/script-loading/?redirect_from_locale=de – Timo