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服务。

      

原文地址:https://www.cnblogs.com/darrel/p/2765560.html