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上读了很多文章。例如,其中一个建议是禁用电池节电器。我试过了,但没有成功。你知道我缺少什么吗?
我使用的是firebase消息版本^10.0.2
看起来您正在有状态小部件的initState()
内部调用FirebaseMessaging.onBackgroundMessage()
方法,正如文档中所述,这是不允许的:
由于处理程序在应用程序之外以自己的隔离运行上下文中,不可能更新应用程序状态或执行任何UI影响逻辑。但是,您可以执行诸如HTTP之类的逻辑请求、IO操作(更新本地存储(、与其他插件等
您应该在runApp()
:之前设置后台消息处理程序
/// Define a top-level named handler which background/terminated messages will
/// call.
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
// If you're going to use other Firebase services in the background, such as Firestore,
// make sure you call `initializeApp` before using other Firebase services.
await Firebase.initializeApp();
print("Handling a background message: ${message.messageId}");
}
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
// Initialize Firebase App
await Firebase.initializeApp();
// Set the background messaging handler early on, as a named top-level function
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
// Run your app
runApp(HomeScreen());
}
查看此以了解详细信息。
当应用程序被杀死时;做某事;当FCM想要通过使用BroadcastReceiver来触发某些行为时:https://chloe-thhsu.medium.com/a-simple-way-to-combine-fcm-notification-with-tts-b48a777ec84f(在这个链接上你只需要一段示例代码(
FCM应该触发一些意向,只有注册的应用程序才会收到它并采取行动。
BroadcastReceivers即使在应用程序关闭/终止时也能工作,但它们只允许基本的";动作";当它们被触发时。对你来说,它可能是有用的:通过传递XYZ参数开始和使用Intent的活动";您的应用程序/活动将在哪里启动;所有你想要的"从那里。
您可以通过简单地获取数据键中的所有数据而不是通知键来触发通知onMessage函数。正在发送的数据,请将密钥从通知更新为数据。
即使应用程序终止,也要在后台处理FCM通知,这已经有很长一段时间了。的步骤
void _setupFCM() async {
await Firebase.initializeApp();
_messaging = FirebaseMessaging.instance;
// The function passed here will be fired when app is in background and when app is terminated
FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
FirebaseMessaging.onMessage.listen((event) {
//...
//...
// This is fired when app is in foreground
});
}
唯一需要记住的是,传递用于在后台启动的函数必须是匿名函数,也就是说,它应该在任何类之外。该函数将在单独的隔离中执行,因此您可以执行任何类型的非任务,如网络调用、显示通知、更新数据库等(任何不涉及UI的任务(。你可以在这里找到更多的文档
编辑-我可能误解了这个问题。上面的答案适用于您希望在收到通知时进行处理的情况。至于通知,除非是数据通知,否则通知应该自己弹出。您也可以在回调中使用类似flatter_local_notifications的东西来生成自己的通知!
如果您在前台和后台状态下而不是在终止状态下收到通知,这可能不仅仅是因为您的代码。如果你在调试模式下运行,那么尝试完全终止应用程序并在不通过IDE的情况下启动,从移动/模拟器启动。安卓操作系统在调试时会限制后台活动,这可能会避免来自firebase的通知。
使用@pragma('vm:entry-point')
它必须在函数声明的正上方用@pragma('vm:entry-point'(进行注释(否则它可能会在发布模式的树摇动过程中被删除(。
官方文件
我建议您使用OneSignal进行推送通知。它更稳定,并且总是接收通知。(即使应用程序被终止(。