rpa*_*abi 6 android firebase firebase-cloud-messaging
我想从客户端(Android应用程序)管理主题订阅.我目前正在onCreate()上进行活动.我想知道正确的方法是在InstanceIdService :: onTokenRefresh()上订阅/取消订阅,还是在任何方便(按钮点击等).
简而言之,如果我在客户端管理主题订阅(没有服务器),我是否仍然需要使用InstanceIdService?
不同的文档来源对Firebase Cloud Messaging(FCM)主题订阅提供了不同的看法.有些人提到InstanceIdService,有些则没有.他们来了:
在谈论主题订阅时,它没有提到InstanceIdService.
完成设置任务后,您可以添加客户端代码以订阅主题,然后处理发送到主题的消息.
客户端应用程序可以订阅任何现有主题,也可以创建新主题.当客户端应用程序订阅新主题名称(Firebase项目尚不存在)时,将在FCM中创建该名称的新主题,随后任何客户端都可以订阅该主题.
要订阅主题,客户端应用程序会使用FCM主题名称调用Firebase Cloud Messaging subscribeToTopic():
FirebaseMessaging.getInstance().subscribeToTopic("news");
Run Code Online (Sandbox Code Playgroud)
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)
它使用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)
正如您所知,FirebaseInstanceId它可能是一个单例类,您可以在其中检索注册令牌。所以我认为该subscribeToTopic()方法,由于仅传递了主题的名称,因此您可以假设它已经调用了自身的实例FirebaseInstanceId,或者只是向 FCM 服务器发送带有相应注册令牌和主题的请求订阅了。
长话短说,我不认为您需要扩展 to FirebaseInstanceIdServicecall subscribeToTopic(),但是,我认为这是必要的,因为(如文档中所述)它是:
用于处理 Firebase 实例 ID 令牌刷新事件的基类。
对于您的其他询问。
我想从客户端(Android 应用程序)管理主题订阅。我目前正在做活动
onCreate()。InstanceIdService::onTokenRefresh()我想知道正确的方法是否是在方便时或在任何方便的时间(单击按钮等)订阅/取消订阅?
我认为这样做onCreate()是可以的。如果你在这里看到我的答案,@FrankvanPuffelen 提到:
在应用程序启动时订阅主题就可以了。
subscribeToTopic()但是,我认为在 中添加调用也很好onTokenRefresh(),这样一旦为应用程序实例提供了新令牌,您就会立即相应地订阅它。
请注意,我在这里想到的行为是,当注册令牌失效时,它的订阅也会丢失,并且添加subscribeToTopic()将onRefreshToken()立即为您重新订阅它们(当然,这仍然取决于您要订阅的主题的实现)它)。
| 归档时间: |
|
| 查看次数: |
1942 次 |
| 最近记录: |