当我们谈论 Firefox OS 时,我们经常遇到的问题之一是:“某些设备上的 GPS 怎么样?”你可能已经注意到,在某些设备上,GPS 位置并不完全准确,或者即使你在户外,也可能需要很长时间才能报告位置。让我先解释一下它的工作原理。之后,我们将看看目前的问题是什么,以及作为开发人员,我们如何继续施展我们的魔法,并使用地理位置创建很棒的应用程序。
设备如何为你提供地理位置
大多数智能手机使用两种技术来帮助你获取手机的经度和纬度:GPS 本身,以及称为 A-GPS(辅助 GPS)服务器。当你在户外时,GPS 会连接到卫星信号,并获取设备的坐标:经度和纬度。只要 GPS 能够连接到卫星,它就能正常工作,但可能需要一些时间才能实现这一点,或者提供更准确的坐标。
为了帮助设备更快地实现目标,你通常会从 A-GPS 服务器获取位置:这就是为什么大多数情况下,你首先会获得一个距离你大约 50 米的位置,如果你多等一会儿,你就会获得更准确的位置。这也是为什么当你使用专用 GPS 设备(例如你用于远足或寻宝的设备)时,它需要更长时间:它们只使用 GPS,并且需要连接到更多的卫星,没有辅助 GPS 连接。
Firefox OS 呢?
Mozilla 不会提供任何 Firefox OS 镜像;我们向芯片制造商和 Geeksphone 等 OEM 提供源代码。这些方自定义了各个部分,并为设备创建了二进制镜像。最终的 Firefox OS 镜像主要代表我们在公共源代码存储库中的内容,但也有一些修改。这是一个重要的区别,因为一些部分(如 Linux 配置、设备设置等)不在 Mozilla 的控制范围内。
考虑到这一点,一些设备的 A-GPS 配置存在问题。我们正在积极与 OEM 合作解决这个问题,但这不是我们自己可以解决的。一旦针对具有 A-GPS 问题的特定设备解决了问题,我们将在本博客上通知你有关修复设备的步骤。
但我需要我的应用程序使用地理位置
即使存在 A-GPS 的小问题,也有很多方法可以开发需要地理位置信息的应用程序。首先,你可以使用模拟器测试你的应用程序。模拟器中有一个不错的选项,可以让你模拟你需要的任何坐标。
当然,虽然模拟器非常适合开发部分和第一轮测试,但你需要在真实设备上测试你的新杰作。如果你使用的是 Linux 或 OS X(我正在为 Windows 用户开发解决方案),我们的朋友 Doug Turner 创建了一个 模拟位置提供程序,你可以将其安装在你的(已 root)手机上以进行一些测试。它可以硬编码 Firefox OS 本身 返回到你的手机的经度和纬度。你可以通过编辑项目 components
文件夹中的 MockGeolocationProvider.js
文件来更改这些坐标。当然,你可以在自己的代码中硬编码它,但你将无法看到你的代码如何处理设备返回给你的信息。
最后但同样重要的是,你还可以使用免费服务,例如 freegeoip.net。这是一个数据库,你可以使用它来检测来自 IP 地址的地理位置。它并不完美,但它是一个很好的起点,可以为用户提供更准确的位置,并且是任何应用程序的良好后备解决方案。你永远不知道什么时候 A-GPS 或 GPS 会出现问题。
使用 GPS 的应用程序最佳实践
当你构建需要地理位置的应用程序时,你需要牢记一些事项。首先,你需要考虑将要接收的结果的准确性。你需要知道的是,使用 getCurrentPosition
试图尽快返回结果:有时这意味着使用 wifi 或 IP 地址来获取结果。当使用 GPS 设备时,它可能需要几分钟才能连接到卫星,所以在这种情况下,你有两种选择
- 你可以通过获取
getCurrentPosition
返回的坐标的准确度(以米为单位)来获得结果的准确度(请参见下面的代码); - 或者,你可以在调用
getCurrentPosition
时定义一个HighAccuracy
选项(请参见下面的代码)。
var options = {
enableHighAccuracy: true,
timeout: 5000,
maximumAge: 0
};
function success(pos) {
var crd = pos.coords;
console.log('Your current position is:');
console.log('Latitude : ' + crd.latitude);
console.log('Longitude: ' + crd.longitude);
console.log('More or less ' + crd.accuracy + ' meters.');
};
function error(err) {
console.warn('ERROR(' + err.code + '): ' + err.message);
};
navigator.geolocation.getCurrentPosition(success, error, options);
你还需要考虑用户可能会移动,因此你需要定期重新估计用户的坐标,具体取决于你要实现的目标。你可以手动执行此操作,也可以使用 Firefox OS 中的 watchPosition
方法。
var watchID = navigator.geolocation.watchPosition(function(position) {
do_something(position.coords.latitude, position.coords.longitude);
});
在这种情况下,如果位置发生变化(无论是由于设备移动还是由于更准确的地理位置信息到达),你的函数将被调用,并且你将能够处理新信息。
如果你想了解更多关于如何在应用程序中使用地理位置的信息,你始终可以查看 Mozilla 开发者网络关于 使用地理位置 的文档。如果你有任何关于如何在 Firefox OS 应用程序中使用地理位置的问题,请在评论部分留言。
关于 Frédéric Harper
作为 Mozilla 的高级技术布道师,Fred 热衷于分享他对开放网络的热情,并帮助开发人员在 Firefox OS 上取得成功。经验丰富的演讲者,t 恤爱好者,长期博客作者,热情的拥抱者,以及 HTML5 爱好者,Fred 住在蒙特利尔,并说 Frenglish。始终关注独角兽和地精的重要性,你可以在 outofcomfortzone.net 阅读关于这些主题和其他想法的更多内容。
关于 Robert Nyman [荣誉编辑]
Mozilla Hacks 的技术布道师和编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客文章。Robert 坚信 HTML5 和开放网络,并从 1999 年开始参与网页前端开发工作 - 在瑞典和纽约市。他还经常在 http://robertnyman.com 上写博客,并且喜欢旅行和结识新朋友。
5 条评论