dart 应用程序被终止时FCM通知未触发

thtygnil  于 2022-12-20  发布在  其他
关注(0)|答案(6)|浏览(164)

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**

ubby3x7f

ubby3x7f1#

看起来您正在调用有状态小部件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());
}

查看此以了解详细信息。

exdqitrt

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将在此处启动,您可以从此处执行“所有您想要的”操作。

swvgeqrz

swvgeqrz3#

您可以通过简单地获取数据键而不是通知键中的所有数据来触发onMessage通知函数。对于正在发送的数据,请将通知键更新为数据。

9rnv2umw

9rnv2umw4#

在后台处理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的任务)。您可以找到更多文档here
编辑-我可能有点误解了这个问题。上面的答案是当你想要处理某个通知时。至于通知,除非它是一个数据通知,否则通知应该会自己弹出。你也可以在回调中使用类似flutter_local_notifications的东西来生成你自己的通知!

zdwk9cvp

zdwk9cvp5#

我建议你使用OneSignal进行推送通知,它更稳定,总是收到通知。(即使在应用被杀的时候)。

cwxwcias

cwxwcias6#

如果你在前台和后台状态下收到通知,而不是在终止状态下,这可能不仅仅是因为你的代码。如果你在调试模式下运行,然后尝试完全终止应用程序,并通过IDE启动,从移动的/模拟器启动。Android操作系统将限制后台活动,而调试这可能会导致避免从firebase的通知。

相关问题