Flutter项目iOS端调用FirebaseMessaging.getAPNSToken始终返回null
解决方案
1. 补全AppDelegate.swift的APNs注册逻辑
你当前的AppDelegate未主动触发APNs注册,也没有实现token回调方法,修正后代码如下:
import UIKit import Flutter import Firebase @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { FirebaseApp.configure() GeneratedPluginRegistrant.register(with: self) if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self as UNUserNotificationCenterDelegate } // 新增:主动申请APNs注册 application.registerForRemoteNotifications() return super.application(application, didFinishLaunchingWithOptions: launchOptions) } // 新增:APNs token获取成功回调,自动同步给FCM override func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { Messaging.messaging().apnsToken = deviceToken super.application(application, didRegisterForRemoteNotificationsWithDeviceToken: deviceToken) } }
注意把原来的as?强转改成as,避免delegate赋值失败。
2. 检查Firebase后台配置
- 确认上传了正确的APNs证书/密钥,同时覆盖开发、生产两个环境
- 确认后台填写的Bundle ID、Team ID与Xcode中的配置完全一致
- 确认GoogleService-Info.plist是从对应Firebase项目下载,且正确引入到Xcode工程中,勾选了Copy items if needed选项
3. 优化FCM Token获取逻辑
不要在应用刚启动就立即获取FCM Token,需等用户同意通知权限、APNs注册完成后再获取,示例代码:
// 先申请完整通知权限 NotificationSettings settings = await FirebaseMessaging.instance.requestPermission( alert: true, sound: true, badge: true, ); if (settings.authorizationStatus == AuthorizationStatus.authorized) { // 延迟2秒再获取token,确保APNs注册完成 await Future.delayed(const Duration(seconds: 2)); String? token = await FirebaseMessaging.instance.getToken(); String? apnsToken = await FirebaseMessaging.instance.getAPNSToken(); print('APNs Token: $apnsToken, FCM Token: $token'); // 监听token刷新事件,避免token过期失效 FirebaseMessaging.instance.onTokenRefresh.listen((newToken) { // 处理新token }); }
4. 清理缓存重新构建
执行以下操作排除缓存干扰:
- 删除真机上已安装的测试应用
- 项目根目录执行
flutter clean - 进入ios目录执行
pod deintegrate && pod install --repo-update - 重启Xcode后重新运行项目
5. 排除无关日志干扰
你控制台出现的com.apple.commcenter.coretelephony.xpc报错属于Xcode调试的系统日志,不影响推送功能,可以在Xcode的Scheme > Run > Arguments > Environment Variables中添加OS_ACTIVITY_MODE = disable屏蔽该类日志。
内容的提问来源于stack exchange,提问作者Yonatan Cherkos
相关产品推荐
相关产品推荐

