Вам не нужны дополнительные пакеты, как предложено в других ответах.
Используйте RNFirebase.io, вы легко справитесь с этим.
Если вы получаете Уведомление, если приложение находится в фоновом режиме, вы должны обработать его самостоятельно, чтобы отобразить это Уведомление. В качестве примера см. Мой метод init для Push-уведомлений.
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-messages-stuff в виде крошечной библиотеки (удалите лишний материал, если он вам не нужен):
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-permission\n ${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();