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

Posted

技术标签:

【中文标题】为啥我的 Service Worker 的推送事件数据/有效负载为空?【英文标题】:Why is my Service Worker's push event data/payload null?为什么我的 Service Worker 的推送事件数据/有效负载为空? 【发布时间】:2017-02-21 18:38:43 【问题描述】:

我已多次尝试让桌面通知在 Chrome 中工作,但我没有找到一个文档来源,其中包含让桌面通知正常工作的分步过程。我遇到的每个资源要么已过时,要么与其他资源不一致。

我面临的问题是:一旦Service Worker收到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
            ));
);

event.data 为空。我希望它有我在这样的 POST 请求中作为 JSON 发送的数据:

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>"

奇怪的是注册脚本获得了一个看起来像https://android.googleapis.com/gcm/&lt;recipient ID here&gt; 的“订阅端点”,但我无法让 POST 通过,除非我按照网络上的其他示例将收件人 ID 设置为 @我发送的 JSON 中的 987654326@ 字段。

在我遇到的所有示例中,有多个 URL 被 POST 调用:

https://fcm.googleapis.com/fcm/send
https://android.googleapis.com/gcm/send
https://gcm-http.googleapis.com/gcm/send

我已经尝试了所有这三个,每次尝试都将收件人放在 API 地址的末尾(例如 https://fcm.googleapis.com/fcm/send/&lt;recipient ID here&gt; 或者在 JSON 正文中。我的目标是获得 Foo从我发送到服务人员的self.registration.showNotification( 方法的数据中删除

为什么event.data 为空?谁能指出我从头到尾的完整指南,它有利于 FCM 而不是 GCM?任何帮助将不胜感激。

【问题讨论】:

您好……找到答案了吗? 我遇到了同样的问题。你搞清楚了吗? 您好,找到答案了吗? 【参考方案1】:

您可能想检查documentation中的以下声明,

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

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

除此之外,您可能还想检查@Indici Indici 在thread 中的响应,其中他声明推送事件不包含数据值;相反,它包含包含信息的不同事件。以下是提供的示例代码,作为在“推送”事件中在 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;
  


【讨论】:

如果数据不是来自任何 API 而只是 firebase 发送请求正文怎么办?和@Conner Harkness 提到data 为空,那么他为什么需要if (event.data) 条件?【参考方案2】:

对于接收数据需要:

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)); 
);

【讨论】:

以上是关于为啥我的 Service Worker 的推送事件数据/有效负载为空?的主要内容,如果未能解决你的问题,请参考以下文章

Service-Worker addEventListener,如何使用事件参数?

service-worker 可以停止 GCM api 发送的推送通知吗?

Service Worker 文件离线事件

Service worker 简介

Service worker 简介

Service Worker 与 Web Worker