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
相关产品推荐
相关产品推荐

