【问题标题】:Firebase Push Notifications not received if app is closed如果应用程序关闭,则未收到 Firebase 推送通知
【发布时间】:2017-12-18 12:48:33
【问题描述】:

我正在测试 Firebase 推送通知,从 Firebase 编写器面板发送通知,我注意到如果我从应用程序信息面板关闭应用程序进程,发送的推送通知不会到达设备。即使我重新启动应用程序,通知也会丢失并且永远不会收到。

我也试过这个:

关闭应用进程 -> 关闭设备 -> 开机 -> 发送通知...并没有收到通知!

似乎只有在设备启动了应用程序而不是 100% 关闭时,firebase 才能收到通知,我的意思是,仅使用返回键关闭它但不会终止应用程序进程。

这怎么可能?假设即使应用关闭,firebase 也应该收到通知。

我正在使用 Android 8.0 的 Nexus 5X 上进行测试,我使用的是最新版本的 Firebase push Notifications

【问题讨论】:

  • 有两种类型的消息——通知消息和数据消息。你用的是哪一个?
  • 我 android 最新版本 7.0+ 引入了 DOZE,它在应用程序终止或未运行时不允许后台服务。 developer.android.com/about/versions/nougat/…
  • 可能有帮助 post
  • @SerjArdovic 我怎么知道?我正在使用它来发送消息:console.firebase.google.com/project/_/notification/…
  • 我的设备在 Android 8.0 上运行,我使用的是 firebase-messaging:11.6.0,一切正常。即使应用程序完全关闭,我仍然会收到通知。

标签: android firebase push-notification firebase-notifications


【解决方案1】:

抱歉迟到了,但希望这能帮助下一个遇到此问题的用户,因为没有选择“解决方案”的答案。

正确设置服务后,即使应用程序关闭,它也能正常工作。这是因为,Firebase 消息通过 Google Play 服务传输,因此关闭您的应用与该服务无关。

一开始,通知没有收到。通过在设备设置中搜索,我看到我的应用的节能系统活动的(关闭时从堆栈中删除)所以通知已发送但我的应用无法拍摄并显示这些。

禁用该选项后,我测试了很多次,我发现当应用程序完全关闭时,有时通知会延迟 2-3 分钟。有时它会触及 5 分钟。您需要耐心等待,它会来的!

相反,当应用程序仅通过返回按钮打开或关闭时,通知会在几秒钟内到来。

【讨论】:

  • 等待2~3分钟后,应用关闭时收到通知。当应用程序打开时,我几乎会在几秒钟内立即收到通知。
【解决方案2】:

在您的 AndroidManifest.xml 文件中,从您的消息服务中删除 android:exported=false

说明:当您的应用程序被完全杀死或从后台堆栈中删除时。操作系统尝试重新启动消息服务,但如果您的清单文件中有android:exported=false,则操作系统将无法重新启动该服务,因为此类服务只能由同一个应用重新启动。

参考:https://developer.android.com/guide/topics/manifest/service-element#exported

【讨论】:

    【解决方案3】:

    似乎firebase只能在设备接收通知 应用程序是否已启动而不是 100% 关闭,我的意思是,关闭它只是 返回键但不会杀死应用进程。

    不,FCM 会发送到所有具有 Google Play 服务和目标应用程序的设备。这就是为什么它被称为推送通知。

    您的应用程序在运行时也会收到通知,以处理您需要覆盖的通知

    onMessageRecieved(RemoteMessage mes);
    

    应用没有收到通知的原因可能有很多。其中一些可能是:

    • 清单中未包含消息服务

    • 播放服务配置不正确。或者不在手机中。

    • 有时延迟很高(很少)。我注意到有时需要大约 2-3 分钟 作曲后。

    • SHA1 指纹未在控制台中注册和/或更新的 google-services.json 不存在于源中。

    • 卸载并重新安装应用程序。这样就可以进行令牌再生。

    请点击此链接开始使用消息传递。

    https://firebase.google.com/docs/cloud-messaging/android/client

    【讨论】:

    • SHA1 未在控制台中注册,但因为它是可选的。会不会有影响?这在任何地方都有记录吗?
    • 注册总是比较好。确保出于调试目的提交调试密钥的 sha 和发布密钥的发布版本。以下是如何获取密钥的 SHA1 stackoverflow.com/questions/15727912/…
    • 为什么更好?在网站的文档中,它被告知它们是可选的,仅用于其他服务,而不是用于推送
    • SHA1 Hash 允许后端识别应用程序是否合法。防止未经授权或修改的版本访问 Firebase 服务。您是否实现了我的帖子链接中提到的所有其他内容。如果有,请告诉我。
    【解决方案4】:

    您是否在 Java 代码中添加了 firebase 服务? 这是链接:firebase/quickstart-android

    您必须在 java 文件夹中添加这 3 个 java 文件,并在 AndroidManifest.xml

    中添加这些服务名称

    【讨论】:

      【解决方案5】:

      如果您从 Firebase 控制台发送它,它会发送一条通知消息,因此如果您的应用关闭,您将不会收到通知消息,您需要发送包含控制台不执行的数据有效负载的消息。

      https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

      【讨论】:

      • 可以在没有服务器的情况下发送一份吗?仅使用 Firebase 面板?
      • 不,正如我所说的控制台不发送数据消息
      • 谢谢,文档中哪里有解释说,如果在没有播放负载的情况下发送它,它将无法到达关闭应用程序的设备?
      【解决方案6】:

      从 Firebase 文档中截取此屏幕截图,似乎无法使用 FCM

      【讨论】:

      • 但是当我尝试时,即使应用程序完全关闭,我也可以通过 admin sdk 中的 fcm 选项链接打开应用程序。
      猜你喜欢
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 2019-09-26
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多