Flutter WebRTC:如何在应用后台运行时维持通话?
Flutter WebRTC音视频通话后台保活解决方案
你的问题核心是系统在APP后台/终止时回收了VoIP相关资源,导致通话中断。得针对iOS和Android平台分别做适配,再配合Flutter代码优化,才能实现后台持续通话:
一、Android平台必须做的配置
- 声明前台服务权限:在
android/app/src/main/AndroidManifest.xml里添加权限:<uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_VOIP" /> <!-- Android 14+ 需加 --> <uses-permission android:name="android.permission.WAKE_LOCK" /> - 启动VoIP前台服务:一旦通话开始,立刻启动前台服务,通过通知告知系统当前有活跃的VoIP通话,防止被回收。可以用
flutter_foreground_service这类插件实现。 - 豁免电池优化:引导用户给APP开启“不优化电池使用”权限,Android的电池管家会主动杀死后台非白名单APP,这步是后台通话的关键。
二、iOS平台必须做的配置
- 开启VoIP推送与CallKit:iOS系统对后台VoIP管控严格,必须用CallKit框架来管理通话。在Xcode的Capabilities里打开
Push Notifications和Voice over IP,同时配置APNs推送证书,这样APP被杀死时,系统能通过VoIP推送唤醒APP处理通话。 - 配置后台模式:在
Info.plist里添加后台模式:<key>UIBackgroundModes</key> <array> <string>voip</string> <string>audio</string> <string>fetch</string> </array> - 用CallKit管理通话生命周期:所有通话的发起、接听、挂断都要通过CallKit接口通知系统,这样系统会维持通话的音频会话,即使APP在后台也不会被回收。
三、Flutter代码优化(针对你的VoipApp类)
- 修改生命周期监听逻辑:后台时不要释放PeerConnection,反而要主动维持服务:
@override void didChangeAppLifecycleState(AppLifecycleState? state) { background = (state == AppLifecycleState.detached || state == AppLifecycleState.paused); if (background) { // Android启动前台服务,iOS更新CallKit会话 _handleBackgroundState(); } else { // 前台可停止前台服务(可选) _handleForegroundState(); } } Future<void> _handleBackgroundState() async { if (Platform.isAndroid) { // 启动前台服务示例 await ForegroundService.start( notificationTitle: "正在通话", notificationText: "音视频通话中", iconName: "ic_notification", ); } else if (Platform.isIOS) { // 更新CallKit通话状态,告知系统通话仍在进行 await FlutterCallkitIncoming.updateCall( id: currentCallSession?.id ?? "", status: CallStatus.ACCEPTED, ); } } - 避免Context泄漏:你的代码里直接传递BuildContext到VoipApp类,后台时可能引发内存泄漏或上下文失效,建议改用全局
GlobalKey<NavigatorState>来跳转页面:final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); // 在handleNewCall里跳转 navigatorKey.currentState?.push( MaterialPageRoute(builder: (context) => CallScreen(callSession: session)), ); - 维持PeerConnection活跃:后台时不要销毁PeerConnection实例,确保ICE候选持续交换,避免连接断开。
额外注意事项
- STUN/TURN服务器配置:必须配置可靠的STUN/TURN服务器,否则后台时网络环境变化可能导致NAT穿透失败,通话中断。
- 真机测试:模拟器对后台特性支持有限,一定要用真机测试后台和APP被杀死后的通话情况。
- 权限申请:动态申请麦克风、摄像头、通知等权限,确保APP能在后台访问音视频资源。
内容的提问来源于stack exchange,提问作者Vinayak Amirtharaj
相关产品推荐
相关产品推荐

