具有react-navigation的React-Native Handle推送通知

时间:2018-12-12 08:03:54

标签: javascript react-native react-navigation

我需要处理推送通知,并且我正在使用onesignal。 目前,我正在主屏幕上处理推送通知,并且正在使用react-navigation

 componentDidMount() {
        OneSignal.addEventListener('received', this.onReceived);
        OneSignal.addEventListener('opened', this.onOpened);

    }
 componentWillUnmount() {
        // OneSignal.removeEventListener('received');
        // OneSignal.removeEventListener('opened');
    }

onReceived(notification) {
    console.log('Notification received: ', notification);
}
onOpened = (data) => {
    const { notification: { payload } } = data;
    if (payload.additionalData) {
        if (payload.additionalData.params) {
            this.props.navigation.navigate({
                routeName: payload.additionalData.route,
                params: payload.additionalData.params,
                key: payload.notificationID
            });
        }
    }
}

使用此代码,我可以导航到通知数据包中指定的路由。 现在我面临的问题是,我有一个屏幕,并且想要刷新页面,例如,调用该组件的getData();。 使用这种方法,我可以导航到该屏幕,并且当我在该屏幕上时收到通知。借助键,我可以导航到该屏幕。

让我们说我要进入OrderDetail屏幕,当我收到通知时,它将导航到Order Detail, Home Screen --> Order Detail  现在,如果我在OrderDetail内并且收到通知,那将是

Home Screen ---> Order Detail ---> Order Detail  ...等等' 在这种情况下如何处理推送通知?

1 个答案:

答案 0 :(得分:1)

可能...在主页详细信息页面上以不同方式处理推送通知。

首页页面上说,在didFocus时收听通知,在willBlur时删除监听器。因此,处理程序仅在用户位于 Home 上时才会执行操作。并导航(路由)到首页页面的通知处理程序中的“详细信息”。

同样,在详细信息页面上,在didFocus时收听通知,在willBlur时删除监听器。当处理程序仅在收到通知时更新内容。

---编辑---

首页:

constructor() {
  this.props.navigation.addListener(
    'willBlur',() => {
      OneSignal.removeEventListener('received');
      OneSignal.removeEventListener('opened');
    }
  );

  this.props.navigation.addListener(
    'didFocus',() => {
      OneSignal.addEventListener('received');
      OneSignal.addEventListener('opened');
    }
  );
}
// handler implementation is the same

详细信息:

//same lifecycle implementation
// but different handler
onOpened = (data) => {
const { notification: { payload } } = data;
if (payload.additionalData) {
    if (payload.additionalData.params) {
        this.setState(paramsUsedByDetail: payload.additionalData.params);
    }
}