You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用flutter_webrtc在后台保持与SIP服务器的连接以接收VoIP呼叫?

Flutter WebRTC + sip_ua 实现后台保持SIP注册并接收呼叫

可行性说明

完全可行。Flutter结合平台原生能力,配合sip_ua包的SIP协议支持,能够实现后台保持注册并接收呼叫,但需要针对Android和iOS的后台限制做针对性配置和代码处理。

具体实现步骤

1. 配置平台后台权限

Android端

  • 在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 声明前台服务:在application标签内添加服务声明,用于后台保持进程存活(Android 8+要求后台任务必须以前台服务运行):
    <service
        android:name=".SipForegroundService"
        android:foregroundServiceType="mediaPlayback|phoneCall" />
    
  • 申请POST_NOTIFICATIONS权限(Android 13+),前台服务需要显示通知。

iOS端

  • 在Info.plist中开启Background Modes,勾选Voice over IP选项。
  • 添加VoIP推送相关配置:在Info.plist中加入
    <key>UIBackgroundModes</key>
    <array>
        <string>voip</string>
    </array>
    
  • 配置PushKit证书:在苹果开发者后台创建VoIP推送证书,用于接收后台来电推送(iOS只有VoIP推送能唤醒挂起的应用处理SIP来电)。

2. 保持SIP注册状态

  • 利用sip_ua包的自动注册刷新机制:初始化SIPUAHelper时,设置合理的注册过期时间(比如300秒),确保客户端会自动发送注册刷新请求。
  • 后台任务保活:
    • Android:通过前台服务运行SIP客户端逻辑,避免进程被系统回收。可以在应用进入后台时启动前台服务,显示一个与通话相关的通知(比如"VoIP通话保持中")。
    • iOS:依赖PushKit推送唤醒应用,收到推送后检查注册状态,若已过期则重新注册。同时可以用BackgroundTask插件处理短时间的后台任务,完成注册刷新。
  • 注册重试机制:监听sip_ua的注册失败事件,当网络恢复或注册失败时,自动触发重新注册。

3. 后台接收呼叫处理

  • Android:前台服务运行时,sip_ua的来电回调会正常触发,收到来电后发送高优先级通知,点击通知可唤起应用并显示通话界面。
  • iOS:必须通过PushKit接收来电通知(SIP服务器需要配置推送网关,将来电事件转为VoIP推送)。收到PushKit推送后:
    1. 初始化或恢复SIP客户端连接。
    2. 使用CallKit框架显示系统级来电界面(iOS要求必须用CallKit,否则会被系统限制后台来电处理)。
    3. 关联sip_ua的来电事件,完成呼叫建立。

4. 代码关键处理示例

  • 监听应用前后台状态:
    class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
      @override
      void initState() {
        super.initState();
        WidgetsBinding.instance.addObserver(this);
      }
    
      @override
      void didChangeAppLifecycleState(AppLifecycleState state) {
        super.didChangeAppLifecycleState(state);
        if (state == AppLifecycleState.paused) {
          // 进入后台,启动Android前台服务/确保iOS PushKit监听有效
          _startForegroundService();
        }
      }
    
      void _startForegroundService() {
        // 调用原生方法启动前台服务(Android)
        // 示例:MethodChannel.invokeMethod('startForegroundService');
      }
    }
    
  • SIP客户端初始化(确保后台可运行):
    final sipHelper = SIPUAHelper();
    await sipHelper.init(
      SIPUAConfiguration(
        uri: 'sip:username@sip-server.com',
        authorizationUser: 'username',
        password: 'password',
        wsUri: 'wss://sip-server.com/ws',
      ),
      // 注册回调监听
      registrationStateCallback: (state) {
        if (state == RegistrationState.Registered) {
          // 注册成功
        } else if (state == RegistrationState.Unregistered) {
          // 注册失效,尝试重新注册
          sipHelper.register();
        }
      },
      callStateCallback: (call) {
        if (call.state == CallState.Incoming) {
          // 处理来电,显示通知/CallKit界面
        }
      },
    );
    

内容的提问来源于stack exchange,提问作者ASAD HAMEED

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 08:22:45