摘要
规范定义了脚本方式访问主机地理位置信息的API。
安全和隐私
因为地理位置信息涉及到个人隐私问题,所以API规范的者,为保护用户隐藏,应提供一种机制,由用户确认地理位置信息是否可通过此API访问。
API描述
script 以编程的方式使用Geolocation 对象,确定设备地理位置信息。
[NoInterfaceObject]
interface NavigatorGeolocation {
readonly attribute Geolocation geolocation;
};
Navigator implements NavigatorGeolocation;
[NoInterfaceObject]
interface Geolocation {
void getCurrentPosition(PositionCallback successCallback,
optional PositionErrorCallback errorCallback,
optional PositionOptions options);
long watchPosition(PositionCallback successCallback,
optional PositionErrorCallback errorCallback,
optional PositionOptions options);
void clearWatch(long watchId);
};
callback PositionCallback = void (Position position);
callback PositionErrorCallback = void (PositionError positionError);
getCurrentPosition()方法接收一个,两个,或者三个参数。调用时,它立即返回,并且通过异步的方式,尝试访问设备的当前位置信息。如果成功,successCallback被调用,传递参数为Position对象,Position表示当前设备的地理位置信息。如果失败,errorCallback 被调用,传递参数为PositionError对象,PositionError表示失败的原因。
实现getCurrentPosition方法需要执行如下步骤:
1. 运行前执行检查
(1)如果指定PositionOptions,并且maximumAge属性被定义为一个非负整数,使用这个值决定maximumAge是否可用。如果maximunAge被定义为负整数,设置maximunAge为0。
(2)如果指定PositionOptions,并且timeout属性被定义为一个非负整数,使用这个值决定timeout是否可用。如果timeout被定义为负整数,设置timeout为0。如果timeout未定义,设置timeout为无限大。
(3)如果指定PositionOptions,并且enableHighAccuracy属性被定义为一个非负整数,使用这个值决定enableHighAccuracy是否可用。其余情况,设置enableHighAccuracy为false。
2. 如果缓存Position对象,它的时长大于 maximumAge 变量,调用successCallback时使用缓存的Position对象作为参数,函数结束。
3. 如果timeout设置为0,调用errorCallback并传递PositionError对象,它的code属性被设置为TIMEOUT,函数结束
4. 开始位置获取操作(登台,通过调用特定于平台的API),有可能会使用到enableHighAccuracy变量。
5. 启动time事件,若超过timeout时长,则回调errorCallback方法。函数退出。
6. 如果调用成功,回调successCallback方法。函数退出。
7. 如果在超时前获取地理位置信息失败,则回调errorCallback,参数PositionError的code属性为POSITION_UNAVAILABLE。
watchPosition()方法需要一个,两个或三个参数。在调用时,必须立即返回一个long值唯一标识表操作,然后异步启动获取位置操作。此操作必须首先尝试该设备取得当前的位置。如果尝试成功,successCallback被调用(即,必须调用回调对象的handleEvent操作),参数为一个新的位置对象,反映设备的当前位置。如果尝试失败,必须调用errorCallback,参数为一个新的PositionError对象,反映失败的原因。获取位置操作,然后必须继续监控设备的位置,并调用相应的回调,每次这个位置的变化。获取位置操作必须继续,直到用相应标识符作为参数调用clearWatch方法。
实现watchPosition方法需要执行如下步骤:
1. 运行前执行检查
(1)如果指定PositionOptions,并且maximumAge属性被定义为一个非负整数,使用这个值决定maximumAge是否可用。如果maximunAge被定义为负整数,设置maximunAge为0。
(2)如果指定PositionOptions,并且timeout属性被定义为一个非负整数,使用这个值决定timeout是否可用。如果timeout被定义为负整数,设置timeout为0。如果timeout未定义,设置timeout为无限大。
(3)如果指定PositionOptions,并且enableHighAccuracy属性被定义为一个非负整数,使用这个值决定enableHighAccuracy是否可用。其余情况,设置enableHighAccuracy为false。
2. 如果缓存Position对象,它的时长大于 maximumAge 变量,调用successCallback时使用缓存的Position对象作为参数,函数结束。
3. 注册监听事件,查看是否设备的位置已经更新(如wifi或者蜂窝信号发生变化)
4. 开始位置获取操作(登台,通过调用特定于平台的API),有可能会使用到enableHighAccuracy变量。
5. 运行如下步骤:
(1)如果记时器未运行,启动一个定时器的超时变量的值表示数毫秒后触发。当定时器触发,调用(如果存在)errorCallback,传递一个新的PositionError对象,它的code属性被设置的TIMEOUT,然后跳到步骤6.
(2)如果该位置采集操作成功产生一个新的位置,在超时到期前,执行以下步骤:
取消挂起的计时器。需要注意的是:必需重新启动定时器,该算法一次跳回到采集步骤的开始。
如果新的位置与先前的位置不同,调用successCallback并传递新的位置对象,它反映位置收集的结果。这一步可能会受到回调频率的限制。
(3)否则,如果在超时前获取地理位置信息失败,则回调errorCallback,参数PositionError的code属性为POSITION_UNAVAILABLE。这一步可能会受到回调频率的限制。
6. 等等接收系统事件,当接收到这样的事件跳回上述步骤。
clearWatch()方法需要一个参数。在调用时,必须先检查的给予watchId的参数值。如果这个值不对应任何先前启动的守护进程,那么该方法必须立即返回,不采取任何进一步的行动。否则,由watchId参数确定收集位置的进程必须立即停止,不进行有进一步的回调。
另附一篇文章:
HTML5 Geolocation规范提供了一套保护用户隐私的机制