Cordova 地理定位精度上限为 10 米
Cordova geolocation accuracy gets capped at 10 meters
更新:这是一个 Google Play 服务问题,已在内部报告 here,将从版本 13.4.0
开始修复
我们使用 cordova gelocation plugin 和带有选项 enableHighAccuracy: true
的方法 navigator.geolocation.watchPosition()
来跟踪用户位置并获得最准确的结果。
我们的应用程序已经推出 1 年多了,我们过去没有遇到任何设备获得非常好的定位精度的问题,在室外和天空晴朗时为 4/6 米。
最近,我们的许多用户报告说,无论他们做什么,都无法获得低于 10m 的精度。
我们决定自己测试一下,发现有同样的问题。最初,我们认为我们在最新版本中引入了一些错误,我们对所有内容进行了三重检查,但我们没有对涉及地理定位的 code/dependencies 进行任何更改。
我们也测试了我们应用程序的旧版本,我们确信可以达到 4m 的精度,但令人惊讶的是它们也不起作用,精度上限为 10m。
我们尝试了不同版本的 Android,我们可以在从 5 (Lollipop) 到 8 (Oreo) 的任何平台上重现该问题。我们在 iOS 10/11 也遇到了同样的问题。同样,我们已经几个月没有更新应用程序了。
最近有一个关于同一问题的问题:
其他人在使用 Android 本机代码时遇到同样的问题
有人知道这是怎么回事吗?是权限问题吗?定位服务也设置为高精度。
为了完整起见,我们可以使用此 plugin
的旧版本 (2.x) 获得 3/4 米的精度
这是唯一的出路吗?
我们宁愿不为那些开箱即用的东西引入额外的依赖。
非常感谢
查看源代码:
旧插件(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;
},
在旧插件代码中 enableHighAccuracy 是由(arg1 of array)设置的布尔值。
使用新版本的插件,您需要将 arg 作为 JSON 传递并设置该标志:{enableHighAccuracy: true} 以重现对 [=30= 的相同调用]geo.watchPosition函数准确率高
旧方法:
navigator.geolocation.watchPosition(geolocationSuccess,
geolocationError,
[false,true]);
新方式:
navigator.geolocation.watchPosition(geolocationSuccess,
geolocationError,
{ enableHighAccuracy: true });
这是一个 Google Play 服务问题,已在内部报告 here,将从 13.4.0 版开始修复
更新:更新到Play Services 14.3.66后解决,精度再次下降到4m!
更新:这是一个 Google Play 服务问题,已在内部报告 here,将从版本 13.4.0
开始修复我们使用 cordova gelocation plugin 和带有选项 enableHighAccuracy: true
的方法 navigator.geolocation.watchPosition()
来跟踪用户位置并获得最准确的结果。
我们的应用程序已经推出 1 年多了,我们过去没有遇到任何设备获得非常好的定位精度的问题,在室外和天空晴朗时为 4/6 米。
最近,我们的许多用户报告说,无论他们做什么,都无法获得低于 10m 的精度。
我们决定自己测试一下,发现有同样的问题。最初,我们认为我们在最新版本中引入了一些错误,我们对所有内容进行了三重检查,但我们没有对涉及地理定位的 code/dependencies 进行任何更改。
我们也测试了我们应用程序的旧版本,我们确信可以达到 4m 的精度,但令人惊讶的是它们也不起作用,精度上限为 10m。
我们尝试了不同版本的 Android,我们可以在从 5 (Lollipop) 到 8 (Oreo) 的任何平台上重现该问题。我们在 iOS 10/11 也遇到了同样的问题。同样,我们已经几个月没有更新应用程序了。
最近有一个关于同一问题的问题
其他人在使用 Android 本机代码时遇到同样的问题
有人知道这是怎么回事吗?是权限问题吗?定位服务也设置为高精度。
为了完整起见,我们可以使用此 plugin
的旧版本 (2.x) 获得 3/4 米的精度这是唯一的出路吗?
我们宁愿不为那些开箱即用的东西引入额外的依赖。
非常感谢
查看源代码:
旧插件(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;
},
在旧插件代码中 enableHighAccuracy 是由(arg1 of array)设置的布尔值。
使用新版本的插件,您需要将 arg 作为 JSON 传递并设置该标志:{enableHighAccuracy: true} 以重现对 [=30= 的相同调用]geo.watchPosition函数准确率高
旧方法:
navigator.geolocation.watchPosition(geolocationSuccess,
geolocationError,
[false,true]);
新方式:
navigator.geolocation.watchPosition(geolocationSuccess,
geolocationError,
{ enableHighAccuracy: true });
这是一个 Google Play 服务问题,已在内部报告 here,将从 13.4.0 版开始修复
更新:更新到Play Services 14.3.66后解决,精度再次下降到4m!