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

Flutter中firebase_messaging插件iOS设备无法接收FCM通知问题(疑似Token生成异常)

iOS FCM通知无法接收?针对Token异常的排查与修复方案

看起来你的核心问题已经定位到iOS端FCM Token无效——PushTry的"Please check device token"提示直接指向了Token本身的问题,结合Android端正常的情况,咱们可以从以下几个方向针对性排查:

1. 先确保Token的获取流程正确

检查Firebase初始化时机

你的代码里initState直接调用getToken(),但Firebase可能还没完成初始化,这会导致获取到无效Token。建议先等待Firebase初始化完成再获取Token:

@override
void initState() {
  super.initState();
  _setupFirebaseAndToken();
}

Future<void> _setupFirebaseAndToken() async {
  // 先确保Firebase初始化完成
  await Firebase.initializeApp();
  // 再检查通知权限
  await _checkNotificationPermission();
  // 最后获取Token
  await getToken();
  showAlertNotification();
}

Future<void> _checkNotificationPermission() async {
  NotificationSettings settings = await FirebaseMessaging.instance.requestPermission(
    alert: true,
    badge: true,
    sound: true,
  );
  if (settings.authorizationStatus != AuthorizationStatus.authorized) {
    print("⚠️ 用户未授权通知权限,无法获取有效Token");
    // 这里可以引导用户去设置开启权限
    return;
  }
}

监听Token刷新事件

iOS的FCM Token可能会因为重装APP、系统更新、权限变更等情况刷新,一定要监听刷新事件,确保始终持有最新Token:

@override
void initState() {
  super.initState();
  // ...其他初始化代码
  FirebaseMessaging.instance.onTokenRefresh.listen((newToken) {
    print("🔄 FCM Token已刷新: $newToken");
    setState(() {
      token = newToken;
    });
    // 记得把新Token同步到你的服务器
  });
}

2. 排查APNs与Firebase的配置一致性

虽然之前功能正常,但配置可能因为证书过期、更新失效:

  • 去Apple Developer后台检查**推送证书(Development/Production)**是否有效,有没有过期;如果用的是APNs Auth Key(.p8文件),确认密钥是否未被撤销。
  • 登录Firebase控制台,重新上传最新的APNs配置(证书或密钥),然后下载新的GoogleService-Info.plist替换项目中的旧文件,之后clean项目再重新编译运行。

3. 修复FCM Payload的iOS适配问题

你的sendNotification方法里的payload格式对iOS不够友好,尤其是后台通知的配置:

  • iOS的content-available需要放在aps字段下,而不是notification里;
  • 建议单独为iOS添加aps字段,确保通知能被APNs正确解析:
body: jsonEncode(
  <String, dynamic>{
    'notification': <String, dynamic>{
      'body': 'this is a body',
      'title': 'this is a title',
    },
    // 新增iOS专属的aps配置
    'aps': <String, dynamic>{
      'content-available': 1, // 后台唤醒必备
      'alert': {
        'title': 'this is a title',
        'body': 'this is a body'
      },
      'sound': 'default'
    },
    'priority': 'high',
    'data': <String, dynamic>{
      'click_action': 'FLUTTER_NOTIFICATION_CLICK',
      'id': '1',
      'status': 'done'
    },
    'to': token,
  },
),

4. 测试环境要匹配

iOS的推送分Sandbox(开发环境)和Production(生产环境),两个环境的Token不通用:

  • 如果你用Xcode的Debug模式运行APP,测试时要选择Sandbox环境;
  • 如果是Ad Hoc或App Store打包的APP,必须用Production环境测试;
  • PushTry测试时一定要选对环境,否则会出现Token无效的提示。

按照以上步骤逐一排查,应该能解决iOS Token无效导致的通知接收问题。

内容的提问来源于stack exchange,提问作者Shruti Ramnandan Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:02:52