打开通知后导航到屏幕?
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 并导航到新屏幕
【讨论】:
以上是关于打开通知后导航到屏幕?的主要内容,如果未能解决你的问题,请参考以下文章
应用程序推送通知 - 收到并导航到屏幕 - 应用程序何时关闭?