You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter应用升级编译版本后仅红米设备无法获取FCM Device Token求助

Flutter应用升级编译版本后仅红米设备无法获取FCM Device Token求助

遇到这种特定品牌设备的兼容性问题确实让人头大,我结合红米MIUI的特性和你升级编译版本的背景,帮你梳理下可能的原因和解决思路:

可能的原因分析

  1. MIUI的特殊后台/权限限制:红米的MIUI系统对应用后台行为和权限的管控一向比原生Android严格,你升级targetSdk到35后,Android本身的后台限制也更严苛,双重限制下FCM服务可能无法正常初始化获取token,哪怕用户已经授予了通知权限。
  2. Firebase依赖版本不兼容:你升级了compileSdk到36、targetSdk到35,但如果使用的firebase_messaging还是旧版本,可能存在高编译版本适配问题,导致在MIUI这类定制系统上失效。
  3. MIUI自启动/省电策略拦截:红米设备默认可能把你的应用设为“省电模式”或限制自启动,FCM需要应用保持一定的后台活跃度才能完成token获取流程,被系统拦截后就拿不到token了。
  4. 权限请求的细节遗漏:虽然你请求了通知权限,但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

火山引擎 最新活动