Die gute Nachricht ist: Ich habe es getan habe ... Ich habe es herausgefunden. Die schlechte Nachricht ist: Jemand, der schlauer ist als ich, wird Ihnen sagen müssen, warum das funktioniert, während jede andere Variante dieser Lösung oder einer der anderen angebotenen Lösungen nicht funktioniert. Das war ein hart umkämpfter Sieg, aber es ist mir zu peinlich, zu sagen, wie viele Stunden (Tage) ich brauchte, um das herauszufinden.Ohne weitere Umschweife:
if (window.navigator.geolocation) {
var accuracyThreshold = 100,
timeout = 10 * 1000,
watchID = navigator.geolocation.watchPosition(function(position) {
$('#latitude').val(position.coords.latitude); // set your latitude value here
$('#longitude').val(position.coords.longitude); // set your longitude value here
// if the returned distance accuracy is less than your pre-defined accuracy threshold,
// then clear the timeout below and also clear the watchPosition to prevent it from running continuously
position.coords.accuracy < accuracyThreshold && (clearTimeout(delayClear), navigator.geolocation.clearWatch(watchID))
}, function(error) {
// if it fails to get the return object (position), clear the timeout
// and cancel the watchPosition() to prevent it from running continuously
clearTimeout(delayClear);
navigator.geolocation.clearWatch(watchID);
// make the error message more human-readable friendly
var errMsg;
switch (error.code) {
case '0':
errMsg = 'Unknown Error';
break;
case '1':
errMsg = 'Location permission denied by user.';
break;
case '2':
errMsg = 'Position is not available';
break;
case '3':
errMsg = 'Request timeout';
break;
}
}, {
enableHighAccuracy: true,
timeout: timeout,
maximumAge: 0
}),
delayClear = setTimeout(function() {
navigator.geolocation.clearWatch(watchID);
}, timeout + 1E3); // make this setTimeout delay one second longer than your watchPosition() timeout
}
else {
throw new Error("Geolocation is not supported.");
}
Hinweis: aus irgendeinem Grund, dies scheint nicht so konsequent, wenn die Ausführung dieses Codes zu arbeiten, um es zu einem bestimmten Zeitpunkt verzögert, nachdem zunächst die App zu starten. Also, das ist die erste Sache, die ich in meiner Initialisierungsmethode ausführe.
Hinweis: Die einzige andere Sache, die ich meiner App hinzugefügt habe, ist, wenn ich die Geolocation-Daten verwenden muss (was für mich nach der Initialisierung von mehreren anderen Klassen/Objektliteralen stattfindet) für die Breiten-/Längenwerte. Wenn sie existieren, fahre fort; Wenn nicht, führen Sie die obige Geolocation-Methode erneut aus und fahren Sie fort.
Hinweis: Eines der Dinge, die mich für eine lange Zeit warf war, dass ich nur die aktuelle Position des Benutzers erhalten musste. Ich musste die Bewegungen der Benutzer nicht verfolgen. Ich habe verschiedene Wiederholungen mit der Methode getCurrentPosition() versucht. Aus irgendeinem Grund funktioniert es nicht. Also, das ist die Lösung, die mir einfällt. Führen Sie es so aus, als würden Sie den Standort des Benutzers verfolgen (um seinen Standort an erster Stelle zu erhalten), und löschen Sie die watchPosition-ID, sobald sie ihren Standort erreicht hat, damit sie nicht mehr verfolgt wird. Wenn Sie ihren Standort im Laufe der Zeit verfolgen müssen, können Sie natürlich die watchPosition ID nicht löschen.
HTH. Nach allem, was ich gelesen habe, gibt es viele Entwickler, die diese Funktionalität für ihre unternehmenskritischen Anwendungen benötigen. Wenn diese Lösung für Sie nicht funktioniert, bin ich nicht sicher, welche andere Richtung ich geben kann. Nachdem ich das gesagt habe, habe ich das mehrere hundert Mal getestet und dies hat erfolgreich den Standort der Benutzer in einer WebApp (navigator.standalone) auf iOS 6 abgerufen.
Nur auf iOS 6.1.1 aktualisiert und das scheint immer noch ein Problem zu sein. – bjudson