打开通知后导航到屏幕?

IT技术 javascript android reactjs firebase react-native
2021-01-24 03:43:58

我正在使用 Firebase 云功能向我收到他的 FCM 令牌的特定设备发送远程通知,我收到了它并且运行良好,

这是我通过云功能发送通知的代码

const functions = require("firebase-functions");
const admin = require("firebase-admin");
var serviceAccount = require("./serviceAccountKey.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://-----.firebaseio.com"
});
exports.sendPushR = functions.database
  .ref("/request/{pid}/orders/{orderid}")
  .onCreate(async (snapshot, context) => {
    const registrationTokens = snapshot.val().token;
    const event = context.params;
    const afterData = snapshot.val();
    const username = snapshot.val().username;

    const payload = {
      notification: {
        title: "New Order",
        body: `You received a new order from ${username} check it now! `,
        sound: "default",
        icon: "default"
      }
    };

    try {
      const response = await admin
        .messaging()
        .sendToDevice(registrationTokens, payload);
      console.log("Successfully sent message:", response);
    } catch (error) {
      console.log("Error sending message:", error);
    }
    return null;
  });

并在主屏幕应用程序中

  async componentDidMount() {
//BackHandler.addEventListener("hardwareBackPress", this.backPressed);

this.notificationInitListener = await firebase
  .notifications()
  .getInitialNotification()
  .then(notificationOpen => {
    if (notificationOpen) {
      console.log(notificationOpen);
      setTimeout(() => {
        this.props.navigation.navigate("Notifications");
      }, 5000);
      console.log("1---OPEND");
      firebase.notifications().removeAllDeliveredNotifications();
      console.log("1---OPEND-After");
    }
  });
this.removeNotificationOpenedListener = firebase
  .notifications()
  .onNotificationOpened(notificationOpen => {
    // Get the action triggered by the notification being opened
    // const action = notificationOpen.action;
    // Get information about the notification that was opened
    // const notification = notificationOpen.notification;
    if (notificationOpen) {
      this.props.navigation.navigate("Notifications");
      console.log("OPEND");
      firebase.notifications().removeAllDeliveredNotifications();
      console.log("OPEND-After");
    }
  });
 }

路线

const HomeStack = createStackNavigator(
  {
    Home: {
      screen: Home,
      navigationOptions: ({ navigation }) => ({
        title: "Home",
        headerLeft: <NavigationDrawerStructure navigationProps={navigation} />,
        headerRight: (
          <TouchableOpacity
            onPress={() => navigation.navigate("Notifications")}
            style={{ margin: 10 }}
          >
            <Icon name="ios-notifications" size={28} color="#1DA1F2" />
          </TouchableOpacity>
        )
      })
    },
    MapScreen: {
      screen: MapScreen,
      navigationOptions: {
        title: "Map"
      }
    },
    ProviderProfile: {
      screen: ProviderProfile
    },
    GalleryDetails: {
      screen: GalleryDetails,
      navigationOptions: {
        title: "Gallery Details"
      }
    },
    Order: {
      screen: Order,
      navigationOptions: {
        title: "Order"
      }
    },

    Favorites: {
      screen: UserFavorites,
      navigationOptions: ({ navigation }) => ({
        title: "My Favorites!",
        headerLeft: <NavigationDrawerStructure navigationProps={navigation} />
      })
    },
    Notifications: {
      screen: Notifications,
      navigationOptions: {
        title: "Notifications"
      }
    }
  },
  {
    defaultNavigationOptions
  }
);

现在我有两个问题:

  1. 我认为这是在我第一次打开应用程序时没有点击任何通知的第一个函数getInitialNotification它将我导航到通知屏幕两三秒钟,然后让我回到家中,然后
  2. 当我点击我收到的通知“当应用程序关闭时'它不在后台'杀戮'”!,只是停留在主屏幕上没有将我导航到通知屏幕 或导航我我想2秒钟并让我回到主屏幕,

但是当应用程序仍在后台时,下功能“ onNotificationOpened ”工作得很好

演示 https://vimeo.com/350006721

2个回答

你没有解释你的期望......但我认为你不想从通知屏幕开始,而是从主屏幕开始。

为此,您可以initialRouteName为您的createStackNavigator方法使用第二个参数(参见本页最底部的示例:https : //reactnavigation.org/docs/en/stack-navigator.html

试一试,如果解决了,去寻找第二个问题(我更喜欢逐步解决问题)

第一个问题是用“initialRouteName”解决,我认为第二个问题是当我收到“当应用程序被杀时”的通知并点击打开它时,它打开得很好并导航到“通知屏幕”但是在我每次打开后没有点击任何通知的应用程序会将我导航到“通知屏幕”,所以如何删除之前的通知“删除getInitialNotification中的侦听器”@suther?
2021-03-25 03:43:58
如果应用程序是通过单击通知打开的,则 getInitialNotification 方法返回一个带有通知数据的对象,如果应用程序是通过其他方法打开的,则返回 null。在您的代码中,if (notificationOpen){ //navigate to notifications screen } else { //navigate to home screen }
2021-04-04 03:43:58

在通知打开时处理导航的最佳方法是在启动画面中处理它们。这会给你更多的灵活性。只需检查应用程序是否通过通知打开componentDidMount,然后导航到所需的屏幕。您可以使用 createSwitchNavigator来防止 android 后退按钮和 ios 手势返回初始屏幕。

我认为第二个问题是当我收到“当应用程序被杀死时”的通知并单击打开它时,它打开得很好并将我导航到“通知屏幕”但是每次我打开应用程序后没有点击任何通知它都会导航我到“通知屏幕”,所以如何删除之前的通知“删除 getInitialNotification 中的侦听器”

要解决此问题,您必须在处理通知之后和导航到新屏幕之前保存messageId/ notificationIdin AsyncStorage在处理通知之前,您可以检查该通知是否已处理。

您必须采取的步骤:

1-检查notificationId之前是否处理过(这可以是一个AsyncStorage电话)。

2- 如果已处理: clear AsyncStorage,因为我们不再需要它

3- 如果不是:添加notificationId到 AsyncStorage 并导航到新屏幕