Как исправить отправку уведомлений FCM после обновления приложения из магазинов - PullRequest
0 голосов
/ 12 июня 2019

Я внедрил реактивную базу-огонь и использую функции облачных сообщений для отправки push-уведомлений нашим пользователям. Он прекрасно работает, пока приложение не будет обновлено. При обновлении из магазинов устройства перестают получать push-уведомления.

Это собственное приложение реагирования, и я использую функцию getToken в firebase в componentDidMount в моем Home-компоненте (первая страница после аутентификации (с использованием реакции-навигации)). Я думал, что onTokenRefresh-listener обновит токен после обновления, но, очевидно, нет, так как он обновляет только эти действия: - Приложение удаляет идентификатор экземпляра - Приложение восстановлено на новом устройстве - Пользователь удаляет / переустанавливает приложение - Пользователь очищает данные приложения

// Home-component

componentDidMount(){
  this.checkPermission();
}

async checkPermission() {
  firebase.messaging().hasPermission()
  .then(enabled => {
    if (enabled) {
      // user has permissions
      this.getToken();
      this.createNotificationListeners();
    } else {
      // user doesn't have permission
      this.requestPermission();
    }
  })
  .catch(error => {
    console.log('Check - Error', error);
  });
}

async getToken() {
  const value = await AsyncStorage.getItem('fcmToken');
  firebase.messaging().getToken().then((fcmToken) => {
    if (fcmToken) {
      // user has a device token
      if(value !== fcmToken){
        AsyncStorage.setItem('fcmToken', fcmToken);
        this.save_token_to_db(fcmToken);
      }
    }
  })
}

async requestPermission() {
  firebase.messaging().requestPermission()
  .then(() => {
    // User has authorised
    this.getToken();
    this.createNotificationListeners();
  })
}

save_token_to_db = () => {
  // just an update-call to our servers
}

async createNotificationListeners() {
  this.onTokenRefreshListener = 
  firebase.messaging().onTokenRefresh(fcmToken => {
    this.save_token_to_db(fcmToken);
  });

  this.notificationDisplayedListener = 
    firebase.notifications().onNotificationDisplayed((notification: 
    Notification) => {
  });

  this.notificationListener = 
    firebase.notifications().onNotification((notification) => {
    const { title, body } = notification;
  });

  this.notificationOpenedListener = 
   firebase.notifications().onNotificationOpened((notificationOpen) => {
      const { title, body } = notificationOpen.notification;
  });

  const notificationOpen = await 
  firebase.notifications().getInitialNotification();
  if (notificationOpen) {
    const { title, body } = notificationOpen.notification;
  }

  this.messageListener = firebase.messaging().onMessage((message) => {

  });
}

componentWillUnmount(){
  this.notificationListener();
  this.notificationOpenedListener();
  this.onTokenRefreshListener();
  this.notificationDisplayedListener();
}

Я ожидал, что onTokenRefreshListener получит обновленный токен при appupdate. Но это не так. Затем я попытался выполнить getToken для каждого монтирования Home-компонента (убедившись, что это происходит только один раз при каждой загрузке приложения, чтобы минимизировать вызовы (код для этого не включен)), проверяя, не соответствует ли он тому, который сохранен в AsyncStorage. Но это все еще не работает. Push-уведомления работают после переустановки приложения, но не при appupdate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...