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,哪些不适用? [关闭]
React-Native:从 Firebase 存储下载图像