在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题

Posted

技术标签:

【中文标题】在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题【英文标题】:Problem while using getCurrentPosition geoLocation function within setInterval method for getting user current position with React-Native 【发布时间】:2018-10-01 11:40:36 【问题描述】:

目标

我需要获取用户位置的纬度和经度以显示路线上的当前位置。我使用@mapbox/react-native-mapbox-gl npm 模块通过 React-Native 实现这一目标。我需要以小频率更新acuret位置,这就是我选择setInrval方法的原因。

问题

我使用下面的函数来获取间隔的位置

watchCurrentLocation()         
  try 
    this.intervalForWatchPosition = setInterval(() => 
      console.log("Here for watch location based on Interval");
      // first try with without enableHighAccuracy
      navigator.geolocation.getCurrentPosition(
        (position) => 
          console.log("get user location with interval");
          const passengerInfo = 
              latitude: position.coords.latitude,
              longitude: position.coords.longitude
          
          this.updatePassengerCoordinates(passengerInfo);
      ,
      (error) => 
        console.log("Error while getting Current Location : ", error);
      ,
       timeout: 10000, maximumAge: 0 );
    , 3000);
   catch (err) 
    console.log("Error while current location watch : ", err);
  

这个代码snip perfectly working with android devices,但不知何故它是not working with ios。在 android 中,它完全按预期工作。它每 3 秒提供一次位置信息,我很容易在路线上更新用户。但是 iOS 设备和模拟器什么都没有发生。没有错误,也没有异常。

在 iOS 中它的触发代码但总是返回单个位置信息作为起点数据。我不知道iOS设备有什么问题。

我已经使用了watchPosition,但是它会在路线上长途旅行后返回结果。该用户从一个位置跳到另一个位置,但现在在路线上顺利导航,所以我不想使用它。这就是为什么我使用带有getCurrentPosition 方法的setInterval 方法。这适用于Android。我使用下面的代码作为 watchPosition

this._watchID = navigator.geolocation.watchPosition((position) => 
    const coord = [position.coords.longitude, position.coords.latitude];
    this.setCurrentLocationToAsync(coord);
    const passengerInfo = 
      latitude: position.coords.latitude,
      longitude: position.coords.longitude
    
    this.updatePassengerCoordinates(passengerInfo);
    ,
        enableHighAccuracy: true,
        timeout: 5000,
        maximumAge: 0,
    distanceFilter: 1
    );

我使用以下版本来实现此功能

@mapbox/react-native-mapbox-gl: 6.1.2 react-native: 0.55.4

以前有人遇到过这种问题吗?或者知道如何在 iOS 上解决它?

新更新的代码

我也尝试过使用递归方法来避免使用如下异步调用的 setInterval 方法,但它仍然无法在 iOS 上运行......!!!

watchCurrentLocation()       
    getCurrentPositionTimeoutHandle = setTimeout(() => 
      // first try with without enableHighAccuracy
        navigator.geolocation.getCurrentPosition(
          (position) => 
            console.log("get user location with setTimeout 1");
            const passengerInfo = 
                latitude: position.coords.latitude,
                longitude: position.coords.longitude
            
            this.updatePassengerCoordinates(passengerInfo);
            if (getCurrentPositionTimeoutHandle) 
              console.log("Timeout function exist so call that again 2");
              this.watchCurrentLocation();
            
        ,
        (error) => 
          console.log("Error while getting Current Location : ", error);
          //console.log("Error while executing timeout way method 3");
          this.watchCurrentLocation()
        ,
         timeout: 20000, maximumAge: 0 );
    , 3000);

希望能有办法解决。

【问题讨论】:

你有解决办法吗? 你最后做了什么?我有同样的问题。我通过将时间间隔更改为 15 秒并使用 await 来获取 getCurrentPosition 的结果,但这不是一个好的解决方案。它适用于所有浏览器和 Android,但不适用于 iOS。 【参考方案1】:

更新位置花费太多时间的原因是使用“enableHighAccuracy:true”,这会导致多次采样并且需要一段时间。将其更改为“false”可能会导致更快的更新以测试您的代码。第二件事是在模拟器中,您可能需要更改位置信息,因为您使用的是不移动的设备。

【讨论】:

我已经用enableHighAccuracy: false 进行了测试,仍然没有得到需要的正确信息。我也在移动设备上进行了测试,但同样的事情也发生在设备上。 最后一个问题,您是在内部测试还是在外部测试(可用空间)? 我没听懂你。你想知道什么? gps 的一个可能问题是,当您尝试在有遮盖的建筑物中测试信号未正确接收时,我之前遇到过这个问题并且很疯狂......但是,问题是我正在测试我的应用程序在我的房间里,所以我一出去就解决并为我工作。 这里不是你所说的情况。我知道会发生这种情况,但我在内部和外部都进行了测试。从过去 4 个月开始,我正在使用 gps 位置获取。它的工作正常,但这是完全不同的情况来处理【参考方案2】:

我假设您已经单独使用 getLocation() 进行了测试,但仍然无法获取位置?

如果是这样,请确保检查您的 Info.plist - 如果不是以下全部,您应该有 atleas:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>CHANGEME: Location Always And When In Use Usage Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Endurance requires your location to track your progress</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App requires background tracking</string>
<key>NSMotionUsageDescription</key>
<string>CHANGEME: Motion updates increase battery efficiency by intelligently toggling location-services when device is detected to be moving</string>

此外,如果您需要后台位置 - 您需要在 XCode 中启用此功能。

更新

我假设 .catch() 中没有抛出任何 javascript 错误 - 如果您没有查看 JS 控制台,请执行此操作 - 以确保您当前已捕获异常。我还假设您的console.logs() 在您获得位置之前就被打印出来了??

如果代码正常工作,那么它将在 10000 毫秒后超时 - 根据此代码(意味着异常会回来)

OP 声明绝对不会发生任何事情。如果是这种情况,那么您的权限可能是错误的。确保您在更改权限后REBUILD您的项目。

更新 2:

如果返回的位置没有被刷新,可以安全地假设设备知道它没有移动。在模拟器中,您可以尝试模拟运动。

导航到调试 -> iOS 模拟器菜单栏中的位置会显示一些用于模拟静态位置(Apple 或自定义位置)或模拟用户骑自行车、跑步或驾驶的选项。自定义位置选项可让您输入静态纬度和经度:

【讨论】:

此密钥已存在于Info.plist 文件中。我已经用背景位置进行了测试,但没有发生任何事情。我遇到了同样的问题。 之后你重建你的项目了吗? 是的,清理并重新构建。但面临同样的问题。当我简单地调用navigator.geolocation.getCurrentPosition 方法时,我得到了正确的结果,但是当我把它放在setInterval 中时,它将保留到oldre 位置信息。 getCurrentPositionwatchPosition 这两种方法都可以与不同的组件一起使用。但是当我想经常获取用户位置时,我会遇到这个问题。所以我认为目前与许可无关。 @JaydipshihVaghela - 我已经更新了我的答案,看看是否可行。

以上是关于在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

js中setTimeout和setInterval的应用方法(转)

setInterval方法怎么了?

在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题

JS中setInterval()的使用以及注意事项

JS中setInterval()的使用以及注意事项

如何启动通过setInterval方法与buttonClick一起使用的函数