4

我已经成功实现了 GCM 和 ServiceWorkers 来接收推送通知。

我的问题

每当有 SOS 更新时,我都会向gcm-http发送 HTTP 请求,然后在 Google Chrome 上显示正常通知,但没有任何有效负载或数据。

根据Google Developers Doc,chrome 无法接收有效负载/数据,因此必须在触发推送事件时手动从后端获取通知。

因此,为了获取数据,我在后端(在 django 中)请求一个 url 来向我发送通知数据。但问题出在这里,我如何知道我必须从我的数据库/模型发送哪些通知数据?

注意:- 我没有维护不同的database table/model方式来确定客户端读取的通知,因为它不需要SOS更新和已读/未读。

不起作用的解决方法:-

我可以在客户端的浏览器上设置一个 cookie,并且在后端可以获得下一个通知(下面是代码)

class GetSOSNotification(View):
    notif_id = 0

    def get(self, request):
        if 'last_notif_id' in request.COOKIES:
            notif_id = request.COOKIES.get('last_notif_id') + 1
            sos = SOSUpdate.objects.get(id=notif_id)
        else:
            sos = SOSUpdate.objects.order_by('-timestamp').filter()[0]
            notif_id = sos.id

        data = dict()
        data['notification'] = dict()
        if sos.get_condition_display() and sos.get_subject_display():
            data['notification']['title'] = sos.polling_station.name + " " + sos.get_subject_display() + " " + sos.get_condition_display()
        elif sos.get_condition_display():
            data['notification']['title'] = sos.polling_station.name + " " + sos.get_condition_display()
        elif sos.get_subject_display():
            data['notification']['title'] = sos.polling_station.name + " " + sos.get_subject_display()
        else:
            data['notification']['title'] = sos.polling_station.name + " SOS Alert!"

        if sos.message:
            data['notification']['message'] = sos.message
        else:
            data['notification']['message'] = "Please click here to check the details."

        data['notification']['notif_id'] = notif_id

        return JsonResponse(data)

但是,我必须返回 JSON 响应,因此我无法从服务器端设置 cookie,因此我计划data['notification']['notif_id']在客户端(即 Javascript)上使用来设置 cookie。

我的SW.js的片段看起来像:

self.addEventListener('push', function(event) {
  console.log('Push message', event);
  event.waitUntil(
    fetch("//localhost/get_sos_notification/").then(function(response){
        if(response.status!=200){
            console.log('Looks like there was a problem. Status Code: ' + response.status);
            throw new Error();
        }
        return response.json().then(function(data){
            if(data.error || !data.notification){
                console.error('The API returned an error.', data.error);
                throw new Error();
            }
            var title = data.notification.title;
            var message = data.notification.message;
            var icon = '//localhost/static/main/images/push-notification.png';
            var notificationTag = data.notification.tag;
            return self.registration.showNotification(title, {
              body: message,
              icon: icon,
              tag: notificationTag
            });
        });
    }).catch(function(err){
       console.log('Unable to retrieve data', err);
       var title = 'SOS - Update';
       var message = 'We were unable to get the information, please click here to know the real message.';
       var icon = '//localhost/static/main/images/push-notification.png';
       var notificationTag = 'notification-error';
       return self.registration.showNotification(title, {
           body: message,
           icon: icon,
           tag: notificationTag
       });
    })
  );
});

但是我无法document.cookie = last_notif_id=data.notification.notif_id在我处理收到的通知数据的地方做(如果成功收到),因为 JS 脚本给出了错误Unable to retrieve data ReferenceError: document is not defined at http://localhost/static/main/js/sw.js

附加信息: //localhost/get_sos_notification/是 GET 请求,返回 JSON,并映射到class GetSOSNotification(View)

我已经用谷歌搜索并搜索了很多,但没有任何解决方案。

提前致谢。

4

0 回答 0