Im使用react native firebase为我们的react native应用程序(适用于android和iOS)处理推送通知。
我注意到,当应用程序运行时(前台或后台)收到的推送通知只有1个回调,而不是关闭或关闭时。
firebase
.notifications()
.onNotification(notification => {
console.log('Notification received');
);
但如果应用程序被关闭或终止,它只会将通知放在托盘中,不会执行上面的console.log。
然后输入静默推送通知。所以,当我只是在通知的有效负载中发送数据部分时,即使应用程序在前台,也不会触发上面的回调。
我看不到其他有助于接收静默推送通知的回调。
那么我们如何在javascript部分处理推送通知呢?
您不需要像其他答案中建议的那样的附加包。使用RNFirebase.io,您可以轻松处理此问题。
如果您在应用程序处于后台时收到通知,您必须自己处理才能显示此通知。例如,请参阅我的推送通知的init方法。
import firebase from 'react-native-firebase';
const notifications = firebase.notifications();
....
notifications.onNotification((notif) => {
notif.android.setChannelId('app-infos');
notifications.displayNotification(notif);
});
你用displayNotification
来做。但请确保,在调用之前设置了通知通道,否则它将无法在>=Android 8.0 上工作
BTW:请确保您已完全设置Firebase,并授予所有必要的权限,以便在应用程序关闭或处于后台时能够侦听通知。(https://rnfirebase.io/docs/v5.x.x/notifications/android)
附录
我添加这个例子来展示我是如何将firebase通知内容作为一个小库来实现的(如果不需要,请删除redux内容):
import firebase from 'react-native-firebase';
import { saveNotificationToken } from 'app/actions/firebase';
import reduxStore from './reduxStore';
import NavigationService from './NavigationService';
const messaging = firebase.messaging();
const notifications = firebase.notifications();
const crashlytics = firebase.crashlytics();
function registerNotifChannels() {
try {
// Notification-Channels is a must-have for Android >= 8
const channel = new firebase.notifications.Android.Channel(
'app-infos',
'App Infos',
firebase.notifications.Android.Importance.Max,
).setDescription('General Information');
notifications.android.createChannel(channel);
} catch (error) {
crashlytics.log(`Error while creating notification-channel n ${error}`);
}
}
// This is the Promise object that we use to initialise the push
// notifications. It will resolve when the token was successfully retrieved. The
// token is returned as the value of the Promise.
const initPushNotifs = new Promise(async (resolve, reject) => {
try {
const isPermitted = await messaging.hasPermission();
if (isPermitted) {
registerNotifChannels();
try {
const token = await messaging.getToken();
if (token) {
resolve(token);
}
} catch (error) {
crashlytics.log(`Error: failed to get notification-token n ${error}`);
}
}
} catch (error) {
crashlytics.log(`Error while checking notification-permissionn ${error}`);
}
// If we get this far then there was no token available (or something went
// wrong trying to get it)
reject();
});
function init() {
// Initialise the push notifications, then save the token when/if it's available
initPushNotifs.then(token => reduxStore.dispatch(saveNotificationToken(token)));
// Save the (new) token whenever it changes
messaging.onTokenRefresh(token => reduxStore.dispatch(saveNotificationToken(token)));
notifications.onNotification((notif) => {
notif.android.setChannelId('app-infos');
notifications.displayNotification(notif);
});
notifications.onNotificationOpened((notif) => {
const { notification: { _data: { chatroom: chatRoomId } } = {} } = notif;
if (chatRoomId) {
NavigationService.navigate('ChatRoom', { chatRoomId });
}
});
}
export default {
init,
};
有了这个,只需转到你的index.js文件(或者你的应用程序的根文件,它将如何命名),并调用init Metod:
...
import LPFirebase from 'lib/LPFirebase';
LPFirebase.init();