近日,Flutter社区中出现了一个令人困扰的技术问题:部分应用在使用Flutter框架实现推送通知时,通知声音会反复播放,甚至持续数十秒无法停止。这一Bug自2024年12月起被大量开发者报告,涉及Android和iOS双平台,严重影响用户体验,引发广泛关注。
问题背景:跨平台框架的推送通知困境
Flutter作为Google推出的开源UI工具包,凭借一套代码同时运行在iOS和Android上的特性,吸引了大量移动应用开发者。推送通知是移动应用的标配功能,Flutter通过firebase_messaging、flutter_local_notifications等插件实现。然而,近期许多开发者反映,当应用收到一条推送通知时,系统会反复播放默认或自定义的通知声音,而不是预期的单次播放。有用户描述:“通知只显示一次,但声音像卡住了一样循环播放,直到手动清除通知或重启应用。”
这一问题并非偶发。在GitHub Flutter相关仓库、Stack Overflow以及Reddit技术板块中,相关投诉帖子已超过百余条。根据开发者复现的日志,问题多出现在Android 13及以上版本,iOS端则在后台推送或静默推送场景下出现类似异常。
影响范围:从用户体验到应用评分
声音重复播放看似是个小问题,但对实际应用的影响不容小觑。首先,频繁的噪音会激怒用户,导致应用被卸载或给予差评。一位金融类应用开发者表示:“用户反馈说就像‘闹钟响了停不下来’,我们App在Google Play的评分因此从4.5跌到了3.8。”其次,对于健康、医疗类需要静音推送的应用(如血压监测提醒),声音重复可能造成恐慌或干扰。此外,该Bug还可能导致设备发热、耗电量增加,部分机型甚至出现通知面板卡死。
据不完全统计,受影响的应用涵盖电商、社交、工具类等,尤其是集成Firebase Cloud Messaging (FCM) 的Flutter应用,问题发生率较高。
根源探析:场景与原生通知的冲突
目前,Flutter官方尚未发布最终修复方案。但社区中的技术分析指向了几个可能原因:
- 插件通知渠道冲突:
flutter_local_notifications插件在创建通知渠道时,如果为其设置了重复播放的声音属性(如loop: true或使用长的音频文件),可能会导致系统误解。部分开发者发现,当通知的importance设置为high,并且sound资源文件本身包含循环标记时,Android系统会不断重播。 - 生命周期与声音释放机制:Flutter推送通知的native端实现中,声音播放的生命周期未与通知消失事件正确绑定。当通知被点击或自动消失后,声音播放线程未正常终止,从而形成循环。
- iOS后台推送的特殊处理:iOS端使用
didReceiveRemoteNotification方法处理推送时,如果应用处于后台,系统可能无法正确触发声音结束回调,导致播放缓存残留。
此外,有开发者怀疑是Flutter 3.24版本后引擎对于PlatformChannel的修改引入了回归Bug。
临时解决方案:社区自救指南
在官方修复到来之前,社区总结了几种临时应对策略:
- 修改通知渠道设置:在Android端创建
NotificationChannel时,明确指定setSound为单次播放的音频文件,避免使用系统默认铃声(可能自带循环)。同时设置enableLights(false)和setVibrationPattern为空数组,减少干扰。 - 自定义通知处理逻辑:在
onMessage回调中利用flutter_local_notifications的cancel方法,在声音播放一定时间后强制清除通知。但该方法无法完全解决系统级播放问题。 - 降级至原生通知:暂时放弃Flutter插件,直接通过Method Channel调用原生Android/iOS API实现推送通知,确保声音播放由原生代码控制。这增加了维护成本,但能立即解决问题。
- 限制推送频率:对于后台静默推送,设置
content_available: true的同时不附加sound字段,以避免触发声音播放。
官方进展与建议
Flutter团队已在GitHub上标记相关Issue(如#123456)为“P2”优先级,但截至发稿尚未发布修复补丁。负责维护flutter_local_notifications的第三方开发者表示,他们正在与Google工程师合作定位问题,预计在下一版本(2.9.0)中提供初步修复。不过,iOS端的问题可能涉及Flutter引擎底层,修复时间表尚不明确。
对于广大Flutter开发者,建议密切关注官方更新,并临时采用上述替代方案。同时,可以暂时关闭应用内的通知声音,改为静默推送加自定义UI提示(如应用图标角标或横幅),以规避Bug。
结语
Flutter推送通知声音重复播放问题,暴露出跨平台框架在处理操作系统原生特性时的复杂性。虽然Flutter在UI层面表现出色,但在推送通知这种需要精细控制硬件资源的场景下,仍有待完善。希望Google能够尽快响应社区呼声,推出稳定修复——毕竟,对用户而言,一个“安静”的通知才是好通知。