应用程序被杀死时是否可以接收到 FCM 推送通知?

17
我正在开发一款电子邮件应用程序,希望用户在收到新邮件时能够立即获得推送通知。为此,我正在使用 FCM。我刚刚尝试了使用 FCM 发送推送通知,遵循以下链接:https://www.youtube.com/watch?v=XijS62iP1Xo&t=6s,以测试 FCM 提供的功能。但我面临的问题是,当应用程序关闭(从任务管理器中滑动或清除)时,设备无法接收到推送通知,只有在前台或后台运行时才会收到。我不知道如何通过 FCM 实现这一点?我想像 WhatsApp 和 Facebook 应用程序一样接收推送通知。

感谢您的任何帮助。提前致谢。


可能是如何在Firebase中处理应用程序在后台时的通知的重复问题。 - Andrey Danilov
我知道这可能看起来像是一个重复的问题,但我已经尝试了其他方法,但似乎仍然无法解决。 - Iqraa
如果您的应用程序已关闭(未被强制停止),则在使用数据消息时,您将在服务中收到消息。如果您的应用程序被强制停止,则根据设备/操作系统版本/制造商而定,您将无法收到它们。请参见此答案 https://dev59.com/KlkS5IYBdhLWcg3wvI20 - tyczj
4个回答

15

目前有两种推送通知类型: 数据消息通知消息

如果你使用的是数据消息,你需要负责处理接收到的消息,并向用户呈现通知(如果需要的话)。但在这种情况下,在你的应用程序关闭时,你可能会错过通知。

如果你使用通知消息,FCM将为你处理消息,并且如果应用程序处于后台/关闭状态,则直接显示通知。

请参见此处获取更多信息。


5
当您的应用程序关闭时,您可能会错过通知!真的吗? - Xenolion
这是怎么发生的?我从未见过这样的情况。 - Xenolion
1
@Xenolion:请检查8.0设备,特别是小米、OPPO、Vivo和联想。它们不会显示通知,但如果您关闭电池优化,通知将会显示。但问题是我们无法去告诉用户如何操作。 - Sagar Panwala
这是与电池优化有关还是因为没有使用通知渠道?但我认为这不好,他们应该重新考虑设计或者至少使用人工智能来了解用户如何与应用程序交互。因为在像聊天应用这样的应用中,用户可能会错过一些通知! - Xenolion
1
我为我的应用程序关闭了电池优化,现在当我滑出应用程序时,我会收到通知! - d51
你能不能请看一下这个问题 https://stackoverflow.com/questions/76225714/unable-to-receive-notification-in-battery-optimization-mode-pushy - Qasim Malik

11

如果一个应用程序被在应用程序设置中的“强制停止”选项杀死/停止,则无法在该应用中接收推送通知:

Force stop in application settings

让我引用我从Firebase支持中得到的回复,当我向他们提出这个问题时:
Android框架建议已经停止的应用程序(即从设置中被杀死/强制停止的应用程序)不应在没有明确用户交互的情况下启动。 FCM遵循此建议,因此不会将消息传递给已停止的应用程序。以下是一些讨论此主题的文档:
- FCM到设备的消息生命周期使用Firebase Cloud - 使用Android O进行消息传递 这证实了我在使用简单应用程序进行测试时观察到的情况。
但是,即使应用程序从“最近使用”屏幕上滑动删除或在系统重新启动后,您也应该能够在后台从FCM接收推送消息。也就是说,除非制造商使滑动手势的工作方式与“强制停止”相同,否则您应该能够接收到推送消息。在后台接收它的方式取决于推送通知是否包含“notification”负载:
  • 如果有,只有当用户点击通知并将其传递给由通知操作启动的活动时,您才会收到“data”
  • 如果没有,则您将像在前台应用程序中一样在onMessageReceived中收到通知。

当你的应用程序没有被杀死,但仍然可能无法接收推送通知的其他情况包括:

  • 如果您没有使用高优先级的推送消息,则可能会因为Doze模式而延迟
  • 如果您的应用程序受到后台限制,则可能无法传递消息

1
如果您的App被“Killed”或在后台运行,请在启动屏幕上检查“Payload”。在我的情况下,它是MainActivity,因此在“onCreate()”中检查附加项。
if (getIntent().getExtras() != null) {
    for (String key : getIntent().getExtras().keySet()) {
        Object value = getIntent().getExtras().get(key);
        Log.d("MainActivity: ", "Key: " + key + " Value: " + value);
    }
}

0

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