You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter应用终止时无法接收FCM推送通知的问题求助

Flutter应用终止时无法接收FCM推送通知的问题求助

大家好,我目前在开发一款基于Flutter的应用,使用Firebase Cloud Messaging(FCM)处理推送通知。现在遇到一个棘手的问题:当应用处于后台状态时,推送通知能正常显示,但把应用完全终止(划掉关闭)后,就完全收不到通知了,测试设备是Android 11系统。

我先贴一下相关代码,麻烦大家帮忙看看哪里出了问题:

后端Flask推送代码

这是我用来发送通知的Flask服务代码片段:

import firebase_admin
from firebase_admin import auth, messaging, credentials

cred = credentials.Certificate("service-account.json")
firebase_admin.initialize_app(cred)

message = messaging.Message(
    notification=messaging.Notification(
        title="Wow!",
        body="This background push notification actually worked!"
    ),
    data={
        "foo": "bar"
    },
    android=messaging.AndroidConfig(
        notification=messaging.AndroidNotification(
            title="Wow!",
            body="This background push notification actually worked!",
            channel_id="high_importance_channel",
            priority="high"
        ),
        priority="high"
    ),
    topic="current"
)

response = messaging.send(message)
print(response)

补充说明:我后来给消息加了data字段,但问题依然存在——后台能收到,终止状态完全收不到。

Flutter端相关代码

后台消息处理入口

@pragma('vm:entry-point')
Future<void> notificationHandler(RemoteMessage message) async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'high_importance_channel',
    'High Importance Notifications',
    description: 'This channel is used for important notifications.',
    importance: Importance.high
  );

  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
  
  await flutterLocalNotificationsPlugin.initialize(
    InitializationSettings(
      android: AndroidInitializationSettings('background')
    )
  );

  await flutterLocalNotificationsPlugin.show(
    0,
    message.notification?.title,
    message.notification?.body,
    NotificationDetails(
      android: AndroidNotificationDetails(
        'high_importance_channel',
        'High Importance Notifications',
        importance: Importance.high
      )
    )
  );

  if (message.notification?.title == 'Awards') {
    await FirebaseMessaging.instance.unsubscribeFromTopic('current');
  }
}

主函数初始化代码

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  await FirebaseAppCheck.instance.activate(
    androidProvider: AndroidProvider.playIntegrity,
    appleProvider: AppleProvider.appAttest
  );

  if (FirebaseAuth.instance.currentUser == null) {
    await FirebaseAuth.instance.signInAnonymously();
  }

  final messaging = FirebaseMessaging.instance;
  await messaging.requestPermission(
    alert: true,
    announcement: false,
    badge: true,
    carPlay: false,
    criticalAlert: false,
    provisional: false,
    sound: true
  );

  const AndroidNotificationChannel channel = AndroidNotificationChannel(
    'high_importance_channel',
    'High Importance Notifications',
    description: 'This channel is used for important notifications.',
    importance: Importance.high
  );

  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation<AndroidFlutterLocalNotificationsPlugin>()?.createNotificationChannel(channel);
  
  await flutterLocalNotificationsPlugin.initialize(
    InitializationSettings(
      android: AndroidInitializationSettings('background')
    )
  );

  FirebaseMessaging.onBackgroundMessage(notificationHandler);
}

订阅主题的代码

这部分是在支付流程完成后(用square_in_app_payments处理支付)订阅主题的逻辑:

void _onCardEntryComplete() async {
  await FirebaseMessaging.instance.subscribeToTopic('current');
  if (mounted) Navigator.of(context).pushNamed('/register');
}

我已经尝试过的解决方法

  • 之前忘记初始化本地通知插件,现在已经修复,但问题依旧
  • 修改过AndroidManifest.xml配置(比如添加FCM相关的服务、权限)
  • 检查并关闭了设备的电池优化(确保应用不会被系统休眠)

现在我不确定是后端发送消息的方式不对,还是Flutter端或者Android配置还有遗漏的地方。再明确一下问题:应用终止后,发送推送时,设备通知栏完全看不到任何通知,也没有声音/震动提示,通知历史里也找不到相关记录。

麻烦各位大佬帮忙看看问题出在哪,谢谢!

内容来源于stack exchange

火山引擎 最新活动