FCM - Отправить в темы и ошибка «Не зарегистрирован»

Я разработал приложение для Android, которое подписывается на тему (subscribeToTopic() в OnCreate основного действия), а затем получает уведомления, отправленные моим сервером в эту тему.

Проблема в том, что время от времени кто-то жалуется, что перестают приходить уведомления. В этом случае я обычно прошу пользователя использовать функцию, включенную в мое приложение, которая считывает регистрационный токен Firebase и отправляет его мне по электронной почте (обычно я его не использую и не храню).

Затем я пытаюсь отправить уведомление на этот сервер Token и FCM с ошибкой Not Registered! Как это может быть Not Registered? При использовании подписки на тему не должен ли Firebase управлять всем «процессом токена» и заботиться о его продлении?

Есть ли способ сообщить приложению, что оно больше не зарегистрировано, и предпринять соответствующие действия? Спасибо.


person mdicosimo    schedule 09.02.2017    source источник
comment
При перекрестной публикации укажите: groups.google.com/forum/ #!topic/firebase-talk/nnDDJItxtHQ   -  person Frank van Puffelen    schedule 09.02.2017
comment
Вы упомянули, что ваше приложение считывает регистрационный токен Firebase. Откуда вы читаете токен? Вы читаете его откуда-то в своем приложении, где он хранится, или вы вызываете getToken()? Также знаете ли вы, удалил ли пользователь и переустановил приложение или обновил приложение, поскольку эти действия могут сделать существующий токен недействительным.   -  person Arthur Thompson    schedule 09.02.2017
comment
Вы заметили, происходит ли это на некоторых конкретных устройствах? также, использовал ли пользователь кнопку принудительной остановки в настройках вашего приложения в прошлом?   -  person Diego Giorgini    schedule 10.02.2017
comment
Разве это не должно обрабатываться на стороне клиента? Поместив еще один subscribeToTopic() в onTokenRefresh()?   -  person AL.    schedule 10.02.2017
comment
Совокупные ответы: - мое приложение считывает токен из getToken() в onTokenRefresh() и сохраняет его в настройках; - не знаю, удалил ли пользователь/переустановил/обновил приложение, но поскольку subscribeToTopic() вызывается в OnCreate, в большинстве случаев это не имеет значения; - У меня нет статистики о модели устройства или версии Android, но я собираюсь создать ее; - subscribeToTopic() в onTokenRefresh() звучит правильно: я попробую; может быть, потребуются дни, чтобы понять, сработало ли это   -  person mdicosimo    schedule 10.02.2017
comment
@mdicosimo Дайте нам знать, если это сработает. Ваше здоровье!   -  person AL.    schedule 11.02.2017
comment
Кстати: subscribeToTopic() в onCreate() в порядке. нет необходимости помещать его внутрь onTokenRefresh(). Меня больше беспокоят конкретные проблемы с устройством.   -  person Diego Giorgini    schedule 11.02.2017
comment
После добавления subscribeToTopic() в onTokenRefresh() кажется, что проблема устранена, так как я получаю меньше жалоб. Тем не менее, некоторые пользователи все еще испытывают это, и я понятия не имею, как понять, почему. Кажется, это не ограничивается какой-либо моделью телефона или поставщиком: большинство чехлов были от телефонов Samsung, но некоторые были также от Asus и Sony.   -  person mdicosimo    schedule 02.06.2017
comment
О проблеме постоянно сообщают: время от времени кто-то из пользователей жалуется на то, что уведомления не работают; когда я пытаюсь отправить уведомление на токен этого пользователя, ответ Не зарегистрирован. Почему??? :-(   -  person mdicosimo    schedule 08.07.2017
comment
Опять же, другой пользователь сообщил о проблеме. Он подтвердил, что приложение было установлено, но когда я отправил уведомление, ответ был «Не зарегистрирован».   -  person mdicosimo    schedule 04.09.2017
comment
@mdicosimo ты решил свою проблему или нет? потому что у меня такие же проблемы.   -  person dipali    schedule 29.11.2017
comment
Нет, приятель, извини. Со временем об этом сообщают реже: я не знаю, связано ли это с тем, что я теряю пользователей, или FCM улучшается :-) Последние отчеты были с телефонов Samsung.   -  person mdicosimo    schedule 30.11.2017
comment
Вы нашли решение этой проблемы? Мы столкнулись с той же проблемой   -  person Konza    schedule 18.04.2018
comment
Нет, я этого не делал. Кажется, что это происходит реже, но у меня все еще есть некоторые жалобы. Последние всегда были от телефонов Самсунг (последние модели). Не могли бы вы поделиться своим опытом?   -  person mdicosimo    schedule 19.04.2018
comment
Я также вижу эту ошибку, о которой сообщают пользователи устройств Samsung. Есть ли удача в годы, прошедшие с тех пор, как это было опубликовано?   -  person Unome    schedule 05.04.2020


Ответы (1)


Это не совсем для вашего случая, но посмотрите, поможет ли это! Я столкнулся с той же проблемой. Вот как я это исправил (зависит от iOS, Android работал из коробки) -

  1. Удалите приложение с телефона
  2. Очистите ВСЕ токены, хранящиеся в вашей базе данных для этой конкретной учетной записи (или как вы настроили ее в своем бэкэнде. В моем случае токены привязаны к учетной записи)
  3. В компоненте Didmount-

    асинхронный компонентDidMount() { this.checkPermission(); this.createNotificationListeners(); }

4.

  async checkPermission() {
    const enabled = await firebase.messaging().hasPermission();
    if (enabled) {
      this.getToken();
    } else {
      this.requestPermission();
    }
  }

  async requestPermission() {
    try {
      await firebase.messaging().requestPermission();
      // User has authorised
      this.getToken();
    } catch (error) {
      // User has rejected permissions
      console.log('permission rejected');
    }
  }

  async getToken() {
    try {
      const enabled = await firebase.messaging().hasPermission();
      if (!enabled) {
        await firebase.messaging().requestPermission();
      }

      const fcmToken = await firebase.messaging().getToken();
      if (fcmToken) {
        console.log("got token");
        console.log('fcm token:', fcmToken); //-->use this token from the console to send a post request via postman
        this.setState({ fcmToken });
        return fcmToken;
      }
    } catch (error) {
      console.warn('notification token error', error);
    }
  }

5.

 async createNotificationListeners() {
    /*
    * Triggered when a particular notification has been received in foreground
    * */
    this.notificationListener = firebase.notifications().onNotification((notification) => {
        const { title, body } = notification;
        this.showAlert(title, body);
    });

    /*
    * If your app is in background, you can listen for when a notification is clicked / tapped / opened as follows:
    * */
    this.notificationOpenedListener = firebase.notifications().onNotificationOpened((notificationOpen) => {
        const { title, body } = notificationOpen.notification;
        this.showAlert(title, body);
    });

    /*
    * If your app is closed, you can check if it was opened by a notification being clicked / tapped / opened as follows:
    * */
    const notificationOpen = await firebase.notifications().getInitialNotification();
    if (notificationOpen) {
        const { title, body } = notificationOpen.notification;
        this.showAlert(title, body);
    }
    /*
    * Triggered for data only payload in foreground
    * */
    this.messageListener = firebase.messaging().onMessage((message) => {
      //process data message
      console.log(JSON.stringify(message));
    });
  }
  1. Наконец, используйте токен, который вы видите в консоли, в качестве значения для ключа «to» в вашем почтовом запросе. Вы больше не должны видеть ошибку «notRegistered» и должны получать push-уведомления. Готово!!

Цитаты-https://medium.com/@anum.amin/react-native-integrating-push-notifications-using-fcm-349fff071591

person Purnima Naik    schedule 29.05.2019
comment
Спасибо, но мой вопрос был об Android. У меня нет опыта работы с iOS. В любом случае, ваше предложение довольно сложно применить на практике с каким-то пользователем, которого я не знаю лично и который может жить в километрах от меня ;-) - person mdicosimo; 01.06.2019