我正在使用Firebase云消息传递向iOS应用提供推送消息。 我的FCM设置包含一个包含多个Firebase应用的Firebase项目:
;
现在问题是发送到我的一个iOS应用程序的FCM消息最终被另一个 iOS应用程序接收(发送到App1 iOS - App2 iOS获取消息)。
要调试此问题,我遵循了这个出色的调试指南: https://firebase.googleblog.com/2017/01/debugging-firebase-cloud-messaging-on.html
我发现了:
然后我意识到我设备上的两个客户端应用都有相同的 firebase设备令牌。因此,Firebase似乎无法在令牌级别上区分应用程序 我仍然希望我的iOS的所有接收消息而不是随机消息。
问题1:这是Firebase的预期行为吗?
现在在真实的应用程序中,我通过注册到不同的渠道来定位不同的应用程序,为这样的应用程序标识符添加前缀:
FB Project
App1 Android
App1 iOS
App2 Android
App2 iOS
...
发送到该频道会产生随机结果,包括:
问题2:我怎样才能做到这一点?
答案 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
列表中的第一个是默认值)。通常,对于钥匙串访问组,您希望将应用程序的应用程序标识符作为第一个项目,然后是任何共享组。这样,除非另有说明,否则您的钥匙串项目将写入单个应用程序,除非明确存储在共享访问组中。