美文网首页
浏览器通讯技术:webPush

浏览器通讯技术:webPush

作者: 金牛茶馆 | 来源:发表于2019-05-29 15:04 被阅读0次

    Web推送要求从后端触发的推送消息通过 Web推送协议完成 ,如果要使用推送消息发送数据,则还必须根据Message Pushption for Web Push规范对该数据进行加密

    此模块可以轻松发送消息,还可以处理依赖GCM进行消息发送/传递的浏览器的传统支持。

    本文中主要介绍了node 的用法,如果是其他语言请参考GitHub中给出的其他案例

    安装

    npm install web-push --save
    
    

    用法

    订阅

    function subscribeUserToPush() {
      return getSWRegistration()
      .then(function(registration) {
        const subscribeOptions = {
          userVisibleOnly: true,
          applicationServerKey: urlBase64ToUint8Array(
            'BEl62iUYgUivxIkv69yViEuiBIa-Ib9-SkvMeAtA3LFgDzkrxZJjSgSnfckjBJuBkr3qBUYIHBQFLXYp5Nksh8U'
          )
        };
    
        return registration.pushManager.subscribe(subscribeOptions);
      })
      .then(function(pushSubscription) {
        console.log('Received PushSubscription: ', JSON.stringify(pushSubscription));
        return pushSubscription;
      });
    }
    

    订阅信息发给后端

    const subscriptionObject = {
      endpoint: pushSubscription.endpoint,
      keys: {
        p256dh: pushSubscription.getKeys('p256dh'),
        auth: pushSubscription.getKeys('auth')
      }
    };
    
    
    function sendSubscriptionToBackEnd(subscription) {
      return fetch('/api/save-subscription/', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify(subscription)
      })
      .then(function(response) {
        if (!response.ok) {
          throw new Error('Bad status code from server.');
        }
    
        return response.json();
      })
      .then(function(responseData) {
        if (!(responseData.data && responseData.data.success)) {
          throw new Error('Bad response from server.');
        }
      });
    }
    

    后端存储订阅信息

    app.post('/api/save-subscription/', function (req, res) {
      if (!isValidSaveRequest(req, res)) {
        return;
      }
    
      return saveSubscriptionToDatabase(req.body)
      .then(function(subscriptionId) {
        res.setHeader('Content-Type', 'application/json');
        res.send(JSON.stringify({ data: { success: true } }));
      })
      .catch(function(err) {
        res.status(500);
        res.setHeader('Content-Type', 'application/json');
        res.send(JSON.stringify({
          error: {
            id: 'unable-to-save-subscription',
            message: 'The subscription was received but we were unable to save it to our database.'
          }
        }));
      });
    });
    

    发送消息

    const webpush = require('web-push');
    
    // VAPID keys should only be generated only once.
    const vapidKeys = webpush.generateVAPIDKeys();
    
    webpush.setGCMAPIKey('<Your GCM API Key Here>');
    webpush.setVapidDetails(
      'mailto:example@yourdomain.org',
      vapidKeys.publicKey,
      vapidKeys.privateKey
    );
    
    // This is the same output of calling JSON.stringify on a PushSubscription
    const pushSubscription = {
      endpoint: '.....',
      keys: {
        auth: '.....',
        p256dh: '.....'
      }
    };
    
    webpush.sendNotification(pushSubscription, 'Your Push Payload Text');
    

    测试

    npm test
    
    • 本文作者:Jack Yao
    • 本文链接: web_push
    • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

    相关文章

      网友评论

          本文标题:浏览器通讯技术:webPush

          本文链接:https://www.haomeiwen.com/subject/xprjtctx.html