在React Native AirBnb的MapView [Android]上关注用户位置

时间:2016-12-02 10:15:02

标签: android google-maps reactjs react-native geolocation

我正在使用airbnb's map在我的应用上使用react-native。这个问题适用于Android应用程序,因为我还没有绕过iOS应用程序。

我的问题:

navigator.geolocation在模拟器上运行良好,但在实际设备上运行时间过长,有时会在旧设备上超时。

我注意到了什么:

如果showsUserLocation道具设为true,我可以在getCurrentPosition结算前的地图上看到原生“当前位置”标记。

我想要的是什么:

  1. 我希望我的区域始终以用户的位置为中心。
  2. 我想要一种方法来访问原生地理位置api(应该是 更快?),或者有人告诉我我做错了什么。下边是 代码示例。
  3. 即使在打开/关闭位置服务之后,我仍希望能够检测用户的位置。这是showsUserLocation道具的行为,但似乎一旦watchPostion错误,它就会完全停止。
  4. 到目前为止,这是我所拥有的,它非常简单:

      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}
        );
      }
    

2 个答案:

答案 0 :(得分:5)

我总是在不同浏览器之间找到watchPosition iffy,之前对我有用的一件事就是用getCurrentPosition内的setInterval替换它,这样它每隔几秒钟就会得到一个位置,如果它失败一旦它将重试下一个间隔,不像watchPosition停止观察是否发生错误。

通常浏览器地理定位不是很可靠,您可以查看此主题以解决某些问题https://github.com/facebook/react-native/issues/7495

另一种肯定会更快,也许更可靠的替代方案是使用原生地理定位API。对于公开本地地理定位以反应原生React-native Android geolocation

的库,请检查此问题

答案 1 :(得分:0)

不确定这是否可以解决您的问题,但请尝试以下方法:

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();
    });
  },