Flutter Firebase如何控制通知在应用程序处于前台时不显示

Posted

技术标签:

【中文标题】Flutter Firebase如何控制通知在应用程序处于前台时不显示【英文标题】:Flutter Firebase how to control notification not to show when the app is in foreground 【发布时间】:2021-04-08 02:40:50 【问题描述】:

我有一个带有聊天室功能的 Flutter 应用。 Firebase 消息用于推送远程通知。如果应用程序位于前台并且恰好位于即将到来的通知所属的确切聊天室,我想隐藏通知弹出窗口。

这是您与某人聊天时的常见行为。消息直接附加到聊天室而不是弹出窗口。

我的问题是如何在接收时干扰远程通知?我在收到通知事件时使用了 onMessage 回调。但无论应用程序处于前台还是后台或已终止,它总是弹出。

在 firebase React Native 版本中,它有一个 onNotification 回调,这正是我想要的。但是颤振没有等价物。我的研究导致我发送 DataNotification 类型的消息。这样,我需要让应用程序状态与我的后端服务器保持同步(对吗?)。

欢迎任何帮助或建议。谢谢。

附注firebase_messaging 8.0.0-dev.10

【问题讨论】:

【参考方案1】:

更新:

正如 op 所说,在使用最新的稳定版本 (7.0.3) 时问题已得到修复。那么原因是新开发版本中的一个错误。

相关的 GitHub 问题,Link


原答案:

从您描述的问题来看,您遇到的问题可能是因为您在开发频道上。

您是否尝试使用最新的稳定版? (撰写本文时为 7.0.3)。这可能是开发频道中的错误。

如果问题仍然存在,请尝试发送数据消息而不是通知消息。这将阻止 firebase 在设备上发送通知。但请注意,您必须手动显示通知。这样,您就可以根据屏幕控制通知的显示,而不必像您提到的那样使状态与服务器保持同步。

但这可能不适用于ios,因为根据docs,当应用程序进入前台时将触发onMessage()

查看上面的链接,了解有关如何在 android 和 iOS 上处理通知消息和数据消息的更多详细信息。

【讨论】:

谢谢。我已经尝试过数据和通知类型的消息。但这也不起作用。 您是否尝试使用最新的稳定版本? 我确认我上面描述的问题似乎是开发频道中的一个错误。我尝试了 7.0.3,它按预期工作。当我的应用程序在前台运行时,不会出现任何提示通知,这是一种理想的行为。顺便说一句,只有当应用程序在前台时才会触发 onMessage。 onResume 和 onLaunch 都按预期工作。 我将此标记为答案。您能否在答案中突出显示原因?谢谢。 我更新了答案,我建议你在 GitHub 上打开一个新问题供开发人员修复。如果你这样做,请让我知道在答案中链接它。很高兴我能帮助你:-)【参考方案2】:

如果您的 onMessage 没有处理通知的代码,那么它们不应该出现。

如果您想将onMessage 通知转换为overlayIn App Notification,那就更好了。

我在显示notification 时也遇到了同样的问题,并找到了解决方法,我们可以在我们的应用程序中显示In App Notifications

您可以显示overlay,而不是在onMessage 方法中显示通知代码,就像notification 到达时Instagram 顶部显示的那样,

为了将消息附加到直接聊天室,我使用了一些后端帮助。

  onMessage: (Map<String, dynamic> message) async 
    showOverlayNote(message);
  ,

现在您可以将overlay 显示为

  showOverlayNote(message)
    //your code here for showing the overlay
  

您可以从this link 获得有关如何在应用内通知中使用叠加层的详细信息

这家伙已经更好地解释了这个 In App Notifications 的使用,所以请看上面的链接。

【讨论】:

我清空了 onMessage 回调正文,但仍然在 IOS 中弹出。至于 android,它与 ios 非常不同,因为它似乎需要将即将到来的通知转换为本地通知。因此,如果我们将 onMessage 留空,通知将不会显示在 android 中。 顺便说一下,我注意到您可能使用的是版本 7,但我的是 8.0.0-dev.10。我认为它对你的解决方案有轻微的改变,适用于 7 但不是 8。也许我会稍后再试。【参考方案3】:

您从错误的角度考虑它。 Firebase 消息总是会触发您的onMessage,这取决于您在内部如何处理。

我建议使用状态管理器——Mobx、ChangeNotifier、文件等等——来跟踪用户在哪个屏幕上。当用户进入您的聊天屏幕时,将其写入您的状态管理器(如有必要,也可以在您的 dispose() 方法上“取消写入”)。

然后,在处理onMessage 的方法中,检查用户的当前屏幕。如果他们在聊天屏幕上,则退出,如果不是,则执行覆盖。

【讨论】:

是的,明白 onMessage 总是被触发的。但是我可以选择不显示通知弹出/抬头通知吗?

以上是关于Flutter Firebase如何控制通知在应用程序处于前台时不显示的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 通知 Flutter iOS

如何在不使用 Firebase Cloud Messaging 控制台的情况下向 Flutter/Firebase Cloud Messaging 上的特定设备发送通知 [重复]

如何使用firebase推送通知唤醒flutter android应用程序

当用户点击 Flutter App 中的 Firebase 通知时如何打开链接?

如何在没有 Firebase 和自定义后端的情况下使用 Flutter 设置推送通知

如何在 Flutter Firebase 应用中搜索并向附近的人发送通知?