Firebase-NotificationClick事件未接收到有效负载

时间:2018-07-20 18:13:42

标签: firebase push-notification push service-worker

我在这个问题上苦苦挣扎了一个多星期……我们已经通过使用Firebase和Service Worker在Chrome中实现了推送消息。一切正常,使用有效负载正确发送和接收消息。在服务工作者上,我们处理推送消息以显示通知,并处理notifyclick事件以在单击时将用户发送到特定URL,然后关闭通知。

问题出在“旧”通知上:如果用户收到一条消息,但没有立即单击该消息,则该消息会保留一段时间,然后过一段时间(不确定多少),他会单击该通知-重定向到https://[domain]/firebase-messaging-sw.js 我们已经跟踪了整个过程:正确地接收了所有信息的通知(URL也正确,实际上,如果他在收到消息时单击右键,就可以正常工作)。但是,如果该通知在其中停留了一段时间,则会“清空”。

要发送的消息非常简单(仅用于显示没有TTL,也没有使用过期参数)。 curl命令如下所示:

curl -X POST 
    -H "Authorization: key=[SERVER API KEY]"
    -H "Content-Type: application/json"
    -d '{
    "notification":{
        "click_action":"[URL to be redirected]",
        "icon":"[A custom image]",
        "title":"[News title]"},
        "to":"/topics/[A topic]"
    }' 
"https://fcm.googleapis.com/fcm/send"

这是用于处理服务人员上的推送消息的代码:

self.addEventListener('push', function(event) {
    console.log('Push message received', event);
    var data = {};
    if (event.data) {
        data = event.data.json();
    }
    event.stopImmediatePropagation();
    showNotification(data.notification);
});

function showNotification(notification) {
    var click_action = notification.click_action; //<-- This is correct!
    var options = {
        body: notification.body,
        icon: notification.icon,
        subtitle: notification.subtitle,
        data: {
            url: click_action
        }
    };
    if (self.registration.showNotification) {
        return self.registration.showNotification(notification.title, options);
    }
}

用于管理notifyclick事件的代码非常简单:

self.addEventListener('notificationclick', function(event) {
    var url = '';
    try {
        url = event.notification.data.url; // <-- event.notification is null randomly!!
    } catch (err) {}
    event.waitUntil(self.clients.openWindow(url));
});

在服务工作者上下文上经过一定时间后,是否有任何原因导致有效负载丢失?是否在任何地方的文档中指定了此时间? 预先感谢您的帮助!

1 个答案:

答案 0 :(得分:-1)

//payload of push message
{
"notification": {
                    "title": data.title,
                    "body": data.text,
                    "click_action": url,
                    "tag": "",
                    "icon": ""
                },
                "to": token             
}

//in service woker
self.addEventListener("notificationclick", (event) => {
    event.waitUntil(async function () {
        const allClients = await clients.matchAll({
            includeUncontrolled: true
        });
        let chatClient;
        for (const client of allClients) {
            if (client['url'].indexOf(event.notification.data.FCM_MSG.notification.click_action) >= 0) {
                client.focus();
                chatClient = client;
                break;
            }
        }
        if (!chatClient) {
            chatClient = await clients.openWindow(event.notification.data.FCM_MSG.notification.click_action);
        }
    }());
});

因此,基本上,在单击通知时,您将重定向到应用程序,如果未打开应用程序,则在新选项卡中打开该应用程序,因为您担心如果您无法获得click_action,您是否可以尝试使用event.notification.data.FCM_MSG.notification.click_action来查看网址,并在服务工作者https://github.com/firebase/quickstart-js/issues/102的开头添加事件监听器