Я реализовал облачный обмен сообщениями firebase. У меня есть тест на https://console.firebase.google.com и на Postman, следуя руководству из Реализовать Pu sh Уведомление с Firebase в React Native и React Native Firebase Cloud Messaging (FCM) Pu sh Уведомление .
Обе статьи действительно полезны для реализации firebase в react-native, поскольку я ищу реализацию облачных сообщений firebase в react-native cli.
Но есть две вещи, связанные с уведомлением firebase, которые похоже на ошибку в моем приложении. Когда я отправляю сообщение с консоли, когда мое приложение открыто, оно отображается как предупреждение. Когда я нажимаю ОК, оно повторяется примерно 10 раз. См. Gif ниже или потоковое видео Gif : -
Во-вторых, если я закрываю приложение, и я отправить новое сообщение, оно появится в панели уведомлений. Когда я нажимаю сообщение с уведомлением, оно открывает ПРИЛОЖЕНИЕ и снова появляется ПРЕДУПРЕЖДЕНИЕ, но с пустым содержимым. Ни заголовок, ни текст не отображались.
Ниже мой скрипт в приложении. js: -
import 'react-native-gesture-handler';
import React, { Component } from 'react';
import { Alert, View } from "react-native";
import AsyncStorage from '@react-native-community/async-storage';
import firebase from "react-native-firebase";
import { createSwitchNavigator, createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import InitSplash from './src/screens/init/InitSplash';
import InitAuthentication from './src/screens/init/InitAuthentication';
import AlreadyLogin from './src/screens/handler/AlreadyLogin';
import MainTabs from './src/components/AppTabs';
const AuthStack = createStackNavigator(
{
InitAuthentication: { screen: InitAuthentication },
.
.
.
. etc
},
{
initialRouteName: 'InitAuthentication',
}
);
const DashboardStack = createStackNavigator(
{
MainTabs: { screen: MainTabs, navigationOptions: { headerShown: false } },
.
.
.
. etc
},
{
initialRouteName: 'MainTabs',
}
);
const AppSwitchNavigator = createSwitchNavigator(
{
MainSplash: { screen: InitSplash, },
AlreadyLogin: { screen: AlreadyLogin },
MainAuth: { screen: AuthStack, },
MainDashboard: { screen: DashboardStack },
}
);
const AppContainer = createAppContainer(AppSwitchNavigator);
class App extends Component {
async componentDidMount() {
this.checkPermission();
this.createNotificationListeners();
}
async checkPermission() {
const enabled = await firebase.messaging().hasPermission();
if (enabled) {
this.getToken();
} else {
this.requestPermission();
}
}
async getToken() {
let fcmToken = await AsyncStorage.getItem('fcmToken');
if (!fcmToken) {
fcmToken = await firebase.messaging().getToken();
if (fcmToken) {
await AsyncStorage.setItem('fcmToken', fcmToken);
}
}
}
async requestPermission() {
try {
await firebase.messaging().requestPermission();
this.getToken();
} catch (error) {
console.log('permission rejected');
}
}
createNotificationListeners = async () => {
this.notificationListener = firebase.notifications().onNotification((notification) => {
console.log('notificationListener: ' + JSON.stringify(notification));
const { title, body } = notification;
this.displayNotification(title, body);
});
this.notificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen) => {
console.log('notificationOpenedListener: ' + JSON.stringify(notificationOpen));
const { title, body } = notificationOpen.notification;
this.displayNotification(title, body);
});
const notificationOpen = await firebase.notifications().getInitialNotification();
if (notificationOpen) {
console.log('notificationOpen: ' + JSON.stringify(notificationOpen.notification));
const { title, body } = notificationOpen.notification;
this.displayNotification(title, body);
}
this.createNotificationListeners = firebase.messaging().onMessage((message) => {
console.log('createNotificationListeners'+JSON.stringify(message));
});
}
displayNotification(title, body) {
Alert.alert(
title, body,
[
{ text: 'Ok', onPress: () => console.log('ok pressed') },
],
{ cancelable: false },
);
}
render() {
return (<AppContainer />);
}
}
export default App;