首页 > 解决方案 > 应用程序被杀死时没有触发 FCM 通知

问题描述

当应用程序处于后台或前台时,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-messaging 版本^10.0.2

标签: androidflutterdartfirebase-cloud-messaging

解决方案


看起来您正在调用有状态小部件FirebaseMessaging.onBackgroundMessage()内部的方法initState(),这是不允许的,如文档中所述:

由于处理程序在您的应用程序上下文之外在其自己的隔离中运行,因此无法更新应用程序状态或执行任何 影响 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());
}

检查以获取详细信息。


推荐阅读