我是否需要扩展FirebaseInstanceIdService才能订阅FCM主题?

时间:2016-10-19 10:48:06

标签: android firebase firebase-cloud-messaging

我想从客户端(Android应用程序)管理主题订阅。我目前正在onCreate()上进行活动。我想知道正确的方法是在InstanceIdService :: onTokenRefresh()上订阅/取消订阅,还是在任何方便的时候(点击按钮等)。

简而言之,如果我在客户端管理主题订阅(没有服务器),我是否仍然需要使用InstanceIdService?

不同的文档来源对Firebase Cloud Messaging(FCM)主题订阅提供了不同的看法。有些人提到InstanceIdService,有些则没有。他们在这里:

  1. Send Topic Messages with Firebase Console
  2. 上的Firebase指南

    在谈论主题订阅时,它没有提到InstanceIdService。

      

    完成设置任务后,您可以添加客户端代码   订阅主题,然后处理发送到主题的消息。

         

    客户端应用可以订阅任何现有主题,也可以创建   新话题。当客户端应用程序订阅新主题名称(一个   您的Firebase项目尚不存在),这是一个新主题   name在FCM中创建,任何客户端随后都可以订阅   它

         

    要订阅主题,客户端应用程序会调用Firebase云消息传递   subscribeToTopic()与FCM主题名称:

    FirebaseMessaging.getInstance().subscribeToTopic("news");
    
    1. Firebase Android Codelab
    2.   

      MyFirebaseInstanceIdService类将是一个用于处理的服务   FCM逻辑。此服务用于在新的时候警告应用程序   生成InstanceID令牌,并检索生成的令牌。

           

      修改它以扩展FirebaseInstanceIdService并覆盖   订阅主题的onTokenRefresh方法。使用以下代码   将MyFirebaseInstanceIdService中的onTokenRefresh方法更新为   看起来像这样:

      public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
      
         private static final String TAG = "MyFirebaseIIDService";
         private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage";
      
         /**
          * The Application's current Instance ID token is no longer valid 
          * and thus a new one must be requested.
          */
         @Override
         public void onTokenRefresh() {
             // If you need to handle the generation of a token, initially or
             // after a refresh this is where you should do that.
             String token = FirebaseInstanceId.getInstance().getToken();
             Log.d(TAG, "FCM Token: " + token);
      
             // Once a token is generated, we subscribe to topic.
             FirebaseMessaging.getInstance()
                     .subscribeToTopic(FRIENDLY_ENGAGE_TOPIC);
         }
      }
      
      1. Firebase quickstart project on github
      2. 它使用InstanceIdService,但主题订阅不会在那里发生。它只是在客户端中完成,作为活动中按钮点击的一部分:

        Button subscribeButton = (Button) findViewById(R.id.subscribeButton);
        subscribeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // [START subscribe_topics]
                FirebaseMessaging.getInstance().subscribeToTopic("news");
                // [END subscribe_topics]
        
                // Log and toast
                String msg = getString(R.string.msg_subscribed);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });
        

        InstanceIdService代码中的注释建议管理员订阅onTokenRefresh()

        @Override
        public void onTokenRefresh() {
            // Get updated InstanceID token.
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d(TAG, "Refreshed token: " + refreshedToken);
        
            // If you want to send messages to this application instance or
            // manage this apps subscriptions on the server side, send the
            // Instance ID token to your app server.
            sendRegistrationToServer(refreshedToken);
        }
        

1 个答案:

答案 0 :(得分:2)

如您所知,FirebaseInstanceId可能是单例类,您可以在其中检索注册令牌。所以我认为subscribeToTopic()方法,因为只传递了主题的名称,你可以假设它已经调用FirebaseInstanceId本身的实例,或者只是向FCM服务器发送请求相应的注册令牌及其应订阅的主题。

长话短说,我不认为您需要将FirebaseInstanceIdService延伸至subscribeToTopic(),但我认为&{ #39; s必不可少,因为(docs 所述),它是:

  

用于处理Firebase实例ID令牌刷新事件的基类。

您的其他问题。

  

我想从客户端(Android应用)管理主题订阅。我目前正在活动onCreate()进行此操作。我想知道正确的方法是在InstanceIdService::onTokenRefresh()订阅/取消订阅,还是在任何方便(按钮点击等)?

我认为在onCreate()中这样做是可以的。如果你看到我的回答here,@ FrankkuPuffelen提到:

  

订阅应用开始的主题很好。

但是,我认为在subscribeToTopic()中添加onTokenRefresh()来电也是一件好事,这样只要为应用实例提供新令牌,您就可以了。我会立即订阅它。

注意我在此思考的行为是,当注册令牌失效时,它的订阅也会丢失,并且subscribeToTopic()在{{1}中添加会立即为你重新订阅它们(当然这仍然取决于你想要订阅它的主题的实现)。