我已经成功实现了 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)
我已经用谷歌搜索并搜索了很多,但没有任何解决方案。
提前致谢。