Клуб API Карт

Ошибка геолокации с мобильного браузера с выключенным WiFi

chagin.web
15 января 2016, 16:36

В API 2.0 по ymaps.geolocation проблем нет, но в API 2.1 по IP (провайдер 'yandex') показывает неверные координаты, а режимы {provider: 'browser'} и {'provider: auto'} не работают (хотя 'auto' должен работать всегда?!). Но при этом всем navigator.geolocation браузера показывает верные координаты! Настройки геолокации браузера проверены. У коллег тоже самое.

 

Вот результат:

... старт:

определение по IP:[51.691219,81.11363]

определение по navigator.geolocation:[54.8625062,83.0897644]

ошибка определения по auto:"Not found"

ошибка определения по browser:"Not found"

 

Вот код:

function init() {

$('body').append('старт:' + '<br>')

         

    ymaps.geolocation.get({

        provider: 'yandex'

    }).then(

   function (result) {

   var html = JSON.stringify(result.geoObjects.position);

   $('body').append('определение по IP:' + html + '<br>')

    

    },

   function(err){

   var html = JSON.stringify(err);

   $('body').append('ошибка определения по IP:' + html + '<br>')

   }

    );

 

    ymaps.geolocation.get({

        provider: 'browser'

    }).then(

   function (result) {

   var html = JSON.stringify(result.geoObjects.position);

   $('body').append('определение по browser:' + html + '<br>')

    },

   function(err){

   var html = JSON.stringify(err);

   $('body').append('ошибка определения по browser:' + html + '<br>')

   }

    );

    

    ymaps.geolocation.get({

        provider: 'auto'

    }).then(

   function (result) {

   var html = JSON.stringify(result.geoObjects.position);

   $('body').append('определение по auto:' + html + '<br>')

    

   },

   function(err){

   var html = JSON.stringify(err);

   $('body').append('ошибка определения по auto:' + html + '<br>')

   }

    );

    

    navigator.geolocation.getCurrentPosition(

    function(result){

var crd = result.coords;

var html = '[' + crd.latitude + ',' + crd.longitude + ']';

$('body').append('определение по navigator.geolocation:' + html + '<br>')

    }, 

   function(err){

   var html = JSON.stringify(err);

   $('body').append('ошибка определения по navigator.geolocation:' + html + '<br>')

   }, 

   {}

    );

 

}

ymaps.ready(init);

 

Куда копать? Не хотелось бы делать navigator.geolocation -> геокодирование по полученным координатам

6 комментариев
Скажите свой ip-адрес, пожалуйста

Добрый день! Для Google Chrome 47.0 for Android 4.2.2 сайт myIP пишет: 66.102.9.72 и хост: google-proxy-66-102-9-72.google.com

 

Кажется, у вас каким-то образом включено проксирование трафика через сервера гугл. Поэтому геолокация по ip и 'auto' не работают — вас определяет в Калифорнии.

Такое поведение зафиксировано на разных телефонах, и с Андроидом и с iOS, на стандартных браузерах Chrome/Safari и на разных операторах MTS/Билайн. 

В итоге вместо [54.8625062,83.0897644] определяются коордианты [51.691219,81.11363] - это не Калифорния! И вызывает вопрос корректность работы режимов:

1.'auto' - не выбирает лучший режим из 'browser' / 'yandex' - ('browser' не работает, 'yandex' работает, но показывает неверные даннные)

2.'browser' не работает, хотя он основывается на данных работающего navigator.geolocation

Пока писал этот ответ, неожиданно заработал режим 'browser' и, соответственно, заработал режим 'auto'. Спасибо!! ;) Моя проблема решена. Но режим 'yandex' продолжает возвращать некорректные данные, хотя я им теперь не пользуюсь.

Тогда дайте ip-адреса, которые выдаются другими бразуерами.

Что касается режима 'auto', то логика следующая: браузерная геолокация выдаёт один результат, по ip — другой, разница между ними в тысячи километров. Непонятно, какой из них выбирать как «лучший» — очевидно, один из них сломан, и неизвестно, какой.
chagin.web,
Проверьте ещё раз, у меня вчера сломалось, хорошо что быстро заметил, быстренько успел поправить на navigator.geolocation. И еще, определение в разных браузерах происходят почему то с разным значением coords.accuracy, самый точный на сегодняшний день оказался хром.