我一直在尝试通过react native中的rnfirebase使用FCM实现通知。并使用notife处理本地通知。
我已经能够通过firebase云消息接收后台通知,即死亡状态和最小化状态,并能够使用notife获得前台通知。
现在我想使用notife作为后台通知,以确保通知之间的一致性。
这里的代码
const displayNotification = async () => {
const channelId = await notifee.createChannel({
id: 'important',
name: 'Important Notifications',
importance: AndroidImportance.HIGH,
});
notifee.displayNotification({
body: 'This message was sent via FCM!',
android: {
channelId: channelId,
actions: [
{
title: 'Mark as Read',
pressAction: {
id: 'read',
},
},
],
},
});
};
messaging().setBackgroundMessageHandler(async remoteMessage => {
console.log('Message handled in the background!', remoteMessage);
displayNotification();
});
messaging().onMessage(async remoteMessage => {
console.log('Message handled in the foregourp!', remoteMessage);
displayNotification();
});
使用此代码获取前台通知。当应用程序最小化时,会收到两个通知,一个来自notife,另一个来自FCM。当应用程序被杀死时,只会收到FCM通知,而不会收到通知
问题
- 如何在杀死状态下从notife获得通知
- 如何禁用FCM后台通知。我需要从firebase发送仅限数据的通知吗
- 同样在OnePlus设备上,无法在killed中获得FCM通知状态,因为它显示应用程序未运行。我需要吗将添加到android清单文件
解决方案
Q1是通过将setBackgroundHandler从useEffect内部移动到钩子外部来解决的。
Q2仍在等待
第三季度仍在等待
backgroundMessageHandler单独创建一个带有来自FCM的信息的Notification,而触发您自己的通知只会导致两个通知。您应该在backgroundMessageHandler中删除displayNotification();
。此外,backgroundMessageHandler应该位于index.js
文件中,而不是您的应用程序中。
如果要忽略FCM后台通知,只需忽略通知参数即可。只需发送数据参数,但仅数据消息在Android和iOS上都以低优先级发送,默认情况下不会触发setBackgroundMessageHandler。要启用此功能,必须设置";"优先级";在Android上设置为高,并在消息负载中启用iOS的内容可用标志。
{
"to": "User_Device_Token",
"data": {
"body": "Body of Your Notification",
"title": "Title of Your Notification"
},
"priority": "high",
"contentAvailable": true
}
对Q2的回答。您需要从后端自定义消息对象
对于NodeJS,
import { getMessaging } from "firebase-admin/messaging";
const message = {
data: {
title: "Title",
body: "This is the body",
},
token:
"fcm-token-here",
};
getMessaging()
.send(message)
.then((response) => {
res.json({
msg: "Sent successfully",
});
console.log(response);
})
.catch((err) => console.log(err));
如果你在消息对象中有通知对象,它也会显示firebase通知。如果您将其更改为数据,它将不会显示。您可以从notife 处理数据对象