Интерфейс WorkerNavigator
представляет собой подмножество интерфейса Navigator, к которому разрешен доступ из Worker
< /сильный>а>. Такой объект инициализируется для каждого работника и доступен через свойство WorkerGlobalScope.navigator
, полученное вызовом window.self.navigator
.
Интерфейс Worker
API Web Workers представляет собой фоновую задачу. который может быть легко создан и может отправлять сообщения своему создателю. Создание рабочего процесса так же просто, как вызов конструктора Worker()
и указание сценария, который будет выполняться в рабочем потоке.
запуск navigator
на любой веб-странице вернет экземпляр Navigator
.
>> navigator
Navigator { permissions: Permissions, mimeTypes: MimeTypeArray, plugins: PluginArray, doNotTrack: "unspecified", maxTouchPoints: 0, mediaCapabilities: MediaCapabilities, oscpu: "Intel Mac OS X 10.13", vendor: "", vendorSub: "", productSub: "20100101" }
запуск navigator внутри приложения react-native
вернет экземпляр WorkerNavigator
. WorkerNavigator
— это фоновая задача.
>> navigator
WorkerNavigator { geolocation: Object, hardwareConcurrency: 4, appCodeName: "Mozilla", appName: "Netscape"… }
Интерфейс WorkerNavigator
не полностью совместим/проверен со всеми браузерами. , но я тестировал функциональность на эмуляторе Iphone X
, а navigator.geolocation
это defined
.

Несколько сообщений в stackoverflow жалуются на то, что Chrome
или Safari
возвращают WorkerNavigator geolocation undefined
и, как объяснено в следующем ответе
navigator.geolocation
принадлежит navigator
в Chrome
?
navigator.geolocation
принадлежит navigator
только в main thread
, но не принадлежит navigator
в worker thread
.
два навигатора имеют независимые реализации на стороне C++
. Вот почему navigator.geolocation
не поддерживается в потоке worker
.
Chromium включает отдельные интерфейсы для Navigator
и WorkerNavigator
Реализация C++.
Navigator
является атрибутом DOMWindow
, а WorkerNavigator
является атрибутом WorkerGlobalScope
.
Пользователи StackOverflow жалуются, что веб-воркер Chrome не имеет атрибута geolocation
Атрибут navigator интерфейса WorkerGlobalScope должен возвращать экземпляр интерфейса WorkerNavigator, который представляет идентификатор и состояние пользовательского агента (клиента):
[Exposed=Worker]
interface WorkerNavigator {};
WorkerNavigator includes NavigatorID;
WorkerNavigator includes NavigatorLanguage;
WorkerNavigator includes NavigatorOnLine;
WorkerNavigator includes NavigatorConcurrentHardware;
Метод geolocation
не включен в WorkerNavigation
и WorkerLocation
интерфейсы
Navigator
инициализируется для каждого рабочего процесса и доступен через свойство WorkerGlobalScope.navigator
, полученное при вызове window.self.navigator
.
как описано в WorkerNavigator
a> API docs, он не включает метод geolocation()
.
Если у вас по-прежнему возникает эта проблема, вы можете следовать этому руководству и вручную создать свой worker
и тестирование методов в разных браузерах.
navigator.permissions?
для обнаружения поддержки геолокации
WorkerNavigator.permissions
читать -only возвращает Permissions
объект, который можно использовать для запроса и обновления статуса разрешений API, на которые распространяется API разрешений.
self.permissions.query({name:'notifications'}).then(function(result) {
if (result.state === 'granted') {
showNotification();
} else if (result.state === 'prompt') {
requestNotificationPermission()
}
});
Подробнее здесь
Действия по устранению проблемы
Вы запускаете console.log
с инструментами react-native-debugger
, и, возможно, вывод будет получен из вашего браузера Mac, а не из вашего телефона. Отключите debugging
на своем эмуляторе и покажите нам вывод console.warn(navigator)
и console.warn(navigator.geolocation)
appVersion: "5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103
Safari/537.36"
Как показано на изображении ниже, console.warn(navigator)
возвращает объект WorkerNavigator
в react-native-debugger-tools
, а в эмуляторе возвращает {product:"ReactNative", "geolocation": {}}
. React-native не будет отображать console.log
внутри эмулятора.

- Вы экспериментируете с этой проблемой только на Iphone или еще и на Android?
вы неправильно импортируете объект geolocation
поверх вашего компонента?
import { navigator } from ...
Знаете ли вы, что нативная библиотека геолокации предлагает гораздо более точный API и более широкий устройства поддерживают?
- Ваша проблема связана с тем, что какой-то браузер не полностью поддерживает
WorkerNavigator
интерфейс. Вы не согласны с этим последним пунктом и можете ли вы предоставить нам некоторые доказательства того, что мы ошибаемся. React-Native
использует API браузера для запуска geolocation
в фоновом режиме. Вы можете воссоздать тот же сценарий в своем iphone emulator safari developer console
, следуя этим инструкциям, чтобы создать WorkerNavigator
экземпляр, а затем получить ваше местоположение. Вы можете продемонстрировать работу WorkerNavigator
в своих браузерах Emulator Safari/Chrome.
- Рассматривали ли вы возможность создания задачи на
w3c/geolocation-api
репозиторий? Рассматривали ли вы возможность открыть отчет об ошибке в chromium?
13.05.2019
navigator.geolocation
, но он не определен. 15.05.2019console.warn(navigator)
иconsole.warn(navigator.geolocation)
с отключенными инструментамиreact-native-debugger
. Предоставьте мне любые дополнительные отзывы, которые помогут вам решить эту проблему. Спасибо 15.05.2019