Интерфейс WorkerNavigator
представляет собой подмножество интерфейса навигатора, доступ к которому разрешен из 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" }
Запущенный навигатор внутри приложения 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
Атрибут навигатора интерфейса 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
.
, как описано в API WorkerNavigator
, в него не входит метод geolocation()
.
Если у вас по-прежнему возникает эта проблема, вы можете подумать о том, чтобы следовать этому руководству, вручную создать worker
и протестировать методы в разных браузерах.
navigator.permissions?
для обнаружения поддержки геолокации
Свойство WorkerNavigator.permissions
только для чтения возвращает объект 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 Safari developer console
, следуя этим инструкциям, создайте WorkerNavigator
экземпляр и затем получите ваше местоположение. Вы можете продемонстрировать работу WorkerNavigator
в браузерах Emulator Safari / Chrome.
- Рассматривали ли вы вопрос на
w3c/geolocation-api
хранилище? Рассматривали ли вы открытие
сообщение об ошибке в хроме ?