Flutter集成Firebase推送时iOS真机收不到通知但安卓设备接收正常
问题根因定位及解决方案
核心问题1:禁用Firebase方法调配后未手动适配APNs回调
你在Info.plist中将FirebaseAppDelegateProxyEnabled设为false,等于关闭了Firebase自动接管APNs token、通知回调的能力,但是你没有在AppDelegate中手动实现对应的转发逻辑,导致Firebase无法拿到iOS设备的APNs token,自然无法下发推送。
修复后的AppDelegate代码:
import UIKit import Flutter import Firebase @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() // 注册APNs通知 application.registerForRemoteNotifications() GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // 手动转发APNs token到Firebase override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken) } // 手动处理前台收到的远程通知 override func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { Messaging.messaging().appDidReceiveMessage(userInfo) completionHandler(UIBackgroundFetchResult.newData) } }
核心问题2:通知权限请求未等待异步结果
你当前Dart代码中的requestPermission是异步方法,没有加await,可能出现权限还未完成授权,就执行后续订阅主题、注册FCM的逻辑,导致注册失败。
修复后的推送服务代码:
import 'dart:io'; import 'package:firebase_messaging/firebase_messaging.dart'; class PushNotificationService { final FirebaseMessaging _fcm; PushNotificationService(this._fcm); Future initialise() async { if (Platform.isIOS) { // 加await等待权限申请结果 NotificationSettings settings = await _fcm.requestPermission( alert: true, announcement: false, badge: true, carPlay: false, criticalAlert: false, provisional: false, sound: true, ); // 可加判断:如果用户未授权直接终止后续逻辑 if (settings.authorizationStatus != AuthorizationStatus.authorized) { print("用户未授予通知权限"); return; } // 调试阶段建议打印FCM token,确认能正常获取 String? token = await _fcm.getToken(); print("iOS FCM Token: $token"); } await _fcm.subscribeToTopic("mytargettopic"); } }
需额外验证的配置点
- 确认
GoogleService-Info.plist是通过Xcode的「Add Files to "Runner"」选项添加到项目,勾选了Runner target的复制权限,不是直接拖到文件夹中。 - 确认Firebase控制台上传的APNs证书和你当前App的Bundle ID、打包环境(开发/生产)完全匹配,测试阶段优先使用开发证书调试。
- 必须使用iOS真机测试,模拟器不支持接收APNs推送。
内容的提问来源于stack exchange,提问作者Logic loops
相关产品推荐
相关产品推荐

