React-Native - Firebase 云消息传递 - 如果从托盘打开则没有事件

Posted

技术标签:

【中文标题】React-Native - Firebase 云消息传递 - 如果从托盘打开则没有事件【英文标题】:React-Native - Firebase Cloud Messaging - no Event if open from Tray 【发布时间】:2018-10-29 17:21:18 【问题描述】:

我使用 fcm-package (https://github.com/evollu/react-native-fcm) 将 Firebase-Cloud-Messages 发送到 android

消息到达手机。

如果应用处于后台,则通知会显示在状态栏中。如果我点击消息,应用程序会在主屏幕上打开 - 在我的情况下是 News_Screen。

但是在应用程序进入前台后,我没有找到捕获通知数据的方法。

FCM.on(FCMEvent.Notification, (notif) => 没有收到任何事件。

如果应用程序在前台,并且我发送通知,console.log-输出工作。

如果应用程序从后台到前台,我是否会错过一些特别的东西来获取事件数据?

这是我的应用的结构:

index.js ⇒ /app/index.js ⇒ (imports a StackNavigator)

StackNavigator 的默认屏幕是“News_Screen”。

在新闻屏幕我有这个:

async componentDidMount() 

        // START Firebase Cloud Messaging
        try 
            let result = await FCM.requestPermissions(
                badge: false,
                sound: true,
                alert: true
            );
         catch (e) 
            console.error(e);
        

        FCM.getFCMToken().then(token => 
            this.setState(token: token || "");
            console.log("First the token: ", token)
            // store fcm token in your server
        );
        if (Platform.OS === "ios") 
            FCM.getAPNSToken().then(token => 
                console.log("APNS TOKEN (getFCMToken)", token);
            );
        

FCM.on(FCMEvent.Notification, (notif) => 
            if(notif.opened_from_tray)
                setTimeout(()=>
                    console.log("notif.opened_from_tray", notif);
                , 1000)
            

            // there are two parts of notif. notif.notification contains the notification payload, notif.data contains data payload
            console.log("Message erhalten", notif);
            if (notif.screen !== undefined) 
                console.log("Jo, der Screen is", notif.screen, this.props.navigation);
                this.props.navigation.navigate('Menu_Screen');
            
        );
        FCM.on(FCMEvent.RefreshToken, (token) => 
            console.log("Again the token:", token)
            // fcm token may not be available on first load, catch it here
        );
    

如果我推送通知并且应用程序从后台到前台,我得到的唯一 console.log 是 First the token... 消息。

如何获取通知的数据。 (例如,如果 Notification 有额外的 Object-Parmete:screen: 'Menu_Screen,则在 App 进入前台后切换到此屏幕)

【问题讨论】:

【参考方案1】:

把你的听众改成这样。

FCM.on(FCMEvent.Notification, notif => 
      console.log("Notification", notif);

      if(Platform.OS ==='ios' && notif._notificationType === NotificationType.WillPresent && !notif.local_notification)
        notif.finish(WillPresentNotificationResult.All)
        return;
      

      if(Platform.OS ==='ios')
        switch(notif._notificationType)
          case NotificationType.Remote:
            notif.finish(RemoteNotificationResult.NewData)
            break;
          case NotificationType.NotificationResponse:
            notif.finish();
            break;
          case NotificationType.WillPresent:
            notif.finish(WillPresentNotificationResult.All)
            break;
        
      

      this.showLocalNotification(notif)
    );

showLocalNotification(notif) 
  console.log('here local', notif)
    FCM.presentLocalNotification(
      title: notif.title,
      body: notif.body,
      priority: "high",
      show_in_foreground: true,
      local: true
   );

如果应用程序在前台,这行 NotificationType.WillPresent 将捕获通知数据。

【讨论】:

感谢您的提示,但我目前使用的是 Android,并试图弄清楚如何以正确的方式捕获推送事件。你知道 FCM 的任何文档,或者 FCM 中的 onMessageReceived 是如何工作的吗? presentLocalNotification 似乎无法在 Android 上运行?! @suther this.showLocalNotification(notif) 也应该在android上调用..你使用的是什么版本?我使用 6.2.3 和另一个使用 15.0.2 的项目,两者都在 android 中工作正常。尝试检查你的有效负载。使用 custom_notification,show_in_foreground 为 true @HazimAli 嘿嘿,我正在使用云功能向特定Token发送通知,并且在设备上很好地接收到了,但是当用户打开这个通知时,它只是打开了应用程序,如何我可以指定这个来打开一个特殊的屏幕吗?喜欢通知屏幕?

以上是关于React-Native - Firebase 云消息传递 - 如果从托盘打开则没有事件的主要内容,如果未能解决你的问题,请参考以下文章

firebase 的哪些部分实际上适用于 react-native,哪些不适用? [关闭]

解析 Firebase 模块(React-Native)

React-Native:从 Firebase 存储下载图像

Firebase 和 react-native 集成

在 react-native 和 firebase 3.1 中登录 Facebook

React-Native:如何在 Airbnb 地图上渲染来自 firebase 的标记列表?