Android:订阅Firebase云消息(FCM)主题
根据,为用户订阅一个主题,我需要调用Android:订阅Firebase云消息(FCM)主题,android,firebase,firebase-cloud-messaging,Android,Firebase,Firebase Cloud Messaging,根据,为用户订阅一个主题,我需要调用 FirebaseMessaging.getInstance().subscribeToTopic("news"); 在我的应用程序中,我需要所有用户都订阅我的云 消息传递主题。由于返回值是void,问题是如何返回 我能理解订阅成功了吗 每次我工作时调用subscribeToTopic是一种不好的做法吗 申请开始 一,。我如何理解订阅成功 编辑: 您现在可以通过添加addOnSuccessListener() FirebaseMessaging.getIns
FirebaseMessaging.getInstance().subscribeToTopic("news");
subscribeToTopic
是一种不好的做法吗
申请开始addOnSuccessListener()
FirebaseMessaging.getInstance().subscribeToTopic(“新闻”).addOnSuccessListener(新OnSuccessListener()){
@凌驾
成功时公开作废(作废避免){
Toast.makeText(getApplicationContext(),“Success”,Toast.LENGTH_LONG.show();
}
});
原件:
文档中没有明确提到订阅成功时收到的响应
但是,如果您需要强制所有用户订阅特定主题,您应该在应用程序的第一次安装时调用subscribbetotopic
。这将很可能确保连接到internet(因为它可能是通过Play Store下载和安装的)并且订阅成功
然而,如果你想确定,你也可以通过你自己的应用服务器处理he检查。如报告中所述:
您可以利用实例ID API从服务器端执行基本的主题管理任务。给定客户端应用程序实例的注册令牌,您可以执行以下操作:
- 查找有关客户端应用程序实例订阅的详细信息,包括每个主题名称和订阅日期。看
subscribeToTopic
二,。每次应用程序启动时调用SubscribeToPic是否是一种不好的做法
编辑:从评论部分添加:在应用程序开始时订阅应该可以
感谢@FrankvanPuffelen的验证。:) 我已经编写了这个函数并进行了测试。可能会有帮助
private void subscribeToMessaging(){
SharedPreferences prefs = getSharedPreferences(SETTINGS_TITLE, MODE_PRIVATE);
// Getting value from shared preferences
boolean isSubscriptionEnable = prefs.getBoolean(SETTING_NOTIFICATION, true);
// if "isSubscriptionEnable" is true then check whether its already subscribed or not
if (isSubscriptionEnable){
boolean alreadySubscribed = prefs.getBoolean(SETTING_ALREADY_SUBSCRIBED, false);
// if not already subscribed then subscribe to topic and save value to shared preferences
if (!alreadySubscribed){
FirebaseMessaging.getInstance().subscribeToTopic("global").addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
}
});
SharedPreferences.Editor editor = getSharedPreferences(SETTINGS_TITLE, MODE_PRIVATE).edit();
editor.putBoolean(SETTING_ALREADY_SUBSCRIBED, true);
editor.apply();
Toast.makeText(this, "Subscribed", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Already subscribed", Toast.LENGTH_LONG).show();
}
}
}
2) 不,订阅应用程序开始时的主题是可以的。@VSB:
subscribeToPic
将在后台继续重试,但它与应用程序生命周期(还没有与google服务)相关。因此,如果您的应用程序被终止,它将停止重试,直到应用程序再次打开。(该操作已存储,因此在再次启动应用程序时将继续)只有当用户删除应用程序数据时,重试才会永远停止工作。(不是缓存,这并不重要)。请注意,删除应用程序数据与卸载和重新安装相同,这适用于任何其他库或功能。不仅仅是对FCM。我是FCM团队中的谷歌开发者。您是对的,SubscribeTopic没有像我在这里描述的那样清晰地记录下来。我将研究在javadoc中为将来的一个版本添加完整的文档。@CleytonT。这在技术上是没有必要的。这可能取决于您的用例。例如,如果您想要一个所有用户都是其成员的全局主题,则必须确保他们已订阅该主题。在应用程序启动时使用subscribe方法可以保证这一点。将订阅放入onTokenRefresh
是不必要的,因为当令牌被刷新时,它们相应的主题订阅会继续进行。有时订阅主题可能会导致失败。@Sai我添加了addOnSuccessListener
以确认订阅成功与否。我希望这会有帮助。
private void subscribeToMessaging(){
SharedPreferences prefs = getSharedPreferences(SETTINGS_TITLE, MODE_PRIVATE);
// Getting value from shared preferences
boolean isSubscriptionEnable = prefs.getBoolean(SETTING_NOTIFICATION, true);
// if "isSubscriptionEnable" is true then check whether its already subscribed or not
if (isSubscriptionEnable){
boolean alreadySubscribed = prefs.getBoolean(SETTING_ALREADY_SUBSCRIBED, false);
// if not already subscribed then subscribe to topic and save value to shared preferences
if (!alreadySubscribed){
FirebaseMessaging.getInstance().subscribeToTopic("global").addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
}
});
SharedPreferences.Editor editor = getSharedPreferences(SETTINGS_TITLE, MODE_PRIVATE).edit();
editor.putBoolean(SETTING_ALREADY_SUBSCRIBED, true);
editor.apply();
Toast.makeText(this, "Subscribed", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Already subscribed", Toast.LENGTH_LONG).show();
}
}
}
public static final String SETTINGS_TITLE = "settings";
public static final String SETTING_NOTIFICATION = "notification_state";
public static final String SETTING_ALREADY_SUBSCRIBED = "already_subscribed";