You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Firebase iOS后台/终止状态下推送通知无法接收

iOS后台/终止状态无法接收FCM通知的修复方案

你当前的问题是Flutter集成FCM后,前台能正常接收处理通知,但后台或App终止状态下完全无法接收。以下是针对性的修复步骤:


1. 完善AppDelegate的通知代理实现

你的AppDelegate.swift仅设置了代理,但未实现关键的通知处理方法,导致后台状态下通知无法被正确分发。修改代码如下:

import UIKit
import Flutter
import Firebase
import FirebaseCore
import flutter_local_notifications
import UserNotifications

@main
@objc class AppDelegate: FlutterAppDelegate, UNUserNotificationCenterDelegate {
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        FlutterLocalNotificationsPlugin.setPluginRegistrantCallback { (registry) in
            GeneratedPluginRegistrant.register(with: registry)
        }

        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().delegate = self
        }
        
        FirebaseApp.configure() // 确保Firebase在此初始化
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
    
    // 前台收到通知时触发,自定义显示方式
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .badge, .sound])
    }
    
    // 点击通知时触发,后台/终止状态下会唤醒App
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        completionHandler()
    }
    
    // 处理后台静默推送或带content-available的推送
    override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        if let messageID = userInfo["gcm.message_id"] {
            print("Message ID: \(messageID)")
        }
        completionHandler(.newData)
    }
}

2. 修复后台消息处理函数

后台隔离区未初始化Firebase,导致无法处理消息。修改main.dart中的后台处理函数:

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  print("Handling a background message: ${message.messageId}");
  
  // 必须初始化Firebase
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  
  // 这里可添加自定义消息处理逻辑,比如用flutter_local_notifications显示通知
}

3. 初始化flutter_local_notifications插件

后台状态下系统不会自动显示通知,需手动初始化插件并处理:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  
  // 初始化flutter_local_notifications
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
  const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher');
  final DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings(
    onDidReceiveLocalNotification: (id, title, body, payload) async {},
  );
  final InitializationSettings initializationSettings = InitializationSettings(
    android: initializationSettingsAndroid,
    iOS: initializationSettingsDarwin,
  );
  await flutterLocalNotificationsPlugin.initialize(initializationSettings);
  
  NotificationSettings settings = await FirebaseMessaging.instance.requestPermission(
      alert: true,
      announcement: false,
      badge: true,
      carPlay: false,
      criticalAlert: false,
      provisional: false,
      sound: true,
    );

  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);

  runApp(MyApp());
}

4. 修正推送Payload格式

你的推送请求存在两个关键问题:

  • token字段为空,需替换为目标设备的FCM token
  • APNs payload格式需调整,确保content-available生效

修正后的推送请求示例:

{
  "message": {
    "token": "YOUR_DEVICE_FCM_TOKEN",
    "data": {
      "receiver-id": "HBJq0SpqsrtoWjwIaH7kky14g4VZl53"
    },
    "notification": {
      "title": "Test Notification",
      "body": "This is a test message"
    },
    "apns": {
      "headers": {
        "apns-priority": "10",
        "apns-push-type": "alert"
      },
      "payload": {
        "aps": {
          "content-available": 1,
          "alert": {
            "title": "Test Notification",
            "body": "This is a test message"
          },
          "badge": 1,
          "sound": "default"
        }
      }
    }
  }
}

5. 验证iOS基础配置

  • 确认Xcode的Capabilities中已开启Push Notifications
  • 检查Background Modes中已勾选Remote notifications
  • 确保设备通知权限完全开启(设置→通知→你的App,允许所有通知选项)

完成以上修改后,重新打包安装App,测试后台/终止状态下的推送通知。

内容的提问来源于stack exchange,提问作者user28785015

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:37:05