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
相关产品推荐
相关产品推荐

