Руководства

Кнопка «Определить моё местоположение» без запроса браузера

Встроенный в браузер запрос геопозиции требует точности уровня GPS и явного разрешения, а многие посетители отклоняют его по привычке. Кнопке «Определить моё местоположение» вообще не нужно проходить через этот диалог, если для вашей задачи достаточно приблизительного местоположения.

Определение на стороне сервера

При нажатии кнопки отправьте запрос на собственный сервер, который и так видит IP-адрес посетителя в соединении. Проверьте этот адрес через /v1/ip и используйте результат напрямую, без какого-либо диалога разрешений в браузере.

GET /v1/ip
{
  "status": "ok",
  "ip": "198.51.100.23",
  "version": 4,
  "found": true,
  "country": "Italy",
  "country_code": "IT",
  "region": "Lombardy",
  "city": "Milan",
  "postcode": "20121",
  "lat": 45.4642,
  "lon": 9.1900,
  "timezone": "Europe/Rome",
  "asn": 3456,
  "org": "Example ISP"
}

Вызов эндпоинта без параметра ip, как показано здесь, определяет адрес, с которого пришёл запрос. Когда ваш бэкенд вызывает его от имени посетителя, это и есть собственный адрес посетителя.

Правильные ожидания

Местоположение по IP в лучшем случае определяется с точностью до города, а не с точностью GPS. Называйте функцию честно, например «Определить мой примерный район», а не намекайте на точное попадание, чтобы посетитель не удивился, когда результатом окажется центр города, а не его улица.

Второй пример: отображение региональных цен

Тот же шаблон с кнопкой подходит для показа цен или валютного контекста с учётом региона на лендинге. Поскольку все цены указываются в EUR независимо от местоположения посетителя, такую кнопку стоит использовать для предзаполнения оценки стоимости доставки или регионального контактного номера, а не для смены отображаемой валюты. Но сам запрос тот же: одно определение IP возвращает достаточно данных, чтобы сразу заполнить город и страну.

Где это хорошо подходит

Этот подход подходит для поиска магазинов, региональных настроек контента по умолчанию и оценки стоимости доставки, где нужен только город или регион. Он не заменяет GPS-геопозицию для таких задач, как пошаговая навигация, где запрос браузера и реальное местоположение устройства действительно необходимы.

Распространённая ошибка, которой стоит избегать

Не считайте подключение через корпоративную сеть или VPN особым случаем ошибки, который нужно обрабатывать иначе, чем любой другой запрос. Эндпоинт всё равно вернёт результат, просто с центром там, где зарегистрирован адрес этой сети, а это может быть другой город или даже другая страна, чем та, где посетитель на самом деле находится. Правильная реакция та же, что и для любой оценки по IP: дайте посетителю возможность исправить результат, а не пытайтесь обнаружить VPN-трафик и специально помечать его как необычный.

Корректный запасной вариант

Если found возвращается как false, что возможно для некоторых диапазонов адресов, предложите посетителю ввести местоположение вручную, а не показывайте ошибку: весь смысл кнопки в том, чтобы избавить от этого шага, а не завести в тупик.

Стоимость функции

Каждое нажатие равно одному запросу. Кнопка, которой посетители пользуются время от времени, расходует ничтожную долю из 2 500 бесплатных запросов в день, которые входят в каждый ключ или доступны с одного адреса без ключа. Посетители с IPv4 и IPv6 обрабатываются одним и тем же вызовом, поэтому отдельная ветка кода ни для одной из версий не нужна.

Отказ от диалога разрешений меняет точность на удобство, и для многих функций, связанных с местоположением, это правильный обмен. Полный ответ эндпоинта описан в документации по определению IPv4.