为什么我的Service Worker的推送事件数据/有效负载为空?

时间:2017-02-21 18:38:43

标签: javascript json google-cloud-messaging http-post firebase-cloud-messaging

我已尝试多次尝试在Chrome中使用桌面通知,但我没有找到单一的文档来源,其中包含逐步过程以使桌面通知正常工作。我遇到的每种资源都是过时的或与其他资源不一致。

我面临的问题是:一旦服务工作者收到${body ? `con.setDoOutput(true); DataOutputStream wr = new DataOutputStream(con.getOutputStream()); wr.writeBytes(${JSON.stringify(body)}); wr.flush(); wr.close();` : ``} int responseCode = con.getResponseCode(); 事件,

push

self.addEventListener('push', function (event) { console.log(event); event.waitUntil( self.registration.showNotification( event.data.title, { body: event.data.body, icon: event.data.icon, tag: event.data.tag })); }); 为空。我希望它有一个我在POST请求中作为JSON发送的数据,如下所示:

event.data

奇怪的是注册脚本获得了一个看起来像POST https://fcm.googleapis.com/fcm/send HTTP/1.1 Content-Type: application/json Authorization: key=<FCM Server Key here> { "data": { "title": "Foo", "body": "Bar" }, "to": "<recipient ID here>" } 的“订阅端点”,但是我不能让POST通过,除非我按照网上的其他示例说明将收件人ID作为我发送的JSON中的https://android.googleapis.com/gcm/<recipient ID here>字段。

在我遇到的所有示例中,有多个POST正在进行POST调用:

to

我已经尝试了所有这三项,每次尝试都会在API地址的末尾(例如https://fcm.googleapis.com/fcm/send https://android.googleapis.com/gcm/send https://gcm-http.googleapis.com/gcm/send )和JSON正文中包含收件人。我的目标是获得 Foo 和我发送到服务工作者的https://fcm.googleapis.com/fcm/send/<recipient ID here>方法的数据 Bar

为什么self.registration.showNotification(为空?任何人都可以从头到尾指向一个完整的指南,它支持FCM而不是GCM吗?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可能需要查看documentation

中的以下声明
  

目前在Chrome中实施Push API的一个缺点是,您无法通过推送消息发送任何数据。不,没什么。这样做的原因是,在将来的实现中,有效载荷数据必须在服务器上发送到推送消息传递端点之前进行加密。这样,端点,无论是什么推送提供者,都将无法轻松查看推送消息的内容。这还可以防止其他漏洞,例如HTTPS证书验证不当以及服务器和推送提供程序之间的中间人攻击。但是,目前还不支持此加密,因此在此期间您需要执行提取以获取填充通知所需的信息。

进一步阅读,您可能希望尝试使用fetch()从API获取数据,将响应转换为对象并使用它来填充通知。在此相关的SO post中也使用了相同的方法。

除此之外,您可能还需要检查thread中@Indici Indici的响应,其中他说push事件不包含数据值;相反,它包含不同的事件,其中包含信息。以下示例代码是作为可能的解决方法提供的,用于在“推送”事件中接收Firebase服务工作者的通知:

self.addEventListener('push', function(event) {
  if (event.data) {
    const dataText = event.data.text();
    notificationTitle = 'Custom Notification';
    notificationOptions.body = 'Message: ' + `${dataText}`;
    var title = event.data.notification.title;
    var message = event.data.notification.message;
    var icon = event.data.notification.icon;
    var notificationTag = event.data.notification.tag;
  }
}

答案 1 :(得分:0)

对于接收数据需要:

self.addEventListener('push', function(event) {
var jsonData = JSON.parse(event.data.text());
// jsonData -> here is you data 
const options = {
    body: 'set you body',
    icon: 'img/apple-icon-120x120.png',
    badge: 'img/apple-icon-120x120.png'
};
event.waitUntil(self.registration.showNotification(jsonData.data.title, options)); 
});