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");
  • 在我的应用程序中,我需要所有用户都订阅我的云 消息传递主题。由于返回值是void,问题是如何返回 我能理解订阅成功了吗
  • 每次我工作时调用
    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";