首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用django-推送通知实现web客户端?

如何用django-推送通知实现web客户端?
EN

Stack Overflow用户
提问于 2019-05-20 08:36:10
回答 1查看 621关注 0票数 0

我已经成功地使用django-push-notifications实现了APNS。我发现这种依赖正在成长,并且也有一个Web Push Notifications。我试过跟踪给定的代码,但无法看到registation_id。我得到了

代码语言:javascript
复制
Uncaught (in promise) DOMException` 
index.html?_ijt=f2lo8aqelnrfm7g1266vtapp67:1 

为了避免错误,我给chrome设置了一个参数给loadVersionBrowser()

代码语言:javascript
复制
Uncaught TypeError: Cannot read property 'match' of undefined

这是我的当前文件

代码语言:javascript
复制
<html>
<script>
// Utils functions:
function urlBase64ToUint8Array (base64String) {
        var padding = '='.repeat((4 - base64String.length % 4) % 4)
        var base64 = (base64String + padding)
                .replace(/\-/g, '+')
                .replace(/_/g, '/')

        var rawData = window.atob(base64)
        var outputArray = new Uint8Array(rawData.length)

        for (var i = 0; i < rawData.length; ++i) {
                outputArray[i] = rawData.charCodeAt(i)
        }
        return outputArray;
}
function loadVersionBrowser (userAgent) {
        var ua = userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
        if (/trident/i.test(M[1])) {
                tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
                return {name: 'IE', version: (tem[1] || '')};
        }
        if (M[1] === 'Chrome') {
                tem = ua.match(/\bOPR\/(\d+)/);
                if (tem != null) {
                        return {name: 'Opera', version: tem[1]};
                }
        }
        M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
        if ((tem = ua.match(/version\/(\d+)/i)) != null) {
                M.splice(1, 1, tem[1]);
        }
        return {
                name: M[0],
                version: M[1]
        };
};
var applicationServerKey = "BHZZKYSonkdaKjxjgw7DKYO45PmetHY7jprxWn4K4gfZSxUuvyQRe1LegYKoKJzv8qhi5HiIO4wjn6SP9Gg1ftk";
// In your ready listener
if ('serviceWorker' in navigator) {
  // The service worker has to store in the root of the app
  // http://stackoverflow.com/questions/29874068/navigator-serviceworker-is-never-ready
  var browser = loadVersionBrowser('chrome');
  navigator.serviceWorker.register('navigatorPush.service.js?version=1.0.0').then(function (reg) {
    reg.pushManager.subscribe({
      userVisibleOnly: true,
      applicationServerKey: urlBase64ToUint8Array(applicationServerKey)
    }).then(function (sub) {
      var endpointParts = sub.endpoint.split('/');
      var registration_id = endpointParts[endpointParts.length - 1];
      var data = {
        'browser': browser.name.toUpperCase(),
        'p256dh': btoa(String.fromCharCode.apply(null, new Uint8Array(sub.getKey('p256dh')))),
        'auth': btoa(String.fromCharCode.apply(null, new Uint8Array(sub.getKey('auth')))),
        'name': 'XXXXX',
        'registration_id': registration_id
      };
      console.log(data);
    })
  }).catch(function (err) {
    console.log(':^(', err);
  });
}
</script>
Hello
</html>

问题:

  1. 我哪里错了?
  2. Web Push Notification Gateway默认使用FCM吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-20 13:04:52

这一行:

代码语言:javascript
复制
var ua = userAgent, tem, M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

很奇怪。考虑将其转换为如下内容:

代码语言:javascript
复制
var ua = userAgent;
var tem;
var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];

不能在声明变量的同一语句中使用变量。

至于第二个问题,网络推送通知(我认为)将使用防火墙的铬,以及任何其他提供商放松其他浏览器。这是由django推送通知模块处理的,您不必担心它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56217113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档