• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中

[复制链接]
菜鸟教程小白 发表于 2022-12-13 02:33:05 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 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 设备 token 。因此,Firebase 似乎并未在 token 级别区分应用。
我仍然希望我的 iOS 的 all 会收到该消息,而不是随机的。

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

现在在真正的应用程序中,我通过注册到不同的 channel 来定位不同的应用程序,并为应用程序标识符添加前缀:

- (void)applicationUIApplication *)application
didRegisterForRemoteNotificationsWithDeviceTokenNSData *)deviceToken {
    [[FIRMessaging messaging] subscribeToTopic"/topics/app1-news"]]; 
}

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

  • 预期 (App1) 收到的消息
  • 另一个应用(例如 App2)收到的消息
  • 多个应用(App1、App2、...)收到的消息
  • 一个应用(App2、App2)多次收到消息
  • 根本没有收到消息

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



Best Answer-推荐答案


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

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

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

When your app creates a keychain item, if you do not explicitly specify the kSecAttrAccessGroup key in the item’s attributes dictionary, Keychain Services uses the first group of the app’s access groups array (ordered as shown above) as the default access group. If your app has a keychain-access-groups entitlement, Keychain Services uses the first of these. Otherwise, it uses the application identifier, which is always present. Thus, by default, unless you add a keychain-access-groups entitlement, an app creates keychain items to which only it has access.

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

关于ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45768939/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap