FCM通知在应用程序处于后台或前台时对我有效,但在应用程序被杀死时无效。
下面是我的FCM配置代码:
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
class CategoriesScreen extends StatefulWidget {
static const routeName = '/view-cateogries';
_CategoriesScreenState createState() => _CategoriesScreenState();
}
class _CategoriesScreenState extends State<CategoriesScreen> {
Future _screenFuture;
void initState() {
_saveDeviceToken(FirebaseMessaging.instance);
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
super.initState();
}
我在网上和stackoverflow上读过numeruos的文章。例如,其中一个建议是禁用电池保护程序。我试过了,但没有运气。你知道我错过了什么吗?
我使用的是firebase消息传递版本**^10.0.2**
6条答案
按热度按时间ubby3x7f1#
看起来您正在调用有状态小部件
initState()
内的FirebaseMessaging.onBackgroundMessage()
方法,这是不允许的,因为文档中有说明:由于处理程序在您的应用程序上下文之外独立运行,因此无法更新应用程序状态或执行任何UI影响逻辑。但是,您可以执行HTTP请求、IO操作(更新本地存储)、与其他插件通信等逻辑。
您应该在
runApp()
之前设置后台消息处理程序:查看此以了解详细信息。
exdqitrt2#
当应用程序被终止时,FCM想要触发某些行为时“执行某些操作”的唯一方法是使用BroadcastReceiver:https://chloe-thhsu.medium.com/a-simple-way-to-combine-fcm-notification-with-tts-b48a777ec84f(在此链接中您只需要一段示例代码)
FCM应该触发一些Intent,并且只有注册的应用程序才会接收并执行某些操作。
BroadcastReceivers即使在应用程序关闭/关闭时也能正常工作,但在触发时只允许基本的“操作”。“* 通过传递XYZ参数使用Intent启动Activity *”,您的应用/Activity将在此处启动,您可以从此处执行“所有您想要的”操作。
swvgeqrz3#
您可以通过简单地获取数据键而不是通知键中的所有数据来触发onMessage通知函数。对于正在发送的数据,请将通知键更新为数据。
9rnv2umw4#
在后台处理FCM通知(即使应用程序已终止)已经有一段时间了。步骤
唯一需要记住的是,在后台触发的函数必须是匿名函数,也就是说,它应该在任何类之外。该函数将在一个单独的隔离中执行,因此您可以执行任何类型的非任务,如网络调用,显示通知,更新数据库等(任何不涉及UI的任务)。您可以找到更多文档here
编辑-我可能有点误解了这个问题。上面的答案是当你想要处理某个通知时。至于通知,除非它是一个数据通知,否则通知应该会自己弹出。你也可以在回调中使用类似flutter_local_notifications的东西来生成你自己的通知!
zdwk9cvp5#
我建议你使用OneSignal进行推送通知,它更稳定,总是收到通知。(即使在应用被杀的时候)。
cwxwcias6#
如果你在前台和后台状态下收到通知,而不是在终止状态下,这可能不仅仅是因为你的代码。如果你在调试模式下运行,然后尝试完全终止应用程序,并通过IDE启动,从移动的/模拟器启动。Android操作系统将限制后台活动,而调试这可能会导致避免从firebase的通知。