Flutter Firebase Messaging iOS端通知无法接收,求可行解决方案及示例代码
Flutter + Firebase Messaging iOS端无法接收通知排查方案及示例代码
前置必查项(90%的问题出在这里)
- 确认Xcode中Signing & Capabilities已经添加 Push Notifications 和 Background Modes,Background Modes里勾选 Remote notifications 和 Background fetch
- 确认Apple Developer后台的App ID已经开启Push Notifications服务,并且开发/生产环境的证书都正确配置到Firebase控制台的Cloud Messaging设置中,注意不要把开发和生产的APNs证书搞混
- 确认iOS设备上已经给App开启了通知权限,第一次启动时的权限请求必须点允许,可在系统设置-通知中对应App里确认开关状态
- 确认你使用的是真机测试,iOS模拟器完全不支持接收FCM推送通知,所有模拟器下的推送测试都是无效的
- 确认
Info.plist中已经添加FirebaseAppDelegateProxyEnabled字段,值为NO(手动处理APNs token场景),若使用Firebase自动代理则设为YES,配置需要和你的逻辑保持一致 - 确认打包时的Bundle ID和Firebase控制台中配置的、Apple Developer后台的App ID完全一致,没有大小写或者字符错误
可用示例代码
Flutter 核心逻辑代码
import 'package:firebase_messaging/firebase_messaging.dart'; // App初始化完成后调用,如首页initState方法内 Future<void> requestNotificationPermission() async { FirebaseMessaging messaging = FirebaseMessaging.instance; NotificationSettings settings = await messaging.requestPermission( alert: true, announcement: false, badge: true, carPlay: false, criticalAlert: false, provisional: false, sound: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { print('用户已授权通知权限'); // 获取FCM Token,可打印后用于Firebase控制台测试推送 String? token = await messaging.getToken(); print('iOS设备FCM Token: $token'); } else if (settings.authorizationStatus == AuthorizationStatus.denied) { print('用户拒绝了通知权限'); } } // 前台收到通知的处理逻辑 void setupForegroundMessageHandler() { FirebaseMessaging.onMessage.listen((RemoteMessage message) { print('前台收到通知,标题:${message.notification?.title},内容:${message.notification?.body}'); // 如需前台展示通知横幅,可搭配flutter_local_notifications实现 }); } // 后台/杀死状态点击通知打开App的处理逻辑 void setupMessageOpenedHandler() { FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { print('通过通知打开App,携带参数:${message.data}'); }); }
iOS端 AppDelegate.swift 配置示例
import UIKit import Flutter import Firebase import UserNotifications @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() // 注册远程通知服务 UNUserNotificationCenter.current().delegate = self application.registerForRemoteNotifications() GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // iOS前台展示通知横幅的必备实现 override func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { completionHandler([.alert, .badge, .sound]) } }
验证测试步骤
- 运行App并授权通知权限后,复制控制台打印的iOS设备FCM Token
- 进入Firebase控制台Cloud Messaging模块,选择发送测试通知,填写通知标题、内容,目标选择「设备令牌」,粘贴刚才获取的FCM Token
- 发送时注意匹配环境:开发阶段测试选择开发环境,TestFlight/App Store生产环境测试选择生产环境,环境不匹配会直接导致通知发送失败
- 若控制台显示发送成功但设备未收到,可查看Xcode运行日志,排查是否有APNs Token上报失败、权限未获取的相关报错
内容的提问来源于stack exchange,提问作者Lilian Dubois
相关产品推荐
相关产品推荐

