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

rpa*_*abi 6 android firebase firebase-cloud-messaging

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

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

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

  1. 使用Firebase控制台发送主题消息的 Firebase指南

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

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

客户端应用程序可以订阅任何现有主题,也可以创建新主题.当客户端应用程序订阅新主题名称(Firebase项目尚不存在)时,将在FCM中创建该名称的新主题,随后任何客户端都可以订阅该主题.

要订阅主题,客户端应用程序会使用FCM主题名称调用Firebase Cloud Messaging subscribeToTopic():

FirebaseMessaging.getInstance().subscribeToTopic("news");
Run Code Online (Sandbox Code Playgroud)
  1. Firebase Android Codelab

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);
   }
}
Run Code Online (Sandbox Code Playgroud)
  1. github上的Firebase快速入门项目

它使用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();
    }
});
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

AL.*_*AL. 2

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

长话短说,我不认为您需要扩展 to FirebaseInstanceIdServicecall subscribeToTopic(),但是,我认为这是必要的,因为(如文档中所述)它是:

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


对于您的其他询问。

我想从客户端(Android 应用程序)管理主题订阅。我目前正在做活动onCreate()InstanceIdService::onTokenRefresh()我想知道正确的方法是否是在方便时或在任何方便的时间(单击按钮等)订阅/取消订阅?

我认为这样做onCreate()是可以的。如果你在这里看到我的答案,@FrankvanPuffelen 提到:

在应用程序启动时订阅主题就可以了。

subscribeToTopic()但是,我认为在 中添加调用也很好onTokenRefresh(),这样一旦为应用程序实例提供了新令牌,您就会立即相应地订阅它。

请注意,我在这里想到的行为是,当注册令牌失效时,它的订阅也会丢失,并且添加subscribeToTopic()onRefreshToken()立即为您重新订阅它们(当然,这仍然取决于您要订阅的主题的实现)它)。