这不是调试问题。
我将从最重要的问题开始:
当 Android 应用程序处于后台或终止时,FCM 消息需要什么确切的配置参数才能显示横幅?
在我的研究中,我得出的结论是答案在于:
在使用 Firebase 云消息传递 (FCM) 的 Flutter+Firebase 应用程序中,我有一个云函数,它按以下方式定义消息(“正常”Javascript,v1 函数):
const multicastMessage = {
tokens: tokens, // Array of tokens
notification: {
title: `Alert from ${userName}`,
body: notificationBody,
},
android: {
priority: "high", // High priority for Android notifications
ttl: 60, // TTL of 60 seconds (~1 minute)
notification: {
sound: "custom_notification_sound_alert",
},
},
apns: {
headers: {
"apns-priority": "10", // High priority for APNs
// Expires in 60 seconds
"apns-expiration": `${Math.floor(Date.now() / 1000) + 60}`,
},
payload: {
aps: {
"alert": {
title: `Alert from ${userName}`,
body: notificationBody,
},
"sound": "CustomNotificationSoundAlert.wav",
},
},
},
};
如前所述,这不是一个调试问题,如果您了解消息已传递到 Android 和 IOS 客户端并且似乎在所有方面都有效,则不需要“更多代码”,除了一件事 -在 Android 上,当应用程序处于后台或被终止时,通知会以小图标的形式发送到系统托盘 - 它不会显示为位于其他所有内容之上的横幅。
我尝试过的事情:
一般谷歌搜索会产生这个github问题...但它已经很旧了,我不相信它仍然适用。
Firebase FCM 文档...虽然有许多相关主题,但文档似乎没有直接/准确地承认这一点(Android 在后台/杀死时显示横幅与不显示横幅以及原因)作为潜在问题。 虽然我已经阅读了很多内容,但我还没有阅读所有文档,部分原因是我不确定答案在哪一部分——Android、Flutter、“服务器”……而 FCM 很复杂并且在我的脑海中,概念已经很容易混淆了。
我不想相信答案在于 (C)——自定义 Android 代码配置(例如定义自定义消息通道),因为我认为 FCM 的重点是成为一个包装器......如果这是真的那么为什么 JSON 中有 Android 优先级键?
也许这只是一些愚蠢的事情,比如“优先级:“高””中的高需要大写?
虽然 FCM 消息本身并不直接控制 Android 上的通知行为,但选择 (B) 和 (C) 选项是正确的:
(B) Flutter 代码:您需要在 Flutter 代码中使用 FCM.instance.makeAndroidShowBannerInBackground(true) 才能在应用程序处于后台时启用横幅。
(C) 自定义消息通道(推荐):这是更强大的解决方案。 使用 IMPORTANCE_HIGH 设置创建自定义消息通道可以对通知的显示方式进行细粒度控制,即使应用程序处于后台或终止状态也是如此。
这就是为什么 (C) 可能更可取:
更多控制:通道为通知外观和行为提供了更好的自定义。 面向未来:这种方法符合最新的 Android 通知实践。 https://cafelam.com/elizabeth-fraley-leads-kinderready-to-unleash-real-time-tracking-analytics-to-enhance-childrens-development-and-parental-engagement/