Flutter应用升级编译版本后仅红米设备无法获取FCM Device Token求助
Flutter应用升级编译版本后仅红米设备无法获取FCM Device Token求助
遇到这种特定品牌设备的兼容性问题确实让人头大,我结合红米MIUI的特性和你升级编译版本的背景,帮你梳理下可能的原因和解决思路:
可能的原因分析
- MIUI的特殊后台/权限限制:红米的MIUI系统对应用后台行为和权限的管控一向比原生Android严格,你升级targetSdk到35后,Android本身的后台限制也更严苛,双重限制下FCM服务可能无法正常初始化获取token,哪怕用户已经授予了通知权限。
- Firebase依赖版本不兼容:你升级了compileSdk到36、targetSdk到35,但如果使用的
firebase_messaging还是旧版本,可能存在高编译版本适配问题,导致在MIUI这类定制系统上失效。 - MIUI自启动/省电策略拦截:红米设备默认可能把你的应用设为“省电模式”或限制自启动,FCM需要应用保持一定的后台活跃度才能完成token获取流程,被系统拦截后就拿不到token了。
- 权限请求的细节遗漏:虽然你请求了通知权限,但targetSdk33+需要单独请求
POST_NOTIFICATIONS权限,可能你的代码在MIUI上的权限请求流程没有完全适配,导致实际权限未生效。
具体解决办法
- 升级Firebase依赖版本:检查
pubspec.yaml里的firebase_messaging版本,确保它支持compileSdk 36,建议直接升级到最新的稳定版本,很多高版本编译适配问题都会在新版本中修复。 - 引导用户检查MIUI专属设置:让出现问题的红米用户做以下操作:
- 开启应用的自启动权限:路径一般是「设置 → 应用设置 → 权限管理 → 自启动」,找到你的应用并开启
- 关闭应用的省电策略:把应用的省电模式设为「无限制」,避免系统在后台杀死FCM相关进程
- 开启后台弹出界面权限:部分MIUI版本需要这个权限才能让FCM服务正常运行
- 优化token获取时机:不要在App启动的第一时间就调用
FcmTokenManager.init(),可以延迟几秒(比如在首页的initState里延迟3-5秒),或者等用户有交互后再尝试,MIUI在应用启动初期可能会限制网络或服务调用。 - 完善日志排查:在你的
_fetchToken和_retryGetToken方法里增加更详细的日志,比如打印Firebase.initializeApp()的初始化状态、网络连接状态,以及getToken调用的具体返回细节,方便定位到底是调用失败还是返回null。 - 检查AndroidManifest配置:确保已经添加了
POST_NOTIFICATIONS权限声明:
同时确认<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />google-services.json文件是最新的,包名、项目ID等信息和当前应用完全匹配。 - 尝试手动触发token刷新:在用户进入应用设置页面时,增加一个“重新获取推送token”的按钮,调用
_messaging.getToken()手动触发,看是否能成功获取,排除启动时的时机问题。
额外提醒
MIUI的系统版本差异也很大,不同红米机型的MIUI版本可能有不同的权限逻辑,建议你找一台出问题的红米设备真机调试,通过Android Studio的Logcat过滤FCM相关日志(比如搜索「FirebaseMessaging」),能更精准地找到问题所在。
备注:内容来源于stack exchange,提问作者Sindu




