Firebase Cloud Messaging: фон значка уведомления работает только со второй попытки

#javascript #firebase #web #firebase-cloud-messaging

#javascript #firebase #веб #firebase-cloud-обмен сообщениями

Вопрос:

Я пытаюсь настроить фон значка уведомления, но вместо этого я получил 2 повторяющихся уведомления. В первом уведомлении нет значка, который я установил. Второе уведомление — это то, что я ожидал.

Вот изображение моего текущего результата.

Я уже добавил firebase-messaging-sw.js в проект и я добавил значок в функции onBackgroundMessage.

 firebase.messaging().onBackgroundMessage(function(payload) {
  // console.log('[firebase-messaging-sw.js] Received background message ', payload);
  // Customize notification here
  const notificationTitle = payload.notification.title;
  const notificationOptions = {
    body: payload.notification.body,
    icon: 'noti_icon.png'
  };

  return self.registration.showNotification(notificationTitle, notificationOptions);
});
  

Я проследил, откуда пришло первое уведомление, и обнаружил, что оно было из firebase-messaging.js и функция onPush , которую вы можете увидеть ниже.

 nt.prototype.onPush = function(a) {
    return d(this, void 0, void 0, function() {
      var i, o, s;
      return h(this, function(e) {
        let sss = e
        switch (e.label) {
          case 0:
            return (s = function(e) {
              var t = e.data;
              if (!t) return null;
              try {
                return t.json()
              } catch (e) {
                return null
              }
            }(a)) ? [4, rt()] : (console.debug("FirebaseMessaging: failed to get parsed MessagePayload from the PushEvent. Skip handling the push."), [2]);
          case 1:
            return (i = e.sent(), i.some(function(e) {
              return "visible" === e.visibilityState amp;amp; !e.url.startsWith("chrome-extension://")
            })) ? [2, function(e, t) {
              var n, r;
              t.isFirebaseMessaging = !0, t.messageType = _e.PUSH_RECEIVED;
              try {
                for (var i = c(e), o = i.next(); !o.done; o = i.next()) {
                  o.value.postMessage(t)
                }
              } catch (e) {
                n = {
                  error: e
                }
              } finally {
                try {
                  o amp;amp; !o.done amp;amp; (r = i.return) amp;amp; r.call(i)
                } finally {
                  if (n) throw n.error
                }
              }
            }(i, s)] : (o = !1, s.notification ? [4, function(e) {
              var t = e.actions,
                n = Notification.maxActions;
              t amp;amp; n amp;amp; t.length > n amp;amp; console.warn("This browser only supports "   n   " actions. The remaining actions will not be displayed.");
              return self.registration.showNotification(null !== (n = e.title) amp;amp; void 0 !== n ? n : "", e)
            }(((r = p({}, (t = s).notification)).data = ((n = {})[Me] = t, n), r))] : [3, 3]);
          case 2:
            e.sent(), o = !0, e.label = 3;
          case 3:
            return !0 === o amp;amp; !1 === this.isOnBackgroundMessageUsed ? [2] : (this.bgMessageHandler amp;amp; (s = Qe(s), "function" == typeof this.bgMessageHandler ? this.bgMessageHandler(s) : this.bgMessageHandler.next(s)), [4, et(1e3)]);
          case 4:
            return e.sent(), [2]
        }
        var t, n, r
      })
    })  

В приведенной выше функции первое уведомление будет отправлено в регистр 1 с уведомлением по умолчанию, а второе уведомление будет отправлено в регистр 4.

Я не знаю, как настроить уведомление так, чтобы оно отображало только второе уведомление.

Комментарии:

1. Смогли ли вы найти решение? Можете ли вы дать некоторое представление о том, как вы это решили?

Ответ №1:

Если это не уведомление только для данных, уведомление отображается по умолчанию. Ваш вызов showNotification показывает это еще раз. Самый простой способ — удалить обработчик onBackgroundMessage и отправить имя файла значка внутри уведомления (в webpush.notification .атрибут значка). Добавьте больше информации, если вам нужно помочь с этим.

Ответ №2:

 const notificationOptions = {
    body: payload.notification.body,
    icon: 'noti_icon.png',
    type: json
  };
  

Вы пробовали это?