WedX - журнал о программировании и компьютерных науках

navigator.geolocation React-Native не определен

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: https://dpaste.com/2W9Y57E Info.plist: https://dpaste.com/1CTG8GP



Ответы:


1

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

Совместимость Worker Navigator с браузерами

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

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

Действия по устранению проблемы

  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 внутри эмулятора.

введите здесь описание изображения

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

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

  4. Ваша проблема связана с тем, что какой-то браузер не полностью поддерживает WorkerNavigator интерфейс. Вы не согласны с этим последним пунктом и можете ли вы предоставить нам некоторые доказательства того, что мы ошибаемся. React-Native использует API браузера для запуска geolocation в фоновом режиме. Вы можете воссоздать тот же сценарий в своем iphone emulator safari developer console, следуя этим инструкциям, чтобы создать WorkerNavigator экземпляр, а затем получить ваше местоположение. Вы можете продемонстрировать работу WorkerNavigator в своих браузерах Emulator Safari/Chrome.
  5. Рассматривали ли вы возможность создания задачи на w3c/geolocation-api репозиторий? Рассматривали ли вы возможность открыть отчет об ошибке в chromium?
13.05.2019
  • Итак, как мне это исправить? Я просто хочу использовать navigator.geolocation, но он не определен. 15.05.2019
  • @TIMEX Я обновил свой пост главой Шаги по устранению проблемы, я хотел бы увидеть вывод console.warn(navigator) и console.warn(navigator.geolocation) с отключенными инструментами react-native-debugger. Предоставьте мне любые дополнительные отзывы, которые помогут вам решить эту проблему. Спасибо 15.05.2019

  • 2

    Ничего из того, что сказал другой парень, явно не могло решить мою проблему. По крайней мере для меня, что я использую RN 0.60, я обнаружил, что они извлекли его (как и многие другие пакеты) во внешний пакет. Я думал об этом, конечно, учитывая решения о так называемом "бережливом ядре", но в rn docs ничего не было написано о извлечении местоположения.

    Итак, это пакет, и здесь вы найдете новое руководство по его настройке: https://github.com/react-native-community/react-native-geolocation

    Не знаю, недоступно ли оно и в 0.59.

    29.07.2019
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    © 2024 wedx.ru, WedX - журнал о программировании и компьютерных науках
    Для любых предложений по сайту: [email protected]