Firebase 消息传递服务工作人员点击处理程序不起作用

Posted

技术标签:

【中文标题】Firebase 消息传递服务工作人员点击处理程序不起作用【英文标题】:Firebase messaging service worker click handler doesn't work 【发布时间】:2019-01-20 23:27:40 【问题描述】:

我正在使用 FCM 处理推送通知,但通知来自 data 键而不是 notification

这是我用来处理新消息并显示为通知的代码。 我看到了我指定的所有选项和数据的通知。但是,当我单击通知时,它不会触发任何“notificationclick”事件。它也不会打印event.notification

importScripts('https://www.gstatic.com/firebasejs/5.3.1/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/5.3.1/firebase-messaging.js');


firebase.initializeApp(
    messagingSenderId: "SOME_ID",
);

const messaging = firebase.messaging();


messaging.setBackgroundMessageHandler(payload => 
    console.log(payload);
    const options = 
        body: payload.data.body,
        icon: payload.data.icon,
        click_action: payload.data.click_action,
        link: payload.data.link,
        data: 
            time: new Date(Date.now()).toString(),
            click_action: payload.data.click_action,
        ,
    ;

    self.registration.showNotification(payload.data.title, options);

);



self.addEventListener("notificationclick", function(event) 
    console.log(event.notification);
    const clickedNotification = event.notification;
    clickedNotification.close();

    const urlToOpen = clickedNotification.data && clickedNotification.data.click_action;

    const promiseChain =  clients.matchAll(
        type: 'window',
        includeUncontrolled: true,
    )
        .then((windowClients) => 
            let matchingClient = null;

            for (let i = 0; i < windowClients.length; i++) 
                const windowClient = windowClients[i];
                if (windowClient.url === urlToOpen) 
                    matchingClient = windowClient;
                    break;
                
            

            if (matchingClient) 
                return matchingClient.focus();
             else 
                return clients.openWindow(urlToOpen);
            
        );

    event.waitUntil(promiseChain);

);

【问题讨论】:

您使用的是管理员 Firebase API 还是旧版 API?控制台语句是否确认 setBackgroundMessageHandler 确实被调用了? @nuruddin-iminokhunov 对点击处理的解决方案有帮助吗?正在为同样的问题而苦苦挣扎。 对我来说同样的问题 【参考方案1】:

1 您可以使用应用程序中的 firebase-messaging-sw.js 文件检查构建后该文件中是否存在最近的更改。

2 我们只需要 firebase-messaging-sw.js 中的最新更改,因此需要检查最新更新的 firebase-messaging-sw.js 文件并取消注册所有旧的 firebase-messaging-sw.js。

它对我有用。

【讨论】:

以上是关于Firebase 消息传递服务工作人员点击处理程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

未调用 Flutter Firebase 消息传递 iOS 处理程序

Flutter firebase消息传递未收到通知

如何在不点击通知的情况下从通知中获取数据(firebase 云消息传递和本机反应)

Firebase 消息传递方法 swizzling 不起作用

[Firebase 消息传递]:应用程序在后台时不调用后台消息处理程序方法?

Firebase 云消息传递的 AbstractMethodError