【问题标题】:Android: Subscribe to Firebase Cloud Messaging(FCM) TopicAndroid:订阅 Firebase Cloud Messaging(FCM) 主题
【发布时间】:2017-02-24 14:06:08
【问题描述】:

根据Firebase cloud messaging documentation,为用户订阅我需要调用的主题

FirebaseMessaging.getInstance().subscribeToTopic("news");
  1. 在我的应用程序中,我需要所有用户都订阅我的云 消息传递主题。由于返回值为void,问题是如何 我可以理解订阅成功了吗?
  2. 每次我打电话给subscribeToTopic 是不是一个坏习惯? 应用程序启动了吗?

【问题讨论】:

    标签: android firebase firebase-cloud-messaging


    【解决方案1】:

    1.我怎么知道订阅成功了?

    编辑:

    您现在可以通过添加addOnSuccessListener()来检查订阅是否成功

    FirebaseMessaging.getInstance().subscribeToTopic("news").addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Toast.makeText(getApplicationContext(),"Success",Toast.LENGTH_LONG).show();
            }
        });
    

    原文:

    文档中没有明确提及订阅成功时收到的响应。

    但是,如果您需要强制所有用户订阅特定主题,则应在首次安装应用时致电 subscribeToTopic。这很可能会确保连接到互联网(因为它可能是通过 Play 商店下载和安装的)并且订阅成功。

    但是,如果您想确定,您也可以通过自己的 App Server 处理他的检查。正如docs中提到的:

    您可以利用实例 ID API 从服务器端执行基本主题管理任务。给定客户端应用实例的注册令牌,您可以执行以下操作:

    检查注册令牌,如果它们尚未成功订阅您的主题,请向其发送通知,它将触发您的客户端应用调用subscribeToTopic。

    2.每次我的应用程序启动时调用 subscribeToTopic 是不是一种不好的做法?

    编辑:从 cmets 部分添加它:在应用启动时订阅应该没问题。

    感谢@FrankvanPuffelen 的验证。 :)

    【讨论】:

    • 2) 不,在应用启动时订阅主题就可以了。
    • @VSB:subscribeToTopic 将在后台继续重试,但它与您的应用生命周期相关(尚未与谷歌服务相关)。因此,如果您的应用程序被终止,它将停止重试,直到应用程序再次打开。 (该操作已存储,以便在再次启动应用程序时恢复)
    • 只有当用户删除应用数据时,重试才会永远停止工作。 (不是缓存,那不重要)。请注意,删除应用程序数据与卸载和重新安装相同,这适用于任何其他库或功能。不仅对 FCM。
    • 我是 FCM 团队的一名 Google 开发人员。你说得对,subscribeToTopic 没有像我在这里描述的那样清楚地记录下来。我将考虑在 javadoc 中为未来版本之一添加完整文档。
    • @CleytonT。这在技术上不是必要的。这可能取决于您的用例。例如,如果您想要一个所有用户都是其成员的全局主题,则必须确保他们订阅了该主题。在应用程序启动时放置 subscribe 方法可以保证这一点。将订阅放入onTokenRefresh 是不必要的,因为当令牌刷新 时,它们对应的主题订阅会被结转。
    【解决方案2】:

    我已经编写了这个函数并进行了测试。可能会有所帮助。

        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();
                }
            }
        }
    

    别忘了在 onCreate() 上面写下这几行

        public static final String SETTINGS_TITLE = "settings";
        public static final String SETTING_NOTIFICATION = "notification_state";
        public static final String SETTING_ALREADY_SUBSCRIBED = "already_subscribed";
    

    【讨论】:

    • 有时subscribeToTopic可能会导致失败。
    • @Sai 我已添加addOnSuccessListener 以确认订阅成功与否。我希望它会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2020-04-26
    • 2018-06-17
    • 2017-09-07
    • 2017-03-16
    相关资源
    最近更新 更多