简体   繁体   English

当应用程序更新时react-native-fcm 令牌刷新

[英]react-native-fcm token refresh when app is updated

I am using react-native-fcm component in my RN app for push notifications.我在我的 RN 应用程序中使用 react-native-fcm 组件来推送通知。 It is working perfect but I notice an issue that is driving me crazy, when we release a new version on play store and the app is updated the token expires, we have already saved the old token and we send notifications to that fcm token, so users stops receiving notifications.它运行良好,但我注意到一个让我发疯的问题,当我们在 Play 商店发布新版本并且应用程序更新时令牌过期,我们已经保存了旧令牌并向该 fcm 令牌发送通知,所以用户停止接收通知。

If the user log out and log in again I get the new token but of course I can't force to my users to do that, in the component examples I found a refresh token event but it's not working, do you know why the event is not receiving the new token when it refresh?如果用户注销并再次登录,我会得到新的令牌,但当然我不能强迫我的用户这样做,在组件示例中,我发现了一个刷新令牌事件但它不起作用,你知道为什么会发生这个事件吗?刷新时没有收到新令牌? What I am doing wrong?我做错了什么? Thanks.谢谢。

Here is my code (I deleted some parts for readability):这是我的代码(为了便于阅读,我删除了一些部分):

import React, { Component } from 'react';
import { ScrollView, View, Text, Linking, TouchableOpacity, AppState } from 'react-native';
import { connect } from 'react-redux';
import FCM, { FCMEvent } from 'react-native-fcm';
import { getTopNotification, updateUser } from '../api';
import { topNotificationChanged, logOut } from '../actions';

class Home extends Component {
  constructor() {
    super();
    this.onLogOutPress.bind(this);
  }

  state = { topNotificationLink: '', appState: AppState.currentState };

  componentDidMount() {
    AppState.addEventListener('change', this.handleAppStateChange);
    this.refreshTokenListener = FCM.on(FCMEvent.RefreshToken, fcmToken => {
      updateUser(this.props.user.id, this.props.user.token, { fcmToken });
    });
  }

  componentWillUnmount() {
    AppState.removeEventListener('change', this.handleAppStateChange);
    this.refreshTokenListener.remove();
  }

  handleAppStateChange = (nextAppState) => {
    if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
      this.onFocus();
    }
    this.setState({ appState: nextAppState });
  }

  render() {
    return (
      <ScrollView>
        {this.renderTopNotification()}
        {this.renderMenuOptions()}
      </ScrollView>
    );
  }
}

const mapStateToProps = state => {
  return {
    user: state.auth.user,
    lang: state.auth.lang,
    topNotificationText: state.main.topNotificationText
  };
};

export default connect(mapStateToProps, { topNotificationChanged, logOut })(Home);
import firebase from 'react-native-firebase';
import { RemoteMessage } from 'react-native-firebase';    

componentDidMount() {
    this.checkPermission();
    this.onTokenRefreshListener = firebase.messaging().onTokenRefresh(fcmToken => {
      // Process your token as required
      console.log("Updated Token=" + fcmToken);
    });
    this.messageListener = firebase.messaging().onMessage((message) => {
      // Process your message as required
    });

  }
  componentWillUnmount() {
    this.onTokenRefreshListener();
    this.messageListener();
  }
async checkPermission() {
    const enabled = await firebase.messaging().hasPermission();
    console.log("checkPermission=" + enabled);
    if (enabled) {
      // this.getFCMToken();
      // testTocken();
      let fcmToken = await AsyncStorage.getItem('fcmToken', "");
      console.log("getToken=" + enabled);

      if (!fcmToken) {
        fcmToken = await firebase.messaging().getToken();
        alert(fcmToken);
        if (fcmToken) {
          // user has a device token
          await AsyncStorage.setItem('fcmToken', fcmToken);
        }
      }
    } else {
      this.requestPermission();
    }
  }

  async requestPermission() {
    try {
      await firebase.messaging().requestPermission();
      // User has authorised
      // this.getFCMToken();
      let fcmToken = await AsyncStorage.getItem('fcmToken', "");
      console.log("getToken=" + enabled);

      if (!fcmToken) {
        fcmToken = await firebase.messaging().getToken();
        alert(fcmToken);
        if (fcmToken) {
          // user has a device token
          await AsyncStorage.setItem('fcmToken', fcmToken);
        }
      }
    } catch (error) {
      // User has rejected permissions
      console.log('permission rejected');
    }
  }
const oldToken = await firebase.messaging().getToken();
await firebase.messaging().deleteToken();
const newToken = await firebase.messaging().getToken();
if (oldToken === newToken) {
    console.error('Token has not been refreshed');
} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM