Firebase FCM - 推送消息进入错误的应用程序

3

我正在使用Firebase Cloud Messaging将推送消息传递给我的iOS应用程序。 我的FCM设置包括一个Firebase项目和多个Firebase应用程序:

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

现在的问题是,发送到我的一个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节)。
然后我意识到,我设备上的两个客户端应用程序具有相同的Firebase设备令牌。因此,Firebase似乎不能在令牌级别上区分应用程序。 尽管如此,我仍然期望消息将被所有iOS应用程序接收而不是随机的一个。
问题1:这是Firebase的预期行为吗?
现在,在真实的应用程序中,我通过注册不同的通道来针对不同的应用程序,添加应用程序标识符前缀,如下所示:
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [[FIRMessaging messaging] subscribeToTopic:@"/topics/app1-news"]]; 
}

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

  • 信息被目标应用(App1)收到
  • 信息被其他应用(例如App2)收到
  • 信息被多个应用(App1、App2等)收到
  • 一个应用(如App2)收到多次信息
  • 信息根本没有被接收

问题2:我该如何做才能做对?

1个回答

3
这不是预期的行为。FCM令牌与授权实体(整个Firebase项目相同)和范围(通常为“*”)一起存储在钥匙串中。然而,钥匙串是基于应用程序的包标识符来存储它们的,这应该将它们彼此分开。
检查一下:您是否为每个iOS应用使用不同的GoogleService-Info.plist文件?
另外,您是否在使用共享钥匙串访问组?共享钥匙串访问组是否在您的entitlements中的keychain-access-groups列表的顶部?这将解释SDK如何意外地找到其他应用程序的FCM令牌。在Keychain文档中可以找到说明。
当您的应用程序创建一个钥匙串项时,如果您没有在项目的属性字典中明确指定kSecAttrAccessGroup键,则钥匙串服务会将应用程序访问组数组(按上面显示的顺序排序)的第一组作为默认访问组。如果您的应用程序有一个keychain-access-groups授权,钥匙串服务则使用它们中的第一个。否则,它使用始终存在的应用程序标识符。因此,默认情况下,除非添加keychain-access-groups授权,否则应用程序创建仅其本身可以访问的钥匙串项。
SDK通过尝试创建一个小的钥匙串项并查看访问组(keychain-access-groups列表中的第一个是默认值)来确定“默认的访问组”。通常使用钥匙串访问组时,您希望将应用程序的应用标识符作为第一项,然后是任何共享组。这样,除非另有指定,否则您的钥匙串项将写入到单个应用程序中,除非明确存储在共享访问组中。

谢谢,keychain是关键词!我添加了keychain共享作为解决方案来解决这里描述的问题:https://firebase.googleblog.com/2016/08/ios-10-xcode-8-and-swift-3.html。禁用共享keychain后,推送消息按预期工作! - de.

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