科尔多瓦地理定位精度上限为 10 米

Posted

技术标签:

【中文标题】科尔多瓦地理定位精度上限为 10 米【英文标题】:Cordova geolocation accuracy gets capped at 10 meters 【发布时间】:2018-08-27 03:48:22 【问题描述】:

更新:这是一个 Google Play 服务问题,内部报告 here,将从版本 13.4.0 开始修复

我们使用cordova gelocation plugin 和navigator.geolocation.watchPosition() 方法和enableHighAccuracy: true 选项来跟踪用户位置并获得最准确的结果。

我们的应用程序已经存在 1 年多了,过去我们可以毫无问题地使用任何设备来获得非常好的定位精度,户外时 4/6 米,天空晴朗。

最近,我们的许多用户报告说,无论他们做什么,都无法获得低于 10m 的精度。

我们决定自己测试它,我们发现有同样的问题。最初,我们认为我们在最新版本中引入了一些错误,我们对所有内容进行了三次检查,但我们没有对涉及地理位置的代码/依赖项进行任何更改。

我们还测试了我们应用的旧版本,我们确信可以达到 4m 的精度,但令人惊讶的是它们也不起作用,精度上限为 10m。

我们尝试了不同版本的 android,我们可以在从 5(棒棒糖)到 8(奥利奥)的任何平台上重现该问题。我们在 ios 10/11 上也有同样的问题。同样,我们已经有几个月没有更新该应用了。

最近有一个关于同一问题的问题here:

其他人在使用 Android 原生代码 here 时遇到了同样的问题

有人知道发生了什么吗?是权限问题吗?定位服务也设置为高精度。

为了完整起见,我们可以使用 plugin 的旧版本 (2.x) 获得 3/4 米的精度

这是唯一的出路吗?

我们宁愿不为开箱即用的运行良好的东西引入额外的依赖项。

非常感谢

【问题讨论】:

@tnt-rox 你是说手机中的接收器质量不好,所以一段时间后准确率会突然被限制在10.0? @tnt-rox 我们过去在几乎所有的测试设备上都能达到 4 米,现在无论我如何尝试,我都无法低于 10m,甚至在我的像素 2 上也是如此。 没错,这表明它根本不是硬件问题。但相反,这是一个软件问题。 @tnt-rox @tnt-rox 在飞行模式下也是如此 @Mirko 您是否以某种方式找到了解决此问题的方法?我的意思是你有什么其他方法可以让 10m 变得更好吗? 【参考方案1】:

看源码:

旧插件(2.x)Source:

  watchPosition: function(success, error, args) 
    var win = function() 
        var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
        geo.watchPosition(success, error, 
            enableHighAccuracy: args[1]
        );
    ;
    exec(win, error, "Geolocation", "getPermission", []);
,

新插件(主)Source:

watchPosition: function(success, error, args) 
    var pluginWatchId = utils.createUUID();

    var win = function() 
        var geo = cordova.require('cordova/modulemapper').getOriginalSymbol(window, 'navigator.geolocation');
        pluginToNativeWatchMap[pluginWatchId] = geo.watchPosition(success, error, args);
    ;

    var fail = function() 
        if (error) 
            error(new PositionError(PositionError.PERMISSION_DENIED, 'Illegal Access'));
        
    ;
    exec(win, fail, "Geolocation", "getPermission", []);

    return pluginWatchId;
,

在 OLD 插件代码中,enableHighAccuracy 是由 (arg1 of array) 设置的布尔值。

使用新版本的插件,您需要将 arg 作为 JSON 传递并设置该标志:enableHighAccuracy: true 以重现对 geo.watchPosition 函数的相同调用准确性。

老路:

navigator.geolocation.watchPosition(geolocationSuccess,
                                                  geolocationError,
                                                  [false,true]);

新方式:

navigator.geolocation.watchPosition(geolocationSuccess,
                                                  geolocationError,
                                                   enableHighAccuracy: true );

【讨论】:

我们一直用新的方式 然后尝试根本不设置 highAccuracy,以重现对 geo 的相同调用。在旧版本 2.x 中,实际上没有设置新版本的调用精度。【参考方案2】:

它可能会担心,这是一个 Google Play 服务问题,内部报告 here,将从版本 13.4.0 开始修复

更新:更新至 Play Services 14.3.66 后解决,精度再次降至 4m!

【讨论】:

以上是关于科尔多瓦地理定位精度上限为 10 米的主要内容,如果未能解决你的问题,请参考以下文章

科尔多瓦地理定位不准确

Javascript 地理定位到 10 米以内

iPhone 上的 HTML5 地理定位问题

科尔多瓦后台地理定位支持,一段时间后没有应用程序终止

科尔多瓦地理定位错误的坐标

地理定位不适用于科尔多瓦