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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:45:08