【问题标题】:React-Native Handle push notification with react-navigationReact-Native 使用 react-navigation 处理推送通知
【发布时间】:2018-12-12 17:34:19
【问题描述】:

我需要处理推送通知,我正在使用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 ...等等' 在这种情况下如何处理推送通知?

【问题讨论】:

  • 处理父组件的通知。像 App Root 或一些只处理通知的包装器。
  • 那么我将如何导航到屏幕?如果我在屏幕上,则刷新数据

标签: javascript react-native react-navigation


【解决方案1】:

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

说,在首页页面,didFocus时监听通知,willBlur时移除监听器。因此,只有当用户在 Home 上时,处理程序才会起作用。并在主页页面的通知处理程序中导航(路由)到“详细信息”。

同样,在Detail页面,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);
    }
}

【讨论】:

  • 你能举个例子吗?
  • 当我这样做时,由于某种原因我的 removeListeners 不起作用...我主屏幕中的侦听器处于活动状态,它们仅在我在详细信息页面上时不起作用...在其他页面...我的家庭听众很活跃....也许在详细页面中也是如此....但它只是写了家庭听众
  • 您认为这是由您在componentDidMount 中现有的添加侦听器引起的吗? willBlurdidFocus 是否在构造函数中处理?
  • 用这种方法我必须在每个屏幕上添加一个通知监听器,有没有有效的解决方案?
  • 当然。我会推荐 Flux(尝试谷歌“初学者的 Flux”,blog.andrewray.me 有一篇很好的文章),我相信它就是为此目的而设计的。
猜你喜欢
  • 2019-06-10
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多