安卓:订阅Firebase Cloud Messaging(FCM)主题

35
根据Firebase云消息文档,在将用户订阅到一个主题时,我需要调用:

Firebase cloud messaging documentation

FirebaseMessaging.getInstance().subscribeToTopic("news");
  1. 在我的应用程序中,我需要所有用户订阅我的云消息主题。由于返回值为void,问题是如何确定订阅是否成功?
  2. 每次我的应用程序启动时调用subscribeToTopic是一种不好的做法吗?
2个回答

37

1. 我如何知道订阅成功了?

编辑:

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

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

Translated:

在文档中并没有明确提到当订阅成功时会收到什么样的响应。

然而,如果你需要强制所有用户订阅特定主题,你应该在应用程序第一次安装时调用subscribeToTopic。这很可能会确保与互联网的连接(因为应用程序很可能已通过Play商店下载和安装),并且订阅成功。

但是,如果你想要确保,你也可以通过自己的应用服务器处理检查。正如docs中所述:

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

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

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

编辑:从评论部分添加:在应用程序启动时订阅应该没问题。

感谢@FrankvanPuffelen进行验证。 :)

4
没错,应用启动时订阅主题是可以的。 - Frank van Puffelen
3
subscribeToTopic会在后台持续重试,但它与你的应用程序生命周期相关联(而不是与Google服务相关)。因此,如果您的应用程序被杀死,它将停止重试,直到再次打开该应用程序。(该操作已存储,因此当应用程序再次启动时将被恢复) - Diego Giorgini
3
只有用户删除应用程序数据(而不是缓存,缓存并不重要),才会永久停止重试。请注意,删除应用程序数据与卸载和重新安装相同,适用于任何其他库或功能,不仅适用于 FCM。 - Diego Giorgini
9
我是FCM团队中的Google开发者。 您说得对,subscribeToTopic并没有像我在这里描述的那样清晰地记录。我将研究在将来的版本中为javadoc添加完整的文档。 - Diego Giorgini
4
在技术上并不是必需的,这可能取决于你的使用情况。例如,如果你想要一个所有用户都是成员的全球性主题,那么你必须确保他们已经订阅了它。将订阅方法放在应用程序启动时可以确保这一点。将订阅放在onTokenRefresh中是不必要的,因为当令牌被刷新时,相应的主题订阅会被继承。 - AL.
显示剩余13条评论

4

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

    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";

1
有时候 subscribeToTopic 可能会失败。 - Sai
1
@Sai 我已经添加了 addOnSuccessListener 来确认订阅是否成功。希望这对你有所帮助。 - Pooja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接