django-push-notifications和Service Worker

时间:2016-10-23 19:28:21

标签: google-cloud-messaging service-worker web-push django-push-notifications

我一直在修改django-push-notifications,然后是google tutorial

我当前的状态是一个似乎工作并注册并要求通知权限等的网站。我正在浏览./manage.py runserver并使用localhost:8000。服务工作者目前正在工作(如预期的那样?)。当我执行device.send_message("Hello world")(通过push_notification模块)时,我可以看到我在Javascript应用程序中收到event。目前正在使用Chrome进行测试,我计划针对Android进行定制。

无论我尝试什么,event.data始终是Null。我已尝试为extra方法发送常规消息,结构化消息和关键字参数send_message,但没有运气。

我认为我错过了什么?

我正在运行的片段(不完整,但不确定相关内容)

# Trigger push notifications
device = GCMDevice.objects.all()
device.send_message(<some data here>, extra=<some data here>)

关于服务工作者中的Javascript:

self.addEventListener('push', function(event) {
    console.log('Push message', event);

    var data = {};
    if (event.data) {
        data = event.data.json();
    }
    console.log('Push data', data);
    ...

关于设置和注册:

navigator.serviceWorker.register('/sw.js').then(function () {
    return navigator.serviceWorker.ready;
}).then(function (serviceWorkerRegistration) {
    return serviceWorkerRegistration.pushManager.subscribe({userVisibleOnly: true})
}).then(function (pushSubscription) {
    // Last part of the URL is indeed the Registration ID for the GCM
    var reg_id = pushSubscription.endpoint.split('/').pop();
    console.log('Subscribed! Endpoint:', reg_id);

    // Send the registration_id, which is the only required field
    return $http({
        method: "POST",
        url: "{% url 'api:gcmdevice-list' %}",
        data: {registration_id: reg_id}
    });
}).catch(function (error) {
    console.log('Service Worker Error:', error);
});

将信息从Django传输到通知的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

似乎django-push-notifications的实现支持web推送加密,这是将信息从服务器发送到客户端所必需的(根据google还有mozilla)。

这意味着我要么改为另一个实现(如@Salva建议的django-webpush),要么在django-push-notifications添加对此的支持。

老实说,我认为这就是问题所在,但我并不完全确定。

编辑:第三个选项,使用pywebpush滚动自己。鉴于我已经有了JS的东西,它并没有那么难。如果我不得不重新开始,也许我会更接近django-webpush