FCM Web推送通知无法单击通知链接click_action

时间:2019-04-03 07:01:00

标签: angular firebase firebase-cloud-messaging service-worker

我在click_action函数中添加了push参数。这是我的示例代码。

self.addEventListener("push", function(event) {
  var title = event.data.json().notification.title;
  var body = event.data.json().notification.body;
  var icon = "/assets/img/logo.png";
  var click_action =
    "http://localhost:4200/#/jobs/notification/" +
    event.data.json().data.job_no;
  event.waitUntil(
    self.registration.showNotification(title, {
      body: body,
      icon: icon,
      click_action: click_action
    })
  );
});

要处理click上的notification,请定义一个notificationclick事件处理程序。

例如:

self.addEventListener('notificationclick', function(event) {
  var redirect_url = event.notification.data.click_action;
  event.notification.close();
  event.waitUntil(
    clients
      .matchAll({
        type: "window"
      })
      .then(function(clientList) {
        console.log(clientList);
        for (var i = 0; i < clientList.length; i++) {
          var client = clientList[i];
          if (client.url === "/" && "focus" in client) {
            return client.focus();
          }
        }
        if (clients.openWindow) {
          return clients.openWindow(redirect_url);
        }
      })
  );
});

但是我无法在click_action函数中获取notificationclick参数。我想将推送通知重定向到click_action中的Givent网址。

请帮助我。

2 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。我已在请求中发送了额外的参数。 这是我的示例代码:

self.addEventListener("push", function(event) {
  var title = event.data.json().notification.title;
  var body = event.data.json().notification.body;
  var icon = "/assets/img/logo.png";
  var click_action =
    "http://localhost:4200/#/jobs/notification/" +
    event.data.json().data.job_no;
  event.waitUntil(
    self.registration.showNotification(title, {
      body: body,
      icon: icon,
      data: {
        click_action
      }
    })
  );
});

使用click_action,下面是示例代码:

self.addEventListener('notificationclick', function(event) {
  var redirect_url = event.notification.data.click_action;
  event.notification.close();
  event.waitUntil(
    clients
      .matchAll({
        type: "window"
      })
      .then(function(clientList) {
        console.log(clientList);
        for (var i = 0; i < clientList.length; i++) {
          var client = clientList[i];
          if (client.url === "/" && "focus" in client) {
            return client.focus();
          }
        }
        if (clients.openWindow) {
          return clients.openWindow(redirect_url);
        }
      })
  );
});

答案 1 :(得分:0)

使用Google的firebase云消息传递对我来说,实施' notificationclick '无效。我改用了 fcmOptions ,因为该实现仅用于重定向并且可以从服务器控制链接。

阅读文档link显然可以使用 fcmOptions 满足您的需求,请注意,该链接必须是HTTPs链接。该文档声明使用 fcm_options ,可能已经过时了,因为它已将{strong> fcmOption

设置为renamed

(对我来说)发送消息的方式(手动)是

var message = {
    data: {
      a:1
    },
    notification: {
      title: 'title',
      body: 'body'
    },
    webpush: {
      fcmOptions: {
        link: 'https://www.walcron.com'
      }
    },
    token: VALID_TOKEN
  };

对于正在使用此Firebase CM的任何人,祝您好运。通过服务人员,firebase-admin和此GCM文档花了几个小时。最后,代码很少,但是由于作用域很大,因此很难消化!