草庐IT

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

coder 2024-01-17 原文

我正在使用 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 的 所有 都能收到这条消息,而不是随机收到一条消息。

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

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

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [[FIRMessaging messaging] subscribeToTopic:@"/topics/app1-news"]]; 
}

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

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

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

最佳答案

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

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

此外,您是否使用共享钥匙串(keychain)访问组?共享钥匙串(keychain)访问组是否位于您权利中 keychain-access-groups 列表的顶部?这可以解释 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/

有关ios - FIrebase FCM - 推送消息最终出现在错误的应用程序中的更多相关文章

  1. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  2. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  3. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  4. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  5. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  6. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. ruby-on-rails - 如何在 Rails View 上显示错误消息? - 2

    我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c

  9. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  10. ruby-on-rails - 错误 : Error installing pg: ERROR: Failed to build gem native extension - 2

    我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby​​'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe

随机推荐