Flutter App Firebase 推送通知不在后台出现

sun*_*wat 6 android push-notification firebase flutter firebase-cloud-messaging

当应用程序终止/从后台删除最近的应用程序时,我面临收到通知的问题。

我已经在应用程序或项目级别的 build.gradle 文件中完成了 Android 应用程序所需的所有设置。当应用程序打开或应用程序位于最近的应用程序中时,我能够收到推送通知。

库版本

firebase_messaging: ^11.2.0
firebase_core: ^1.10.0
flutter_local_notifications: ^9.1.4
Run Code Online (Sandbox Code Playgroud)

这是我的代码。

await Firebase.initializeApp();
Run Code Online (Sandbox Code Playgroud)
    FirebaseMessaging messaging = FirebaseMessaging.instance;

    messaging.getToken().then((value) {
      print('firebase token =$value');    
    });

    FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
      //print(event.notification!.body);
      RemoteNotification? notification = message.notification;
      if (notification != null) {
        print("Notification received when app in foreground");
      }
    });

    FirebaseMessaging.onMessageOpenedApp.listen((message) {
      print('Message clicked!');
    });

    await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
      alert: true,
      badge: true,
      sound: true,
    );
Run Code Online (Sandbox Code Playgroud)

背景消息处理程序代码如下

Future<void> _messageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  RemoteNotification? notification = message.notification;
  if (notification != null) {
    print("Notification received when app in background");
  }
}
Run Code Online (Sandbox Code Playgroud)

下面是我的 main.dart 文件的完整代码

Future<void> _messageHandler(RemoteMessage message) async {
  await Firebase.initializeApp();
  RemoteNotification? notification = message.notification;
  if (notification != null) {
    print("Notification received when app in background");
  }
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(_messageHandler);
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool isUserLoggedIn = true;
  bool isLogoutAlertShown = false;
  final materialAppKey = GlobalKey();
  late FirebaseMessaging messaging;


  @override
  void initState() {
    super.initState();
    setUpNotification();
  }

  setUpNotification() async {
    messaging = FirebaseMessaging.instance;
    messaging.getToken().then((value) {
      print('firebase token =$value');
      //sendTokenToServer(value);
      Pref.setFcmToken(token: '$value');
    });
    FirebaseMessaging.onMessage.listen((RemoteMessage message) async {
      //print(event.notification!.body);
      RemoteNotification? notification = message.notification;
      if (notification != null) {
        print("Notification received when app in foreground");
      }
    });
    FirebaseMessaging.onMessageOpenedApp.listen((message) {
      print('Message clicked!');
    });
   await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions(
      alert: true,
      badge: true,
      sound: true,
    );
  }

  @override
  Widget build(BuildContext context) {
    return _materialApp();
  }

  Widget _materialApp() {
    return FutureBuilder(
        future: _loginState(),
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.done) {
            return MaterialApp(
              debugShowCheckedModeBanner: false,
              key: materialAppKey,
              darkTheme: AppTheme.lightTheme,
              theme: AppTheme.lightTheme,
              home: isUserLoggedIn == true ? 
              BottomNavigationContainer() : LoginOptions(),
            );
          } else {
            return Container(color: Colors.white);
          }
        });
  }

  Future<void> _loginState() async {
    final token = await Pref.getToken();
    isUserLoggedIn = token.length > 0 ? true : false;
  }
}
Run Code Online (Sandbox Code Playgroud)

建议我遗漏或做错了什么。

sun*_*wat 18

感谢大家的回复。

我找到了为什么我的后台处理程序无法工作的解决方案,因为我正在调试模式下运行我的应用程序。根据FlutterFire Cloud 消息传递文档, 如果您终止应用程序,后台方法将无法在调试模式下工作。

您可以通过在调试中运行应用程序来测试后台处理程序方法,然后通过切换应用程序将其置于后台,使其不再位于前台。

如果您想检查“应用程序从最近的任务中终止/终止后”,则“在发布模式下运行应用程序” 。效果很好

再次感谢大家。