#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
};
Вы пробовали это?