打开通知后导航到屏幕?

Posted

技术标签:

【中文标题】打开通知后导航到屏幕?【英文标题】:Navigate to screen after opening a notification? 【发布时间】:2019-12-01 22:48:42 【问题描述】:

我正在使用 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
  
);

现在我有两个问题:

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

但是当应用程序仍在后台时,“onNotificationOpened”功能非常有效

演示 https://vimeo.com/350006721

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

第一个问题是用“initialRouteName”解决,我认为第二个问题是当我收到通知“当应用程序终止时”并单击打开它时,它打开得很好并导航到“通知屏幕”但是每次在我打开应用程序而不点击任何通知后,它都会将我导航到“通知屏幕”,所以我怎样才能删除以前的通知“删除 getInitialNotification 中的侦听器”@suther?跨度> 如果应用程序是通过单击通知打开的,getInitialNotification 方法将返回一个带有通知数据的对象,如果应用程序是通过其他方法打开的,则返回 null。在您的代码中,if (notificationOpen) //navigate to notifications screen else //navigate to home screen 【参考方案2】:

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

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

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

你必须采取的步骤:

1- 检查之前是否处理过notificationId(这可以是AsyncStorage 调用)。

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

3- 如果没有:将 notificationId 添加到 AsyncStorage 并导航到新屏幕

【讨论】:

以上是关于打开通知后导航到屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

单击通知时导航到特定屏幕?

如何在颤振应用程序中无上下文导航?

华为手机底部的三个按键怎么恢复?

应用程序推送通知 - 收到并导航到屏幕 - 应用程序何时关闭?

当应用程序被杀死时,无法在推送通知单击时导航到特定屏幕(Flutter android)

从通知中导航到父活动