Service Worker“notificationclick”未触发

gru*_*ler 5 web-notifications

通知显示正常,但是当我单击它或执行任何操作时,什么也没有发生。我没有看到任何日志记录,没有错误消息,但通知确实关闭了(尽管即使我注释掉它也会关闭event.notification.close())。

我尝试使用 Chrome 调试器,并且可以在显示通知的代码中设置断点,但notificationclick处理程序中的所有断点都无法暂停执行。

我花了好几天的时间试图让它发挥作用,但我已经束手无策了。

const auth = firebase.auth();
const functions = firebase.functions();
const done = functions.httpsCallable("done");
const snooze = functions.httpsCallable("snooze");

self.addEventListener("notificationclick", event => {
  console.log("notificationclick", event);
  const uid = auth.currentUser.uid;
  const { id, url } = event.notification.data;

  event.notification.close();
  event.waitUntil(() => {
    switch (event.action) {
      case "done":
        console.log("Done");
        return done({ uid, id });
      case "snooze1":
        console.log("Snooze 1 Hour");
        return snooze({ uid, id, hours: 1 });
      case "snooze24":
        console.log("Snooze 1 Day");
        return snooze({ uid, id, hours: 24 });
      default:
        console.log("Open App");
        return clients
          .matchAll({
            includeUncontrolled: true,
            type: "window"
          })
          .then(clientList => {
            for (let i = 0; i < clientList.length; i++) {
              let client = clientList[i];
              if (url[0] === "#") {
                if (client.url.endsWith(url) && "focus" in client) {
                  return client.focus();
                }
              } else {
                if (
                  client.url.replace(/#.*$/, "") === url &&
                  "focus" in client
                ) {
                  return client.focus();
                }
              }
            }
            if (clients.openWindow) {
              return clients.openWindow(location.origin + url);
            }
          });
    }
  });
});

firebase
  .messaging()
  .setBackgroundMessageHandler(({ data: { title, options } }) => {
    options = JSON.parse(options);
    options.actions = [
      { action: "done", title: "Done" },
      { action: "snooze1", title: "Snooze 1 Hour" },
      { action: "snooze24", title: "Snooze 1 Day" }
    ];

    return self.registration.showNotification(title, options);
  });
Run Code Online (Sandbox Code Playgroud)

Ign*_*ind 1

您好,您可以尝试下面的代码,看看是否被调用-

 self.addEventListener('notificationclick', function (event) {
        event.notification.close();
        var redirectUrl = null;
        var tag = event.notification.tag;
        if (event.action) {
            redirectUrl = event.action
        } 
        if (redirectUrl) {
            event.waitUntil(async function () {
                var allClients = await clients.matchAll({
                    includeUncontrolled: !0
                });
                var chatClient;
                for (const client of allClients) {
                    if (redirectUrl != '/' && client.url.indexOf(redirectUrl) >= 0) {
                        client.focus();
                        chatClient = client;
                        break
                    }
                }
                if (chatClient == null || chatClient == 'undefined') {
                    chatClient = clients.openWindow(redirectUrl);
                    return chatClient
                }
            }().then(result => {
                if (tag) {
                    //PostAction(tag, "click")
                }
            }))
        }
    });
Run Code Online (Sandbox Code Playgroud)

编辑-附加两个 js 文件。它在我这边工作。

firebase-messaging-sw.js
Run Code Online (Sandbox Code Playgroud)

 self.addEventListener('notificationclick', function (event) {
        event.notification.close();
        var redirectUrl = null;
        var tag = event.notification.tag;
        if (event.action) {
            redirectUrl = event.action
        } 
        if (redirectUrl) {
            event.waitUntil(async function () {
                var allClients = await clients.matchAll({
                    includeUncontrolled: !0
                });
                var chatClient;
                for (const client of allClients) {
                    if (redirectUrl != '/' && client.url.indexOf(redirectUrl) >= 0) {
                        client.focus();
                        chatClient = client;
                        break
                    }
                }
                if (chatClient == null || chatClient == 'undefined') {
                    chatClient = clients.openWindow(redirectUrl);
                    return chatClient
                }
            }().then(result => {
                if (tag) {
                    //PostAction(tag, "click")
                }
            }))
        }
    });
Run Code Online (Sandbox Code Playgroud)

application.js文件 :

firebase-messaging-sw.js
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述