GetCurrentPosition в JS не работает на iOS

У меня есть страница, содержащая код, который получает текущее местоположение с устройства и загружает другие данные в зависимости от местоположения с помощью этого кода:

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(successFunction);
} else {
    // Make API call to the GeoIP services
}

Он работает на всех устройствах Android, которые я тестировал, но на iOS и macOS не работает. Ни if, ни else. Похоже, он застрял в получении текущего местоположения.

Любая помощь?

Отобразите ошибку, и вы узнаете, что происходит -> Смотретьnavigator.geolocation.getCurrentPosition(success, error, options);

Grzegorz T. 21.07.2019 09:26

@The Rock, ваш сайт обслуживается через https?

Viacheslav Moskalenko 28.07.2019 23:13

Нет, это в основном на localhost, а промежуточный сервер не поддерживает https. Я тестировал на рабочем сервере, и он работал как есть.

user11701404 29.07.2019 07:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
3
9 856
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

GeoLocation работает только в том случае, если пользователь предоставляет свои разрешения.

Убедитесь, что это так.

Это демо CodePen был протестирован в симуляторе iOS с Safari и успешно показал широту и долготу.

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
};

function log(data) {
  const tag = document.createElement('p');
  tag.textContent = data;
  document.body.appendChild(tag);
}

function success(pos) {
  var crd = pos.coords;
  console.info('Successfully determined a user position:', crd);

  log('Your current position is:');
  log(`Latitude : ${crd.latitude}`);
  log(`Longitude: ${crd.longitude}`);
  log(`More or less ${crd.accuracy} meters.`);
}

function error(err) {
  console.warn(`ERROR(${err.code}): ${err.message}`);
}

navigator.geolocation.getCurrentPosition(success, error, options);

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

Убедитесь, что пользователю будет предложено разрешение: support.google.com/chrome/answer/….

Viacheslav Moskalenko 27.07.2019 07:00

Предоставленный вами фрагмент кода не работает в сафари macOS, вероятно, из-за той же проблемы, что и исходный вопрос. Показано это: ОШИБКА (2): у Origin нет разрешения на использование службы геолокации.

Mojtaba Hosseini 27.07.2019 22:16

Скорее всего. В моем случае пользователю выдается подсказка: «Веб-сайт «s.codepen.io» хотел бы использовать ваше текущее местоположение». При выборе «Разрешить» отображаются текущие координаты. Дважды проверьте, установлен ли флажок «Включить службы определения местоположения» в меню «Настройки» -> «Безопасность и конфиденциальность» -> «Службы определения местоположения». Не забудьте поставить соответствующий флажок рядом с Safari в списке приложений, которым разрешено определять ваше местоположение.

Viacheslav Moskalenko 27.07.2019 23:02

Спасибо за ваше время и усилия, я уже использовал ваш код, и, как я уже сказал, разрешение не подошло. Даже в этом фрагменте кода. Моя проблема была о https, которую упомянул @MojtabaHosseini.

user11701404 29.07.2019 07:46
Ответ принят как подходящий

iOS и macOS не сообщают вам местоположение пользователя, если они не разрешают это или, если система не может вам доверять. Так:

- Первый (Возможно, ваш ответ)

Он работает с тем кодом, который вы предоставили ТОЛЬКО ЕСЛИ, который хост (также известный как источник) использует https. Это причина того, что предупреждение о разрешении не появляется из-за вашего комментария к ответу ниже.

Помните, что если вы не используете https, он зависнет примерно на минуту, а затем вернет ошибку о сбое аутентификации. Используйте ошибка, чтобы проверить, что:

navigator.geolocation.getCurrentPosition(success, error, options)

Он скажет вам что-то вроде этого:

[blocked] Access to geolocation was blocked over insecure connection to http://example.com.

Наконечник: Вы можете обновить страницу после запроса местоположения, чтобы пропустить процесс ожидания. Но не забудьте проверить опцию Сохранить журнал в инспекторе.

- Второй:

Если вы используете https, проверьте настройки своего местоположения для Safari, которые могли быть каким-то образом отключены. Вы можете изменить их здесь: «Настройки» > «Конфиденциальность» > «Службы определения местоположения» > «Safari». Это не опция по умолчанию, но, возможно, вы случайно изменили ее. Так что не беспокойтесь о пользователях, если это было проблемой. И если вы используете Chrome или любой другой сторонний браузер, зайдите в его настройки и проверьте доступ к местоположению. Его там нет по умолчанию, и он появляется только в том случае, если местоположение требуется хотя бы один раз.

- В третьих:

Если вы собираетесь загрузить свой веб-файл внутри приложения с помощью webView, обязательно добавьте описания разрешений местоположения в файл инфо.plist. Добавьте NSLocationWhenInUseUsageDescription против NSLocationAlwaysUsageDescription против NSLocationUsageDescription по мере необходимости.

Для полноты картины на iOS13 вы не можете получить разрешение always. Но дело не в этом, а в том, что вы должны получить необходимые разрешения когда-нибудь до вам нужно получить местоположение от GPS, иначе он вообще не будет работать.

Ты прав! Это было из-за https, и наконечник помог мне получить сообщение об ошибке. Но как я могу проверить это на своей машине? Локальный хост не является https.

user11701404 29.07.2019 07:43

Это другой вопрос. Вы можете выполнить поиск здесь

Mojtaba Hosseini 29.07.2019 09:44

Раздел «Второй» выше работал для меня. Убедитесь, что включены не только службы определения местоположения в целом. Но также убедитесь, что он включен специально для Safari (как упоминалось выше). Спасибо!

Andrew 10.01.2021 00:01

Я только что столкнулся с той же проблемой. Простой ответ — попросить пользователя дать разрешение вашему браузеру в

Settings > Privacy > Location Services.

Вам нужно проверить три вещи

Вот что вам нужно проверить, чтобы понять, почему ваша процедура не имеет доступа к местоположению пользователя. Ваш код должен обеспечивать следующие три вещи:

  1. В Операционная система пользователя включены службы определения местоположения.
  2. браузер пользователя поддерживает проверку служб определения местоположения.
  3. Браузер пользователя имеет службы определения местоположения включено.

Объединив ответы на странице и одну дополнительную проверку, мы можем обработать все три этих сценария:

    /* Set up getCurrentPosition options with a timeout */
    const navigatorLocationOptions = {
      enableHighAccuracy: true,
      timeout: 5000,
      maximumAge: 0
    };

    /* Determine browser permissions status */
    navigator.permissions.query({name:'geolocation'})
      .then((result) => {
        /* result.state will be 'granted', 'denied', or 'error' */
        if (result.state === 'granted') {
          navigator.geolocation.getCurrentPosition(pos => {
             console.info('Retrieved user location', pos);
             /* Got the location! Write your successful code here. */            

          }, (error) => {
            /* System/OS location services disabled */
            console.info('System/OS services disabled', navigator);
            noLocationFound();
          }, navigatorLocationOptions);

        } else {
          /* Browser location services disabled or error */
          console.info('Browser location services disabled', navigator);
          noLocationFound();
        }
      }, (error) => {
        /* Browser doesn't support querying for permissions */
        console.info('Browser permissions services unavailable', navigator);
        noLocationFound()
      }
    );
    
    /* Handle no location found */
    function noLocationFound() {
      /* Write code here to handle: user location is unavailable */
    }

Просто добавьте свой код обработки для уведомления пользователя и отката в функцию noLocationFound().

Другие вопросы по теме