这篇文章来自 Doug Turner,他是 Firefox 3.5 中地理定位支持背后的工程师之一。
位置无处不在。在撰写本文时,我正在加拿大多伦多的一家咖啡店里。如果我在 URL 地址栏中输入 google,它会根据我的 IP 地址将我带到 www.google.ca,即 Google 的加拿大版本。当我想找到离我最近的电影院时,我通常只需输入我的邮政编码。这些信息通常存储在网站上,以便下次更容易找到电影院。在这两种情况下,让 Web 应用程序自动确定我的位置都更加方便。事实上,我不知道多伦多的邮政编码是什么。我知道如何找到它,但仅仅为了告诉一个 Web 应用程序我的位置而做这么多工作,这实在太麻烦了。
Firefox 3.5 包含一个简单的 JavaScript API,允许您快速启用 Web 应用程序的地理定位功能。它允许用户选择性地与网站共享其位置,而无需输入邮政编码。接下来是关于如何在 Firefox 3.5 中使用地理定位、其工作原理以及使用地理定位时应采取的一些预防措施的概述。
基础知识
获取用户的位置非常简单
function showPosition(position) {
alert(position.coords.latitude + “ “ +
position.coords.longitude);
}
navigator.geolocation.getCurrentPosition(showPosition);
对 getCurrentPosition 的调用获取用户的当前位置并将其放入一个警告对话框中。位置以经度和纬度表示。是的,就这么简单。
当您请求这些信息时,用户会看到如下所示的通知栏
他们的选择是允许或不允许,以及是否记住。
处理错误
在您的代码中处理两种错误情况非常重要
首先,用户可以拒绝或不响应位置信息请求。API 允许您设置一个可选的错误回调。如果用户明确取消了请求,您的错误回调将被调用并带有一个错误代码。在用户没有响应的情况下,不会触发任何回调。为了处理这种情况,您应该在 getCurrentPosition 调用中包含一个超时参数,当计时器到期时,您将获得一个错误回调。
navigator.geolocation.getCurrentPosition(successCallback,
errorCallback,
{timeout:30000});
使用此代码,如果用户取消,您的 errorCallback 函数将被调用。如果 30 秒过去并且用户没有响应,它也会被调用。
其次,用户位置的准确性可能会随着时间的推移而发生很大变化。这可能出于几个原因
- 确定一个人位置的不同方法具有不同的准确度级别。
- 用户可能选择不与您共享其确切位置。
- 许多 GPS 设备的准确度有限,具体取决于天空的视野。随着时间的推移,如果您的天空视野变差,准确度也会变差。
- 许多 GPS 设备可能需要几分钟才能从非常粗略的位置变为非常具体的位置,即使天空视野良好。
这些情况可能并且将会发生,支持准确度的变化对于提供良好的用户体验非常重要。
如果要监视位置的变化,可以使用 watchPosition 回调 API
navigator.geolocation.watchPosition(showPosition);
showPosition 将在每次位置发生变化时被调用。
请注意,您还可以通过定期调用 getCurrentPosition 来监视位置的变化。但是,出于节能和性能考虑,我们建议您在可以的情况下使用 watchPosition。回调 API 通常可以节省电量,并且仅在需要时才会被调用。这将使浏览器更具响应性,尤其是在移动设备上。
有关更多信息,请查看 API 草案规范,其中包含其他可能有用的示例。
幕后
获取位置信息有几种常见的方法。最常见的是本地 WiFi 网络、IP 地址信息和连接的 GPS 设备。在 Firefox 3.5 中,我们使用本地 WiFi 网络和 IP 地址信息来尝试猜测您的位置。
有一些公司驾驶汽车四处寻找 WiFi 接入点,并记录地球上特定点处的接入点信号强度。然后他们将所有这些收集到的数据放入一个大型数据库中。然后他们拥有允许您提出“如果我看到这些接入点,我在哪里?”问题的算法。这是 Firefox 3.5 确定您位置的主要方式。
但并非每个人都有 WiFi 网卡。并非每个地方都已被扫描过 WiFi。在这种情况下,Firefox 将使用您的本地 IP 地址来尝试使用反向数据库查找确定您的位置,该查找将您的 IP 地址大致映射到一个位置。IP 推导的位置通常比 WiFi 推导的位置准确度低得多。例如,在多伦多,来自 WiFi 的位置精确到 150 米以内。使用 IP 地址相同位置大约为 25 公里。
隐私
保护用户隐私对 Mozilla 来说非常重要——这是我们核心使命的一部分。在人们在线收集的数据领域,位置信息可能特别敏感。事实上,欧盟将位置信息视为个人可识别信息 (PII),必须相应地处理(指令 95/46/EC)。我们认为用户应该严格控制何时与其网站共享其数据。这就是为什么 Firefox 在与网站共享位置信息之前会询问用户,允许用户轻松“忘记”用户已与其共享位置的所有位置,并在页面信息中显示共享设置。
Firefox 会尽其所能保护我们用户的隐私,但此外,W3C 地理定位工作组还针对网站开发人员和运营商提出了以下隐私注意事项
- 接收者必须仅在必要时请求位置信息。
- 接收者必须仅将位置信息用于提供给他们的任务。
- 接收者必须在完成该任务后处理位置信息,除非用户明确允许保留。
- 接收者还必须采取措施保护此信息免遭未经授权的访问。
- 如果存储了位置信息,则应允许用户更新和删除此信息。
- 位置信息的接收者不得在未经用户同意的情况下重新传输位置信息。重新传输时应注意谨慎,并鼓励使用 HTTPS。
- 接收者必须清楚且醒目地披露他们正在收集位置数据的事实、收集目的、数据保留时间、数据安全方式、数据共享方式(如果共享)、用户如何访问、更新和删除数据,以及用户对数据拥有的任何其他选择。此披露必须包含对上述指南的任何例外情况的解释。
显然,这些都是自愿建议,但我们希望它能成为良好网站行为的基础,用户将帮助执行这些行为。
注意事项
我们已实施了 W3C 地理定位规范 的第一个公开草案。一些小细节可能会发生变化,但我们将鼓励工作组保持向后兼容性。
我们知道的一个可能会影响您的问题是 enableHighAccuracy 可能被重命名为另一个名称,例如 useLowPower。出于兼容性考虑,Firefox 3.5 包含 enableHighAccuracy 调用,尽管它目前没有任何作用。如果调用被重命名,我们很可能会同时包含这两个版本以确保兼容性。
结论
Firefox 3.5 代表了对地理定位和大量其他标准的支持的第一步,这些标准正开始从各个工作组中脱颖而出。我们知道人们会喜欢此功能,因为它适用于地图应用程序、照片网站以及 Twitter 和 Facebook 等网站。对我们来说,最有趣的是知道人们会发现我们甚至没有想到的此功能的新用途。网络正在发生变化,位置信息在其中发挥着巨大的作用。我们很高兴能成为其中的一部分。
关于 Christopher Blizzard
一次发布,让网络变得更好。
29 条评论