首页 > 解决方案 > 单击通知反应本机 onesignal 时,错误未定义不起作用

问题描述

我正在使用一个信号反应本机库来接收通知,即使我收到通知,一切工作正常,但问题是当我想打开特定屏幕时。当我单击通知时,我收到一个未定义的错误,这是我的代码。

export default class App extends Component {

  constructor(props){
    super(props);

  }

  componentWillMount() {
    OneSignal.init("key");

    OneSignal.addEventListener('received', this.onReceived);
    OneSignal.addEventListener('opened', this.onOpened);
    OneSignal.addEventListener('ids', this.onIds);
  }

  componentWillUnmount() {
      OneSignal.removeEventListener('received', this.onReceived);
      OneSignal.removeEventListener('opened', this.onOpened);
      OneSignal.removeEventListener('ids', this.onIds);
  }

  onReceived(notification) {
      console.log("Notification received: ", notification);
  }

  onOpened(openResult) {
    console.log('Message: ', openResult.notification.payload.body);
    console.log('Data: ', openResult.notification.payload.additionalData, openResult.notification.payload.additionalData.catalog);
    console.log('isActive: ', openResult.notification.isAppInFocus);
    console.log('openResult: ', openResult);

    //if (typeof openResult.notification.payload.additionalData.catalog !== 'undefined'){
      this.props.navigation.navigate('CatalogInfo', {
        query: openResult.notification.payload.additionalData.catalog,
      });
    //}
  }

  onIds(device) {
    console.log('Device info: ', device);
  }

  render() {
    return (
        <RootStack />
    );
  }
}

const NavigationScreen = createStackNavigator(
  {
      Login: LoginScreen,
      Register: RegisterScreen
  }
)

const CustomDrawerComp = (props) => (
  <SafeAreaView styles={{flex: 1}}>
    <ScrollView>
      <DrawerItems {...props} />
    </ScrollView>
  </SafeAreaView>
)


const MainApp = createDrawerNavigator(
  {
      Home: HomeScreen,
      Setting: SettingScreen,
      CatalogInfo: CatalogInfoScreen,
      Slider: ImageSlider,
      Category: CategoryScreen
  },
  {
      contentComponent: CustomDrawerComp
  }
)

const RootStack = createSwitchNavigator(
  {
    AuthLoading: AuthLoadingScreen,
    App: MainApp,
    Auth: NavigationScreen,
  },
  {
    initialRouteName: 'AuthLoading',
  }
);

即使我单击通知 this.props.navigation 未定义

标签: react-nativeonesignal

解决方案


我遇到过同样的问题。我尝试在 App.js 中执行此操作,但导航在那里不起作用,至少在那里添加参数。

所以我最终将它与 AsyncStorage 一起存储在我的主组件(第一个屏幕)上,从 AsyncStorage 加载数据,如果它包含数据,则导航到特定屏幕。

导航有效,当我单击通知并关闭应用程序时,只有 onOpened 不会运行。该应用程序正常打开,但没有导航。再次关闭应用程序并重新打开它,会为我显示带有通知文本的特定屏幕。


推荐阅读