Хорошо, мой код ниже, поэтому я объясню, что я делаю и какие результаты я получаю.
Я пытаюсь определить местоположение пользователей, используя navigator.geolocation.watchPosition. Я указал как успешный, так и ошибочный обратный вызов. В первый раз, когда я получаю местоположение, оно обычно очень неточное, поэтому я использую watchPosition, чтобы продолжать получать местоположение, пока оно либо не будет проверено 4 раза, либо не будет получено местоположение с точностью до 500 метров.
Проблемы, которые у меня есть:
Он НИКОГДА не вводит обратный вызов ошибки для Android (проверено на HTC Sensation и Samsung Galaxy S3). Однако на iPhone он, кажется, вводит обратный вызов ошибки более чем в 50% случаев.
Это также никогда не тайм-аут. Он просто продолжает поиск, пока не получит местоположение.
- Для получения местоположения требуется от 0 до 60 секунд. Иногда это происходит до того, как страница загружается, в других случаях это занимает большую часть минуты. Также нет заметной закономерности в том, почему иногда это происходит быстро, а в других случаях нет.
Я просмотрел много сообщений на форуме и много вопросов о stackoverflow, а также спецификацию геолокации и любые другие документы. Информации по нему не очень много, не говоря уже об этих проблемах. Есть ли что-то, что я делаю неправильно? Или это просто характер работы с местоположением?
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;
}
}
}