静止不动时,Apache Cordova geolocation.watchPosition() 在 iOS 上超时

Posted

技术标签:

【中文标题】静止不动时,Apache Cordova geolocation.watchPosition() 在 iOS 上超时【英文标题】:Apache Cordova geolocation.watchPosition() times out on iOS when standing still 【发布时间】:2015-06-22 20:40:28 【问题描述】:

在使用 Apache Cordova 的 cordova-plugin-geolocation 时,特别是使用 watchPosition() 时,我至少在 ios 8.1.3 到 8.3 上遇到了困难。正在发生的事情是,当用户移动时,坐标工作得很好并且不断更新。但是,当用户停止片刻(例如设置的超时)时,会引发超时错误。用户再次移动的第二个坐标正在工作。

我们不能将超时时间增加太多,因为担心用户会合法地失去接收并不得不重新重新记录他们的字段边界(农业应用程序)。也就是说,我们将超时增加到 65000 并且仍然设法获得超时消息。

我目前的工作理论是,无论出于何种原因,如果没有检测到移动,那么插件就会抛出超时消息,而不是可能一遍又一遍地给我相同的坐标。我不确定这可能是某种节电功能还是 iOS 和/或插件的实际错误。

geoWatch = window.navigator.geolocation.watchPosition(
    gpsChangeCoordinates,
    function(error)
        $("#signal").html("Error: "+error.message);
        $("#signal").css("background-color","red");
    ,
    maximumAge:3000, timeout:15000, enableHighAccuracy:true);
);

切换到 getCurrentPosition() 也是无效的,因为除非不断轮询 GPS,否则精度不会达到并保持在农业用途所需的水平。

android 上不会出现此问题。

【问题讨论】:

【参考方案1】:

解决方法是直接修改CDVLocation.m,去掉distanceFilter。或者更具体地说:

if (enableHighAccurary) 
    // snipped
    // self.locationManager.distanceFilter = 5;// original, causes problems standing still
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    //snipped
 else 

从代码中的 cmets 来看,这是一个以省电名义的有意识决定,仅在用户移动 5 米或更多米时才发送更新。这对我的用例来说是个问题。

【讨论】:

感谢您的发现!这个插件做出的有意识的决定真的很糟糕。是的,运行高精度会更快地耗尽电池,但这应该由开发人员来处理,而不是插件恕我直言。 非常感谢!!你救了我!

以上是关于静止不动时,Apache Cordova geolocation.watchPosition() 在 iOS 上超时的主要内容,如果未能解决你的问题,请参考以下文章

cartographer当机器人不动时,同时收到landmark,如何解决定位问题?

在运行时更改融合位置优先级

unity 2017.1 播放后画面静止不动的原因是?谢谢!

CoreMotion框架--加速计和陀螺仪

PHP版本,微信扫码支付native模式二,扫码支付成功,页面静止不动,怎么可以支付回调URL?

我电脑CPU的使用率突然达到100%静止不动,程序运行缓慢这是为啥?