在 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 位置信息。
getCurrentPosition
和 watchPosition
这两种方法都可以与不同的组件一起使用。但是当我想经常获取用户位置时,我会遇到这个问题。所以我认为目前与许可无关。
@JaydipshihVaghela - 我已经更新了我的答案,看看是否可行。以上是关于在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
js中setTimeout和setInterval的应用方法(转)
在 setInterval 方法中使用 getCurrentPosition geoLocation 函数通过 React-Native 获取用户当前位置时出现问题