В этой статье я покажу вам, как реализовать push-уведомление для приложения React Native с помощью Firebase. В React native действительно сложно найти одну демонстрацию, охватывающую все аспекты push-уведомлений Firebase, поэтому я решил написать ее.
Первый шаг к интеграции RNFirebase в код. Для можно выполнить следующие действия: https://rnfirebase.io/docs/v5.x.x/installation/initial-setup
Выполните следующие основные шаги, чтобы установить React native Firebase, и шаги в соответствии с вашей платформой (Android / iOS).
Теперь начнем с нативного кода React:
- Добавьте этот код в свой файл App.js (или в файл заставки):
import firebase from ‘react-native-firebase’; import type { Notification, NotificationOpen } from ‘react-native-firebase’; async componentDidMount() { this.checkPermission(); this.createNotificationListeners(); const notificationOpen: NotificationOpen = await firebase.notifications().getInitialNotification(); if (notificationOpen) { const action = notificationOpen.action; const notification: Notification = notificationOpen.notification; var seen = []; alert(JSON.stringify(notification.data, function (key, val) { if (val != null && typeof val == "object") { if (seen.indexOf(val) >= 0) { return; } seen.push(val); } return val; })); } const channel = new firebase.notifications.Android.Channel('test-channel', 'Test Channel', firebase.notifications.Android.Importance.Max) .setDescription('My apps test channel');// Create the channel firebase.notifications().android.createChannel(channel); this.notificationDisplayedListener = firebase.notifications().onNotificationDisplayed((notification: Notification) => { // Process your notification as required // ANDROID: Remote notifications do not contain the channel ID. You will have to specify this manually if you'd like to re-display the notification. }); this.notificationListener = firebase.notifications().onNotification((notification: Notification) => { // Process your notification as required this.displayNotification(notification) }); this.notificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen: NotificationOpen) => { // Get the action triggered by the notification being opened const action = notificationOpen.action; //Navigate to screen on click of push notification this.props.navigation.navigate('NotificationScreen') firebase.notifications().removeDeliveredNotification(notification.notificationId); }); } //1 async checkPermission() { const enabled = await firebase.messaging().hasPermission(); if (enabled) { this.getToken(); } else { this.requestPermission(); } } //3 Get FCM token (Device token for push notification) async getToken() { let fcmToken = await AsyncStorage.getItem('fcmToken'); if (!fcmToken) { fcmToken = await firebase.messaging().getToken(); if (fcmToken) { // user has a device token console.log('Token ------ > ' + fcmToken); } } } //2 (Check user permission) async requestPermission() { try { await firebase.messaging().requestPermission(); // User has authorised this.getToken(); } catch (error) { // User has rejected permissions console.log('permission rejected'); } } async createNotificationListeners() { /* * Triggered when a particular notification has been received in foreground * */ this.notificationListener = firebase.notifications().onNotification((notification) => { console.log(JSON.stringify(notification)); this.displayNotification(notification) }); /* * If your app is in background, you can listen for when a notification is clicked / tapped / opened as follows: * */ this.notificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen) => { const { title, body } = notificationOpen.notification; }); /* * If your app is closed, you can check if it was opened by a notification being clicked / tapped / opened as follows: * */ const notificationOpen = await firebase.notifications().getInitialNotification(); if (notificationOpen) { const { title, body } = notificationOpen.notification; } /* * Triggered for data only payload in foreground * */ this.messageListener = firebase.messaging().onMessage((message) => { //process data message console.log(JSON.stringify(message)); this.displayNotification(message) }); } displayNotification = (notification) => { if (Platform.OS === 'android') { if (Platform.Version >= 21) { const localNotification = new firebase.notifications.Notification({ show_in_foreground: true, }) .setNotificationId(notification.messageId) .setTitle(notification.data.title) .setBody(notification.data.message) .android.setChannelId('suntec_channel') // e.g. the id you chose above .android.setSmallIcon('@drawable/ic_notification') // white icon for Android device version <21 .android.setBigText(notification.data.message) // To allow multi line notification description .android.setPriority(firebase.notifications.Android.Priority.High); // Create push notification firebase.notifications() .displayNotification(localNotification) .catch(err => console.error(err)); } else { // Same code as above just in small icon use any color icon instead of white for version > 21 } } else { // Same code as version <21 code block } }
Спасибо за внимание! Если вам понравилась эта история, пожалуйста, нажмите 👏 кнопку и поделитесь, чтобы помочь другим найти ее! Не стесняйтесь оставлять комментарии 💬 ниже.