Разрешения браузера

Работа с геолокационными возможностями в JavaScript-части HERE Maps API тесно связана с моделью разрешений браузера и политиками безопасности современных веб-платформ. Доступ к координатам устройства не предоставляется автоматически: он требует явного согласия пользователя и выполнения ряда условий, определённых спецификациями W3C Geolocation API и политиками безопасного контекста.

Большинство браузеров разрешают работу с геолокацией только в secure context, то есть на страницах, загруженных по HTTPS или через localhost. При попытке обращения к геолокации с HTTP-страницы API либо возвращает ошибку, либо полностью блокирует запрос.

Для приложений, использующих HERE Maps API, это критично, поскольку значительная часть функциональности (позиционирование карты, трекинг пользователя, маршрутизация от текущей точки) зависит от координат устройства.

Браузерная модель безопасности разделяет:

  • контекст страницы (secure / insecure);
  • состояние разрешения (prompt, granted, denied);
  • доступ к сенсорным данным устройства.

Любая попытка доступа к координатам инициирует цепочку проверки всех трёх уровней.

Основной механизм: Geolocation API

В основе работы лежит объект navigator.geolocation, предоставляющий три ключевых метода:

  • getCurrentPosition
  • watchPosition
  • clearWatch

Каждый вызов сопровождается проверкой разрешений. Типичный запрос выглядит так:

navigator.geolocation.getCurrentPosition(
  (position) => {
    const lat = position.coords.latitude;
    const lng = position.coords.longitude;
  },
  (error) => {
    console.error(error);
  },
  {
    enableHighAccuracy: true,
    timeout: 10000,
    maximumAge: 0
  }
);

Перед выполнением callback-функции браузер проверяет, было ли уже предоставлено разрешение или требуется запрос пользователю.

Состояния разрешений

Современные браузеры реализуют модель Permission API, в которой геолокация может находиться в одном из состояний:

  • granted — доступ разрешён;
  • denied — доступ заблокирован;
  • prompt — требуется запрос у пользователя.

Проверка состояния выполняется через:

navigator.permissions.query({ name: 'geolocation' })
  .then((result) => {
    console.log(result.state);
  });

При интеграции с HERE Maps API важно учитывать, что переход состояния из prompt в denied часто является необратимым без изменения настроек браузера пользователем.

Инициализация карты и зависимость от разрешений

В приложениях на базе HERE Maps API геолокация обычно используется для:

  • центрирования карты на текущем положении;
  • отображения маркера пользователя;
  • построения маршрутов от текущей точки;
  • обновления позиции в реальном времени.

Пример логики инициализации:

navigator.geolocation.getCurrentPosition((position) => {
  const coords = {
    lat: position.coords.latitude,
    lng: position.coords.longitude
  };

  const map = new H.Map(
    document.getElementById('map'),
    defaultLayers.vector.normal.map,
    {
      center: coords,
      zoom: 14
    }
  );
});

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

Поведение при отказе в разрешении

Если пользователь отклоняет запрос, браузер переводит состояние в denied, и повторные запросы обычно не вызывают диалог подтверждения.

Код ошибки error.code принимает значения:

  • 1 — PERMISSION_DENIED;
  • 2 — POSITION_UNAVAILABLE;
  • 3 — TIMEOUT.

Наиболее критичным является PERMISSION_DENIED, так как он блокирует дальнейшую работу с геопозицией до изменения настроек вручную.

В контексте HERE Maps API это означает деградацию функциональности: карта остаётся доступной, но теряет персонализацию и трекинг.

watchPosition и постоянное отслеживание

Для приложений навигации используется метод:

const watchId = navigator.geolocation.watchPosition(
  (position) => {
    updateUserMarker(position.coords);
  },
  (error) => {
    handleError(error);
  },
  {
    enableHighAccuracy: true
  }
);

Он требует постоянного разрешения и может быть автоматически приостановлен браузером при:

  • сворачивании вкладки;
  • отсутствии пользовательской активности;
  • ограничениях энергопотребления (особенно на мобильных устройствах).

Очистка выполняется через:

navigator.geolocation.clearWatch(watchId);

Поведение в iframe и сторонних контекстах

Если HERE Maps API используется внутри iframe, дополнительно применяются политики:

  • Permissions-Policy (ранее Feature Policy);
  • sandbox-ограничения iframe;
  • ограничения third-party cookies в некоторых браузерах.

Пример заголовка, разрешающего геолокацию:

Permissions-Policy: geolocation=(self)

Без этого разрешения запросы из iframe будут автоматически отклоняться независимо от пользовательского выбора.

Особенности мобильных браузеров

На мобильных устройствах поведение геолокации может отличаться:

  • iOS Safari требует активного взаимодействия пользователя перед запросом;
  • Android Chrome может кешировать разрешения между сессиями;
  • некоторые встроенные браузеры (in-app webviews) полностью блокируют API.

Это влияет на стабильность работы HERE Maps API в гибридных приложениях и требует предусмотреть альтернативные источники координат.

Обработка отсутствия геолокации

Если доступ к геопозиции невозможен, применяется альтернативная стратегия:

  • использование координат по умолчанию;
  • определение региона по IP;
  • выбор города пользователем вручную.

Такая логика должна быть встроена в инициализацию карты до создания объекта Map, чтобы избежать неконсистентного состояния интерфейса.

Безопасность и приватность

Браузеры рассматривают геолокацию как чувствительные данные. Поэтому:

  • запрос всегда инициируется только через пользовательское действие или при первом обращении API;
  • координаты не сохраняются браузером без явного разрешения;
  • доступ может быть ограничен системными настройками ОС.

Для приложений, использующих HERE Maps API, это означает необходимость строгого контроля момента запроса: слишком ранний вызов приводит к отказу пользователя, слишком поздний — к деградации UX.

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