Навигатор React-Native не определен - PullRequest
6 голосов
/ 05 мая 2019

console.log(navigator.geolocation) //undefined

console.log(navigator):

WorkerNavigator {hardwareConcurrency: 8, appCodeName: "Mozilla", appName: "Netscape", appVersion: "5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKi…L, like Gecko) Chrome/73.0.3683.103 Safari/537.36", …}
appCodeName: "Mozilla"
appName: "Netscape"
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"
connection: NetworkInformation {onchange: null, effectiveType: "4g", rtt: 100, downlink: 4.3, saveData: false}
deviceMemory: 8
hardwareConcurrency: 8
language: "en-US"
languages: (3) ["en-US", "en", "es"]
locks: LockManager {}
onLine: true
permissions: Permissions {}
platform: "MacIntel"
product: (...)
storage: StorageManager {}
usb: USB {onconnect: null, ondisconnect: null}
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
get product: ƒ getValue()
set product: ƒ setValue(newValue)
__proto__: WorkerNavigator

Я использую React Native 0.59 на iOS.

В info.plist у меня есть оба: Privacy - Location When In Use Usage Description и Privacy - Location Always and When In Use Usage Description

CocoaPods: http://dpaste.com/2W9Y57E Info.plist: http://dpaste.com/1CTG8GP

1 Ответ

5 голосов
/ 13 мая 2019

Интерфейс 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.

Worker Navigator Compatability with Browsers

Несколько сообщений в 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()
  }
});

Подробнее здесь

Шаги к Устранение неполадок Проблема

  1. Вы используете 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 внутри эмулятора.

enter image description here

  1. Вы экспериментируете с этой проблемой только на Iphone или также на Android?
  2. вы неправильно импортировали объект geolocation поверх вашего компонент?

    import { navigator } from ...
    
  3. Знаете ли вы, что нативная геолокация библиотека предлагает гораздо более точный API и более широкую поддержку устройств?

  4. Ваша проблема, кажется, не полностью связана с каким-либо браузером поддержка интерфейса WorkerNavigator. Выне согласны с этим последним пунктом, и не могли бы вы предоставить нам некоторые доказательства того, что мы не правы React-Native использует API браузера для запуска geolocation на заднем плане. Вы можете воссоздать тот же сценарий в вашем эмуляторе iPhone Safari developer console, следуя этим инструкциям, создайте WorkerNavigator экземпляр и затем получите ваше местоположение. Вы можете продемонстрировать работу WorkerNavigator в браузерах Emulator Safari / Chrome.
  5. Рассматривали ли вы вопрос на w3c/geolocation-api хранилище? Рассматривали ли вы открытие сообщение об ошибке в хроме ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...