FCM - 发送到主题和“未注册”错误

Posted

技术标签:

【中文标题】FCM - 发送到主题和“未注册”错误【英文标题】:FCM - Send to topics and "Not Registered" error 【发布时间】:2017-06-27 18:41:59 【问题描述】:

我开发了一个 android 应用,它订阅了一个主题(subscribeToTopic() in OnCreate of main activity),然后接收我的服务器发送到该主题的通知。

问题在于,不时有人抱怨通知停止到达。在这种情况下,我通常会要求用户使用包含在我的应用程序中的函数,该函数读取 Firebase 注册令牌并通过电子邮件将其发送给我(我通常不使用或存储它)。

然后,我尝试向该令牌发送通知,FCM 服务器以Not Registered 错误回答!怎么会是Not Registered?使用主题订阅时,Firebase 不应该管理整个“token 流程”并照顾它的更新吗?

有没有办法通知应用程序它不再注册并采取适当的措施?谢谢。

【问题讨论】:

交叉发帖时请注明:groups.google.com/forum/#!topic/firebase-talk/nnDDJItxtHQ 您提到您的应用“读取 Firebase 注册令牌”。你从哪里读取令牌?您是从应用程序中存储它的某个位置读取它,还是在调用 getToken()?您是否知道用户是否卸载并重新安装了应用程序,或者他们是否更新了应用程序,因为这些操作会使现有令牌无效。 您是否注意到这是否发生在某些特定设备上?另外,用户过去是否在您的应用设置中使用过“强制停止”按钮? 不应该在客户端处理吗?通过在onTokenRefresh() 中添加另一个subscribeToTopic() 累积答案:-我的应用程序从getToken() 中的onTokenRefresh() 中读取令牌并将其存储在首选项中; - 不知道用户是否卸载/重新安装/更新应用程序,但由于在OnCreate 中调用了subscribeToTopic(),因此在大多数情况下应该不相关; - 我没有关于设备型号或安卓版本的统计信息,但我要创建一个; - onTokenRefresh() 中的 subscribeToTopic() 听起来不错:我要试试;也许需要几天时间才能了解它是否有效 【参考方案1】:

这不完全适合您的情况,但看看它是否有帮助! 我面临着同样的问题。这是我修复它的方法(ios 特定,android 开箱即用)-

    从您的手机中卸载应用程序 清除存储在数据库中此特定帐户的所有令牌(或者您已在后端设置它。在我的情况下,令牌与帐户相关联)

    在componentDidmount-

    异步组件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));
    );
  
    最后,使用您在控制台中看到的令牌作为您发布请求中“to”键的值。您应该不会再看到“notRegistered”错误,并且应该会收到推送通知。 完成!

引用-https://medium.com/@anum.amin/react-native-integrating-push-notifications-using-fcm-349fff071591

【讨论】:

谢谢,但我的问题是关于 Android 的。我对iOS没有任何经验。无论如何,您的建议很难与一些我个人不认识的用户付诸实践,并且可能离我很远;-)

以上是关于FCM - 发送到主题和“未注册”错误的主要内容,如果未能解决你的问题,请参考以下文章

提供的注册令牌未注册

Chrome Firebase 云消息 - 未注册

FCM android onmessagereceived not called

如何检查通过 FCM 发送到主题的消息的统计信息?

Firebase 云消息传递 - iOS - 未注册或无法订阅主题

GCM IOS 未注册问题