谁动了我的地理位置?

当我们谈论 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 的小问题,也有很多方法可以开发需要地理位置信息的应用程序。首先,你可以使用模拟器测试你的应用程序。模拟器中有一个不错的选项,可以让你模拟你需要的任何坐标。

Screenshot of the Firefox OS Simulator

当然,虽然模拟器非常适合开发部分和第一轮测试,但你需要在真实设备上测试你的新杰作。如果你使用的是 Linux 或 OS X(我正在为 Windows 用户开发解决方案),我们的朋友 Doug Turner 创建了一个 模拟位置提供程序,你可以将其安装在你的(已 root)手机上以进行一些测试。它可以硬编码 Firefox OS 本身 返回到你的手机的经度和纬度。你可以通过编辑项目 components 文件夹中的 MockGeolocationProvider.js 文件来更改这些坐标。当然,你可以在自己的代码中硬编码它,但你将无法看到你的代码如何处理设备返回给你的信息。

最后但同样重要的是,你还可以使用免费服务,例如 freegeoip.net。这是一个数据库,你可以使用它来检测来自 IP 地址的地理位置。它并不完美,但它是一个很好的起点,可以为用户提供更准确的位置,并且是任何应用程序的良好后备解决方案。你永远不知道什么时候 A-GPS 或 GPS 会出现问题。

使用 GPS 的应用程序最佳实践

当你构建需要地理位置的应用程序时,你需要牢记一些事项。首先,你需要考虑将要接收的结果的准确性。你需要知道的是,使用 getCurrentPosition 试图尽快返回结果:有时这意味着使用 wifi 或 IP 地址来获取结果。当使用 GPS 设备时,它可能需要几分钟才能连接到卫星,所以在这种情况下,你有两种选择

  1. 你可以通过获取 getCurrentPosition 返回的坐标的准确度(以米为单位)来获得结果的准确度(请参见下面的代码);
  2. 或者,你可以在调用 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 阅读关于这些主题和其他想法的更多内容。

更多 Frédéric Harper 的文章…

关于 Robert Nyman [荣誉编辑]

Mozilla Hacks 的技术布道师和编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客文章。Robert 坚信 HTML5 和开放网络,并从 1999 年开始参与网页前端开发工作 - 在瑞典和纽约市。他还经常在 http://robertnyman.com 上写博客,并且喜欢旅行和结识新朋友。

更多 Robert Nyman [荣誉编辑] 的文章…


5 条评论

  1. nadrimajstor

    感谢您始终需要应用程序最佳实践。

    IINM
    * GPS 不会连接到卫星 - 设备会根据接收到的信号(时间和卫星位置)计算自己的位置。它需要至少 4 颗卫星的清晰视野,而精确的计算很快就会变得非常消耗 CPU 资源。
    * 辅助 GPS 可以被视为移动网络提供商的数据传输
    * 漫游设备的地理位置可能完全错误

    2013 年 10 月 3 日 下午 5:01

    1. nadrimajstor

      哎呀…更正
      * 漫游设备的 geoIP 可能完全错误

      2013 年 10 月 3 日 下午 5:05

    2. Frédéric Harper

      关于您的第一点,您绝对正确:这就是我的意思,因此我们对它进行了更正,以防止任何误解,感谢您的指正。其他所有内容也都正确,但不是 Firefox OS 特有的:它发生在所有设备上。

      2013 年 10 月 9 日 上午 6:35

  2. servis laptopova

    你说到点子上了,我无法在我的 zte grand x 手机上获取地理位置,无论如何都无法获取。它无法修复超过一颗卫星,无论我打开触发 gps 位置传感器的应用程序多长时间,是否有任何解决方法。

    2013 年 10 月 4 日 下午 3:16

    1. Frédéric Harper

      您应该能够连接到多个卫星的信号,但它会比您预期的要长得多。目前,还没有办法解决这个问题,但正如我所说,我们正在与OEM合作,并在解决方案可用时通知您。

      2013年10月9日 下午6:37

本文评论已关闭。