OK, mój kod jest poniżej, więc wyjaśnię, co robię i co dostaję dla wyników.navigator.geolocation.watchPosition po prostu nie działa
Próbuję pobrać lokalizację użytkowników za pomocą opcji navigator.geolocation.watchPosition. Podałem zarówno powodzenie, jak i błąd zwrotny. Po raz pierwszy otrzymuję lokalizację, która zazwyczaj jest bardzo niedokładna, więc używam watchPosition, aby uzyskać lokalizację, dopóki nie zostanie wypróbowana 4 razy lub uzyska dokładną lokalizację w promieniu 500 metrów.
Problemy mam:
nigdy nie wchodzi do wywołania zwrotnego błędu dla Androida (testowane na HTC Sensation i Samsung Galaxy S3). Jednak na iPhonie wydaje się, że wprowadził błąd zwrotny ponad 50% czasu.
To również nigdy timeout. Po prostu wyszukuje, dopóki nie otrzyma lokalizacji .
- Uzyskanie lokalizacji zajmuje od 0 do 60 sekund. Czasami ma go przed załadowaniem strony, innym razem zajmuje to większą część minuty. Nie ma również żadnego dostrzegalnego wzoru, dlaczego czasami robi się to szybko, i dlaczego nie innym razem.
Przeszukałem wiele postów na forum i wiele pytań dotyczących stackoverflow, a także specyfikację geolokalizacji i innych dokumentów. Nie ma zbyt wielu informacji na ten temat, nie wspominając już o tych problemach. Czy jest coś, co robię źle? Czy jest to po prostu charakter pracy z lokalizacją?
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;
}
}
}