原文地址:geolocation in Firefox 3.5
系列地址:颠覆网络35天
====================================
这篇文章作者为Doug Turner,负责Firefox 3.5中地理定位功能的工程师之一。
地理位置信息正在逐渐包围我们。在写这篇文章的时候,我正坐在加拿大多伦多的一家咖啡店中。如果我在地址栏中输入Google,他会自动的把根据我的IP地址定位到www.google.ca──Google的加拿大网站。当我希望找到离我最近的电影院时,我通常就会输入邮政编码以便搜索。这些信息通常会被网站存储以便之后再也不用输入。在上面这两种情景中,如果网络应用能够自动判断出我所在的位置,那会是多大的便利阿!事实上,我根本不知道多伦多的邮政编码是什么。我知道怎么找到邮政编码,但是每次我都要去找。
Firefox 3.5包括了一个简单的JavaScript的API,允许你快速的为您的站点添加地理位置感知的能力。他允许用户可以选择的为网站提供地理定位信息而不用再去填写什么邮政编码了。接下来为大家介绍的就是如何在Firefox 3.5中使用地理定位功能,包括他是如何工作的,也包括在使用地理定位功能时需要注意的事项。
基础知识
获取用户的地理定位信息非常容易:
function showPosition(position) {
alert(position.coords.latitude + “ “ +
position.coords.longitude);
}
navigator.geolocation.getCurrentPosition(showPosition);
上面的代码中调用getCurrentPosition以获得用户的当前位置,然后使用alert对话框显示出来。 位置数据使用经度和维度来表示。是的,就这么简单。
不过,当你要求上述地理位置信息时,用户会看到如下的一个通知栏:

在这个通知栏上,用户可以选择是否允许提供地理位置信息和记住用户的选择。
错误处理
在代码中需要处理两种错误情况,这非常重要:
首先,用户可能会拒绝或者根本没有回应“提供地理定位信息”的要求。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),必须要按照相关(Directive 95/46/EC)规定来处理。我们相信用户在共享这些数据时应该拥有非常严格的控制权利。这也是为什么Firefox会在同网站分享这些数据之前向用户 提出询问。
Firefox尽全力保护用户隐私数据,此外,W3C地理定位工作组也对网站开发人员和运营人员提出了一些附加的考量:
- 数据接收方只有在必须的时候才能要求地理定位信息。
- 数据接收方只有在提供相关功能时候使用这些地理定位数据。
- 数据接收方必须在任务完成之后销毁数据,除非用户明确表示可以保留。
- 数据接收方必须采取措施保护这些数据,避免未经授权的访问。
- 如果定位信息被存储了,用户应该被允许去更新和删除这些信息。
- 定位信息的接收方不能在没有用户同意的情况下重新传输。在重新传输时必须谨慎,尽量使用HTTPS方式传输。
- 数据接收方必须清楚明确的说明收集这些定位数据的意图、数据保留的时间、数据如何被安全保护、如果分享的话数据使用什么方式分享、用户如何访问更新和删除数据等等。一旦有与上述各条原则冲突的地方,都应该在说明文档中详细列出。
当然,这些都是非强制性的建议,但是我们希望他能够帮助我们共同构建更好的网络站点。
特别注意
我们的实现依据W3C地理定位规范的提案。一些细节在将来可能还会改变,但是我们会鼓励工作组保持向后兼容性。
我们目前知道可能会对您造成影响的唯一问题是enableHighAccuracy可能会被重新命名,比如命名为useLowPower。Firefox 3.5由于兼容性的原因,提供了enableHighAccuracy调用,不过现在该调用什么都不做。如果调用被重新命名的话,我们可能会同时包括两个名字。
结论
Firefox 3.5在支持地理定位方面迈出了第一步,现在有越来越多不同的工作组开始讨论相关的规范。我们知道用户会喜欢在地图应用、照片站点以及类似于 Twitter和Facebook的站点中使用这个特性。最让我们感兴趣的是人们会为这个找到更有想象力的使用方法,可能是我们做梦都梦不到的方式。互联网正在发生变化,地理定位数据在这里发挥重大作用。我们很高兴能够参与其中。