У меня есть страница, содержащая код, который получает текущее местоположение с устройства и загружает другие данные в зависимости от местоположения с помощью этого кода:
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(successFunction);
} else {
// Make API call to the GeoIP services
}
Он работает на всех устройствах Android, которые я тестировал, но на iOS и macOS не работает. Ни if, ни else. Похоже, он застрял в получении текущего местоположения.
Любая помощь?
@The Rock, ваш сайт обслуживается через https?
Нет, это в основном на localhost, а промежуточный сервер не поддерживает https. Я тестировал на рабочем сервере, и он работал как есть.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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/….
Предоставленный вами фрагмент кода не работает в сафари macOS, вероятно, из-за той же проблемы, что и исходный вопрос. Показано это: ОШИБКА (2): у Origin нет разрешения на использование службы геолокации.
Скорее всего. В моем случае пользователю выдается подсказка: «Веб-сайт «s.codepen.io» хотел бы использовать ваше текущее местоположение». При выборе «Разрешить» отображаются текущие координаты. Дважды проверьте, установлен ли флажок «Включить службы определения местоположения» в меню «Настройки» -> «Безопасность и конфиденциальность» -> «Службы определения местоположения». Не забудьте поставить соответствующий флажок рядом с Safari в списке приложений, которым разрешено определять ваше местоположение.
Спасибо за ваше время и усилия, я уже использовал ваш код, и, как я уже сказал, разрешение не подошло. Даже в этом фрагменте кода. Моя проблема была о https, которую упомянул @MojtabaHosseini.
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.
Это другой вопрос. Вы можете выполнить поиск здесь
Раздел «Второй» выше работал для меня. Убедитесь, что включены не только службы определения местоположения в целом. Но также убедитесь, что он включен специально для Safari (как упоминалось выше). Спасибо!
Я только что столкнулся с той же проблемой. Простой ответ — попросить пользователя дать разрешение вашему браузеру в
Settings > Privacy > Location Services.
Вам нужно проверить три вещи
Вот что вам нужно проверить, чтобы понять, почему ваша процедура не имеет доступа к местоположению пользователя. Ваш код должен обеспечивать следующие три вещи:
Объединив ответы на странице и одну дополнительную проверку, мы можем обработать все три этих сценария:
/* 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().
Отобразите ошибку, и вы узнаете, что происходит -> Смотреть
navigator.geolocation.getCurrentPosition(success, error, options);