我想从客户端(Android应用程序)管理主题订阅。我目前正在onCreate()上进行活动。我想知道正确的方法是在InstanceIdService :: onTokenRefresh()上订阅/取消订阅,还是在任何方便的时候(点击按钮等)。
简而言之,如果我在客户端管理主题订阅(没有服务器),我是否仍然需要使用InstanceIdService?
不同的文档来源对Firebase Cloud Messaging(FCM)主题订阅提供了不同的看法。有些人提到InstanceIdService,有些则没有。他们在这里:
在谈论主题订阅时,它没有提到InstanceIdService。
完成设置任务后,您可以添加客户端代码 订阅主题,然后处理发送到主题的消息。
客户端应用可以订阅任何现有主题,也可以创建 新话题。当客户端应用程序订阅新主题名称(一个 您的Firebase项目尚不存在),这是一个新主题 name在FCM中创建,任何客户端随后都可以订阅 它
要订阅主题,客户端应用程序会调用Firebase云消息传递 subscribeToTopic()与FCM主题名称:
FirebaseMessaging.getInstance().subscribeToTopic("news");
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);
}
}
它使用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);
}
答案 0 :(得分:2)
如您所知,FirebaseInstanceId
可能是单例类,您可以在其中检索注册令牌。所以我认为subscribeToTopic()
方法,因为只传递了主题的名称,你可以假设它已经调用FirebaseInstanceId
本身的实例,或者只是向FCM服务器发送请求相应的注册令牌及其应订阅的主题。
长话短说,我不认为您需要将FirebaseInstanceIdService
延伸至subscribeToTopic()
,但我认为&{ #39; s必不可少,因为(如docs 所述),它是:
用于处理Firebase实例ID令牌刷新事件的基类。
您的其他问题。
我想从客户端(Android应用)管理主题订阅。我目前正在活动
onCreate()
进行此操作。我想知道正确的方法是在InstanceIdService::onTokenRefresh()
订阅/取消订阅,还是在任何方便(按钮点击等)?
我认为在onCreate()
中这样做是可以的。如果你看到我的回答here,@ FrankkuPuffelen提到:
订阅应用开始的主题很好。
但是,我认为在subscribeToTopic()
中添加onTokenRefresh()
来电也是一件好事,这样只要为应用实例提供新令牌,您就可以了。我会立即订阅它。
注意我在此思考的行为是,当注册令牌失效时,它的订阅也会丢失,并且subscribeToTopic()
在{{1}中添加会立即为你重新订阅它们(当然这仍然取决于你想要订阅它的主题的实现)。