FIrebase FCM - 推送消息以错误的应用程序结束

时间:2017-08-19 07:31:22

标签: ios firebase firebase-cloud-messaging

我正在使用Firebase云消息传递向iOS应用提供推送消息。 我的FCM设置包含一个包含多个Firebase应用的Firebase项目:

;

现在问题是发送到我的一个iOS应用程序的FCM消息最终被另一个 iOS应用程序接收(发送到App1 iOS - App2 iOS获取消息)。

要调试此问题,我遵循了这个出色的调试指南: https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html

我发现了:

  1. 通过APNS直接发送消息正常工作(参见第4节)
  2. 通过带有cURL的FCM传递消息(第5节)将消息发送到随机应用程序。
  3. 然后我意识到我设备上的两个客户端应用都有相同的 firebase设备令牌。因此,Firebase似乎无法在令牌级别上区分应用程序 我仍然希望我的iOS的所有接收消息而不是随机消息。

    问题1:这是Firebase的预期行为吗?

    现在在真实的应用程序中,我通过注册到不同的渠道来定位不同的应用程序,为这样的应用程序标识符添加前缀:

    FB Project
      App1 Android
      App1 iOS
      App2 Android
      App2 iOS
      ...
    

    发送到该频道会产生随机结果,包括:

    • 预期收到的消息(App1)
    • 另一个应用(例如App2)收到的消息
    • 多个应用(App1,App2,...)
    • 收到的消息
    • 消息由一个应用程序(App2,App2)多次收到
    • 消息未收到

    问题2:我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

这不是预期的行为。 FCM令牌与授权实体(整个firebase项目相同)和范围(通常为" *")存储在钥匙串中。但是,钥匙串是根据应用程序的包标识符存储它们的,它们应该将它们彼此分开。

完整性检查:您是否为每个iOS应用使用不同的GoogleService-Info.plist文件?

另外,您使用的是共享钥匙串访问组吗?共享钥匙串访问组是否位于您的权利中keychain-access-groups列表的顶部?这将解释SDK如何意外地为其他应用程序找到FCM令牌。在documentation for Keychain

  

当您的应用创建钥匙串项目时,如果您未在项目的属性字典中明确指定kSecAttrAccessGroup键,则Keychain Services会使用该应用的第一组访问组数组(如上所示排序)作为默认访问组。如果您的应用具有keychain-access-groups权利,则Keychain Services会使用其中的第一个。否则,它使用始终存在的应用程序标识符。因此,默认情况下,除非您添加keychain-access-groups权利,否则应用会创建仅有权访问的钥匙串项目。

SDK确定"默认访问组"通过尝试创建一个小钥匙串项并查看访问组(keychain-access-groups列表中的第一个是默认值)。通常,对于钥匙串访问组,您希望将应用程序的应用程序标识符作为第一个项目,然后是任何共享组。这样,除非另有说明,否则您的钥匙串项目将写入单个应用程序,除非明确存储在共享访问组中。