Android:订阅Firebase云消息传递(FCM)主题

VSB*_*VSB 21 android firebase firebase-cloud-messaging

根据Firebase云消息传递文档,用于订阅用户我需要调用的主题

FirebaseMessaging.getInstance().subscribeToTopic("news");
Run Code Online (Sandbox Code Playgroud)
  1. 在我的应用程序中,我需要所有用户订阅我的云消息传递主题.既然返回值是void,问题是我如何理解订阅是否成功?
  2. subscribeToTopic每次我的应用程序启动时调用是不好的做法 ?

AL.*_*AL. 20

1.我如何理解订阅是否成功?

编辑:

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

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

原版的:

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

但是,如果您需要强制所有用户订阅特定主题,则应subscribeToTopic首先安装应用程序.这很可能会确保与互联网连接(因为它可能已经通过Play商店下载和安装)并且订阅成功.

但是,如果您想确定,您还可以通过自己的App Server进行检查.如文档中所述:

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

检查注册令牌,如果他们没有成功地附加到您的主题,请向其发送通知,它将触发您的客户端应用程序呼叫subscribeToTopic.

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

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

谢谢@FrankvanPuffelen进行验证.:)

  • 我是FCM团队的Google开发人员.你是对的,subscribeToTopic没有像我在这里描述的那样清楚地记录.我将考虑在javadoc中为将来的一个版本添加完整的文档. (5认同)
  • 2)不,订阅应用程序启动的主题是好的. (3认同)
  • @VSB:`subscribeToTopic`将继续在后台重试,但它与你的应用程序生命周期有关(而不是google服务).因此,如果您的应用程序被终止,它将停止重试,直到应用程序再次打开.(该操作已存储,因此当应用程序再次启动时将恢复该操作) (3认同)
  • 仅当用户删除应用程序数据时,重试才会永久停止.(不是缓存,这不重要).请注意,删除应用数据与卸载和重新安装相同,这适用于任何其他库或功能.不仅仅是FCM. (3认同)
  • @CleytonT。从技术上来说,这不是*必要*。这可能取决于您的用例。例如,如果您想让所有用户都参与其中的全局主题,则必须确保他们已订阅该主题。在应用启动时放上subscription方法可以保证这一点。不需要将订阅放入onTokenRefresh中,因为当令牌被“刷新”时,它们对应的主题订阅将被保留。 (3认同)
  • @DiegoGiorgini 任何人都可以评论一下,如果用户已经订阅了某个主题,FCM/Firebase 如何处理尝试再次将同一用户订阅同一主题? (3认同)
  • subscribeToTopic() 不会停止重试。但它足够智能,可以检测设备是否离线,如果是,则在设备重新在线之前不会重试。但是正如我上面写的,这个逻辑包含在应用程序代码中,所以如果应用程序被 Android(低资源、打盹模式等)杀死,那么重试逻辑可能会停止/延迟,直到用户再次打开应用程序。 (2认同)