Web Application Push API
(原文见:http://www.xdarui.com/index.php/archives/111 )
本月18日W3C发布了一个新的草案《Push API》,原文见这里:http://www.w3.org/TR/push-api/ 。不才鄙陋,目前只是一知半解。下面文叔给大家分享下这份草案,当然还是建议同学们直接无视本文而直接到W3C的原文地址学习。由于只是草案,同时的随时都有可能被更新或替代或废掉,谁知道明天是什么样呢。
关于PUSH
这块的内容有两位博主已经写的很详细了,我这里直接帖出原文地址,没有相关知识背景的同学可以移步这里:1.手机Push机制 http://blog.163.com/fuhaocn@126/blog/static/36665080201204103631378/ 2.关于手机Push http://www.cnblogs.com/aspnethot/articles/2258724.html
Webapps Push
webapps是指当前很多WEB端网站已经脱离了简单的展示或表单提交之类,如Gmail这种富前端应用已经上升到了一个应用程序只是这个应用程序是在WEB端而已,主要代码由Javascript构成。好了不废话,下面咱们直接聊正题。《Push API》草案旨在为WEB前端提供处理服务器推送消息能力。Push服务与 web应用的的活跃状态无关。 Push消息可以通过多种标准的协议分发(如SSE/GSM-SMS/SIP MESSAGE/OWA PUsh),或通过特定的浏览器方法。
PUSH的工作流程与移动手机端类似:首先,程序需要产生一个唯一的 Token ,然后使用这个ID由用户显示授权同意后web程序方可与服务器建立push通道。
为了演示我就直接把W3C的示例直接搬过来了:
EXAMPLE 1
var token = getGuid(); // get GUID as unique token
var mypush = requestRemotePermission(token);
mypush.onerror = function () {
alert("darn! "+e.message);
};
mypush.onsuccess = function () {
var activate = "http://example.com/push/activate?token="+token+
"&serviceUrl="+encodeURIComponent(mypush.serviceUrl)+
"&serverProtocols="+mypush.serverProtocols;
asyncXHR(activate); // send activation request to application server
mypush.wakeup = true;
mypush.onmessage = function (event) {
document.getElementById(‘message’).innerHTML = event.data;
};
};
按草案所述navigator需要实现NavigatorPush接口,这个接口定义了 push 属性( readonly ) 。同时草案也定义了另一个接口:PushManager 。( 按草案所述应该是 window 会实现这个接口 )。PushManager提供了两个方法:
checkRemotePermission和requestRemotePermission。 使用checkRemotePermission方法可以检查当前 web应用是否已经得到了用户授权(这个过程中不需要用户操作介入),如果当前程序已经获得授权则会调用 success回调否则执行 error 回调。success回调可以返回一个PullService对象( 与调用requestRemotePermission方法所获取的一样 )。requestRemotePermission首先会通过用户代理(一般对我们来说是指浏览器了)询问用户是否授权,如果用户同意那么由程序产生的唯一Token就会成为Push服务的地址(目标服务),同时激活Push服务。下面给出的是相关的IDL定义:
[NoInterfaceObject]
interface NavigatorPush {
readonly attribute PushManager push;
};
interface PushManager {
PushService requestRemotePermission (DOMString appToken, optionalDOMString publicKey, optional DOMString algorithm);
PushService checkRemotePermission (DOMString appToken);
};
PushService接口
web程序通过PushService接口处理Push服务。它的定义如下:
interface PushService : EventTarget {
readonly attribute DOMString appToken >;
readonly attribute DOMString publicKey;
readonly attribute DOMString algorithm;
readonly attribute DOMString serviceUrl;
readonly attribute DOMString[] serverProtocols;
readonly attribute DOMError error;
attribute boolean wakeup;
attribute Function? onsuccess;
attribute Function? onerror;
attribute Function? onmessage;
void close ();
readonly attribute unsigned short readyState;
const unsigned short CONNECTING = 0;
const unsigned short OPEN = 1;
const unsigned short CLOSED = 2;
};
说明:
1.如果多个web程序产生的Token一致,那么发送到这个Token作为地址的Push消息会同时发给这几个实例。说通俗点就是如果A和B同时拿着票T去登记,那么登记处在通知T可用的时候会同时通知A和B两个。
2.为了验证Push消息的来源正确,应用服务可以对Push消息进行签名。如果这样做则PushService应当有其相对应的publicKey及algorithm (算法)。
3.Push服务与web程序是否活跃无关,同一个web程序也可以注册多个push服务。同一个web程序的多个实例也可以各自注册自己的push服务。