Следуйте за местоположением пользователя на React Native AirBnb MapView [Android]

Я использую airbnb map для реагирования в своем приложении. Этот вопрос предназначен для приложения для Android, так как я еще не обошел приложение iOS.

Моя проблема:

navigator.geolocation отлично работает на эмуляторе, но слишком долго работает на реальных устройствах, до такой степени, что иногда это случается на более старых устройствах.

Что я заметил:

если showsUserLocation prop установлен в значение true, я могу увидеть маркер "текущей позиции" на карте до getCurrentPosition решает.

Что я хочу:

  • Я хочу, чтобы мой регион всегда был ориентирован на местоположение пользователя.
  • Я хочу либо получить доступ к родной геолокации api (должен быть быстрее?), или, может быть, кто-то скажет мне, что я делаю неправильно. Ниже приведено образец кода.
  • Я хочу по-прежнему обнаруживать местоположение пользователя даже после включения/выключения служб определения местоположения. Это поведение showsUserLocation prop, но он кажется, что когда-то ошибки watchPostion, он полностью останавливается.

Вот что я до сих пор, это очень просто:

  componentDidMount() {
    navigator.geolocation.getCurrentPosition(
      (position) => {
        console.log("getCurrentPosition Success");
        this.setState({
          region: {
            ...this.state.region,
            latitude: position.coords.latitude,
            longitude: position.coords.longitude,
          }
        });
        this.props.resetNotifications();
        this.watchPosition();
      },
      (error) => {
        this.props.displayError("Error dectecting your location");
        alert(JSON.stringify(error))
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
    );
  }

  watchPosition() {
    this.watchID = navigator.geolocation.watchPosition(
      (position) => {
        console.log("watchPosition Success");
        if(this.props.followUser){
          this.map.animateToRegion(this.newRegion(position.coords.latitude, position.coords.longitude));
        }
      },
      (error) => {
        this.props.displayError("Error dectecting your location");
      },
      {enableHighAccuracy: true, timeout: 20000, maximumAge: 1000}
    );
  }

Ответ 1

Я всегда находил watchPosition iffy между разными браузерами, одна вещь, которая работала для меня раньше, - это заменить getCurrentPosition внутри a setInterval так, чтобы она получала местоположение каждые несколько секунд, и если она терпит неудачу один раз он повторит следующий интервал, в отличие от watchPosition, который перестает смотреть, происходит ли ошибка.

В общем случае геолокация браузера не очень надежна, вы можете проверить этот поток для некоторых проблем https://github.com/facebook/react-native/issues/7495

Другая альтернатива, которая, безусловно, будет более быстрой и, возможно, более надежной, - использовать собственный API геолокации. Проверьте этот вопрос для библиотек, которые выставляют родную геолокацию для реагирования на родную локальную геолокацию Android.

Ответ 2

Не уверен, что это решит вашу проблему, но попробуйте следующее:

navigator.geolocation.getCurrentPosition(
  (position) => {
    console.log("getCurrentPosition Success");
    this.setState({
      region: {
        ...this.state.region,
        latitude: position.coords.latitude,
        longitude: position.coords.longitude,
      }
    }, () => {
      this.props.resetNotifications();
      this.watchPosition();
    });
  },