我已经使用库成功实现了基本的通知功能react-native-firebase
一切都按预期工作,信息被正确接收并准备好用于我尚未确定的目的。我的代码目前在通知处理部分如下所示:
componentDidMount() {
/**
* When app on foreground, rewrap received notification and re-send it as notification using channelId
* A workaround because channelId never set by default by FCM API so we need to rewrap to make sure it is
* shown on user's notification tray
*/
this.notificationListener = firebase.notifications().onNotification((notification) => {
//data object must have channelId props as a workaround for foreground notification on Android
console.log('Notif ', notification);
notification.android.setChannelId(notification.data.channelId);
firebase.notifications().displayNotification(notification);
});
//On Notification tapped, be it from foreground or background
this.notificationOpen = firebase.notifications().onNotificationOpened((notificationOpen) => {
//body and title lost if accessed from background, taking info from data object by default
const notification = notificationOpen.notification;
console.log('Open ', notification)
Alert.alert(notification.data.title, notification.data.body);
});
//When notification received when app is closed
this.initialNotification = firebase.notifications().getInitialNotification()
.then((notificationOpen) => {
//body and title lost if accessed this way, taking info from data object where info will persist
if (notificationOpen) {
const notification = notificationOpen.notification;
console.log('Initial ', notification)
Alert.alert(notification.data.title, notification.data.body);
}
});
}
componentWillUnmount() {
this.notificationListener();
this.initialNotification()
this.notificationOpen();
}
上面的代码让我使用从 firebase 控制台或我的同事在上述范围内设置的 php 服务器发送的任何信息(不确定服务器端实现是如何完成的,但它给了我完全相同的通知对象(。
所以这很好,但问题是当我从 firebase 控制台在 IOS 上设置徽章时,一旦我打开通知,徽章就不会消失。 我一直在试图弄清楚我是否必须向上述块添加任何额外的位才能以编程方式减少徽章计数器,但到目前为止还没有运气。
因此,如果这里有人可以向我展示如何在 Android 和 IOS 上正确管理这些通知对象(特别是解释这些对象的性质和生命周期 - 即哪些属性/方法上的哪些数据在通知对象范围内持久存在或静态(,那将不胜感激:)
事实证明,每当打开应用程序时,根componentDidMount()
上的简单firebase.notifications().setBadge(0)
都会清除徽章计数。
可能也需要使用firebase.notifications().removeAllDeliveredNotifications()
或firebase.notifications().cancelAllNotifications()
将它们从通知托盘中删除。
您可能必须在创建通知时为徽章设置代码
this.notificationListener = firebase.notifications().onNotification((notification) => {
const localNotification = new firebase.notifications.Notification()
.setNotificationId(notification.notificationId)
.setTitle(notification.title)
.setSubtitle(notification.subtitle)
.setBody(notification.body)
.setData(notification.data)
.ios.setBadge(notification.ios.badge);
firebase.notifications()
.displayNotification(localNotification)
.catch(err => console.error(err));
}
在生成通知时.ios.setBadge(notification.ios.badge);
将此行放入代码中,然后重试