如何在google-services.json中放置多个project_number / sender id

时间:2016-06-22 17:27:12

标签: android firebase google-cloud-messaging firebase-cloud-messaging

我希望能够在我的Android应用中添加多个发件人ID。

来自https://developers.google.com/cloud-messaging/concept-options

  

GCM允许多方向同一客户端应用发送消息。例如,假设客户端应用程序是具有多个贡献者的文章聚合器,并且每个人都应该能够在发布新文章时发送消息。此消息可能包含URL,以便客户端应用程序可以下载该文章。 GCM不必将所有发送活动集中在一个位置,而是让您能够让每个贡献者发送自己的消息。

如何使用google-services.json配置文件实现这一目标?

4 个答案:

答案 0 :(得分:7)

更新:要参考官方和推荐的方式来代替 hacky 和非官方方法来防止/避免未知问题。从我的回答here

documentation中有关于此主题的部分内容:

  

接收来自多个发件人的邮件

     

FCM允许多方向同一客户端应用发送消息。例如,假设客户端应用程序是具有多个贡献者的文章聚合器,并且每个人都应该能够在发布新文章时发送消息。此消息可能包含URL,以便客户端应用程序可以下载该文章。 FCM不必将所有发送活动集中在一个位置,而是让您能够让每个贡献者发送自己的消息。

     

为了实现这一点,请确保每个发件人都生成自己的sender ID。有关如何获取FCM发件人ID的信息,请参见所用平台的客户端文档。请求注册时,客户端应用程序会多次提取令牌,每次在受众群体字段中使用不同的发件人ID。

     

最后,与相应的应用服务器共享注册令牌(以完成FCM注册客户端/服务器握手),并且他们将能够使用自己的身份验证密钥向客户端应用程序发送消息。

     

请注意,限制为100个多个发件人。

我认为这里令人困惑但重要的部分是:

  

请求注册时,客户端应用会多次提取令牌,每次都会在受众群体字段中使用不同的发件人ID。

换句话说,您必须致电getToken()传递发件人ID并简单地"FCM"(例如getToken("2xxxxx3344", "FCM"))作为参数。您必须确保为所需的每个发件人(项目)拨打此电话。

另外,请注意getToken()文档:

  

这是一个阻塞函数,所以不要在主线程上调用它。

一些额外的好消息:

  • 如果失败,则不会自动重试。
  • 失败时返回IOException。

答案 1 :(得分:1)

截至2016年12月,有一种非常简单的,非骇客的方式来执行此操作,该方法现在仍有效(2018年7月)。

FirebaseOptions options = new FirebaseOptions.Builder()
       .setApplicationId("1:something:android:something_else") // Required for Analytics.
       .setApiKey("your apikey") // Required for Auth.
       .setDatabaseUrl("https://your-database.firebaseio.com/") // Required for RTDB.
       .build();
FirebaseApp.initializeApp(this /* Context */, options, "secondary");

来源:The official Firebase blog

答案 2 :(得分:0)

逗号分隔的senderID解决方案仍在工作,并且能够为2个不同的发送者注册相同的令牌。我使用2个不同的api密钥向该单个魔术令牌发送了推送通知,并且能够接收两个api密钥的推送通知。希望它至少能持续到2020年底。因为我正在尝试在一个针对超过100万用户的旧版GCM和FCM项目之间进行无缝过渡。 (请听我说google,并感谢您google不赞成使用这种出色的解决方案)

String magicalToken = FirebaseInstanceId.getInstance()。getToken(“ senderId,anotherSenderId”,“ FCM”);

答案 3 :(得分:-2)

您可以通过将多个发件人作为逗号分隔的字符串传递来获取单个发件人的令牌,然后这些发件人将能够使用公共令牌发送推送通知,尝试调用

  

FirebaseInstanceId.getInstance().getToken(“ senderId1,senderId2”,                   FirebaseMessaging.INSTANCE_ID_SCOPE);

确保从后台线程调用此方法。