无法在“notificationclick”事件中为 chrome 加载 GCM 推送通知的数据 URL

Posted

技术标签:

【中文标题】无法在“notificationclick”事件中为 chrome 加载 GCM 推送通知的数据 URL【英文标题】:Not able to load data URL for GCM push notification for chrome in 'notificationclick' event 【发布时间】:2015-12-15 11:16:49 【问题描述】:

在为 Chrome 开发 GCM 推送通知时,我设置了当服务工作人员收到 GCM 推送事件时的推送通知。

我正在发起服务呼叫。该服务返回一个数据对象,其中我有一个 URL,我想在用户单击通知时打开该 URL

这是我到目前为止的代码。

Var urlOpen = null;
self.addEventListener('push', function(event) 
    event.waitUntil(
        fetch(serviceLink).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) 
                console.log(data);
                var title = data.title;
                var body = data.desc;
                var icon = data.image;
                var tag = 'notification tag';
                urlOpen = data.clickUrl;


              return  self.registration.showNotification(title, 
                    body: body,
                    icon: icon,
                    tag: tag
                )
            );
        )
    );
);


self.addEventListener('notificationclick', function(event) 
        event.waitUntil(
        clients.openWindow(urlOpen).then(function ()
         event.notification.close();));

);

这工作正常,但有时在某些设备通知上。但是当点击通知时,它会在浏览器的网址栏中打开null

我做错了什么?

【问题讨论】:

【参考方案1】:

您不能指望您的 Service Worker 存在于 push 事件和 notificationclick 事件之间。浏览器很可能会在处理完push 事件后关闭worker,然后为notificationclick 事件重新启动它,这意味着您的urlOpen 变量已重新初始化为null

我认为您可能可以以某种方式将 url 存储在通知对象本身上,这将是最好的 - 看起来有 an example of that here。否则,您必须将其保存到 indexedDB 或类似的东西。

【讨论】:

谢谢布伦丹!!我已将 url 存储在 notification.data 中,现在工作正常 您好,示例 URL 无效。但是我已经尝试过你的建议。我会分享结果。 现在好像在这里:github.com/gauntface/simple-push-demo/blob/master/src/…

以上是关于无法在“notificationclick”事件中为 chrome 加载 GCM 推送通知的数据 URL的主要内容,如果未能解决你的问题,请参考以下文章

远程通知不会触发notificationclick

服务工作者“notificationclick”未触发

Push web api,notificationclick,如何打开桌面客户端而不是打开新的浏览器客户端

通知点击事件服务工作者

ElementScrolled 事件没有被 CdkScrollable 和 mat-side-nav 触发

服务工作者 - 等待client.openWindow在postMessage之前完成