navigator.geolocation.watchPosition просто не работает

Хорошо, мой код ниже, поэтому я объясню, что я делаю и какие результаты я получаю.

Я пытаюсь определить местоположение пользователей, используя 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;
            }
        }
    }

person jasonaburton    schedule 28.11.2012    source источник


Ответы (1)


Рекомендую проверить с помощью:

if (typeof navigator.geolocation === 'object' && typeof navigator.geolocation.watchPosition === 'function') {
    ...
}

«Метод Geolocation.watchPosition() используется для регистрации функции-обработчика, которая будет вызываться автоматически каждый раз, когда изменяется положение устройства. Вы также можете, при желании, указать функцию обратного вызова для обработки ошибок».

Может быть, это не срабатывает, потому что позиция все та же? ^^

Попробуйте отладить его, используя Geolocation.getCurrentPosition() с Interval или Webworker: https://developer.mozilla.org/en-US/docs/Web/API/Geolocation

Удачи

person redaxmedia    schedule 27.11.2013