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

Flutter应用使用sip_ua包无法注册Twilio SIP域名求助

Flutter sip_ua 连接Twilio SIP域名失败问题

问题背景

用Zoiper测试Twilio SIP域名完全正常,后台也能看到注册数据,但用Flutter的sip_ua^1.0.0包使用相同凭据连接时持续失败,已卡在此问题3周。

当前配置与代码

final SIPUAHelper helper = SIPUAHelper();
final UaSettings settings = UaSettings();
helper.addSipUaHelperListener(this);
settings.webSocketUrl = "wss://flu.sip.us1.twilio.com:443"; // Twilio WSS URL
settings.uri = "sip:101@flu.sip.us1.twilio.com"; // SIP URI
settings.authorizationUser = '101'; // 授权用户名
settings.password = '*******'; // SIP用户密码
settings.displayName = 'Display name';

settings.register_expires = 3600;
await helper.start(settings);
helper.register();

错误日志

I/flutter (25365): [2024-09-06 21:56:32.925] Level.debug websocket_interface.dart:87 ::: 正在连接WebSocket wss://flu.sip.us1.twilio.com:443
I/flutter (25365): [2024-09-06 21:56:32.951] Level.info websocket_dart_impl.dart:26 ::: 连接 wss://flu.sip.us1.twilio.com:443, {}, [sip]
I/flutter (25365): [2024-09-06 21:56:33.7] Level.debug ua.dart:183 ::: register()
I/flutter (25365): [2024-09-06 21:56:33.11] Level.warning registrator.dart:135 ::: <sip:lciozuob@6fm513517h47.invalid;transport=wss>;+sip.ice;reg-id=1;+sip.instance="<urn:uuid:43dc2fcf-d8e8-4904-9b6d-54effaf231a7>"
I/flutter (25365): [2024-09-06 21:56:33.33] Level.debug transport.dart:145 ::: send()
I/flutter (25365): [2024-09-06 21:56:33.35] Level.error transport.dart:148 ::: 无法发送消息,传输未连接。当前状态为1
I/flutter (25365): transport.dart:151
I/flutter (25365): non_invite_client.dart:46
I/flutter (25365): request_sender.dart:74
I/flutter (25365): registrator.dart:274
I/flutter (25365): ua.dart:185
I/flutter (25365): sip_ua_helper.dart:73
I/flutter (25365): webrtc_service.dart:92
I/flutter (25365): [2024-09-06 21:56:33.39] Level.debug non_invite_client.dart:53 ::: 发生传输错误,删除事务 z9hG4bK3870384
I/flutter (25365): [2024-09-06 21:56:33.46] Level.debug sip_ua_helper.dart:179 ::: registrationFailed => 代码: [500], 原因: SIP失败码, 描述: 连接错误
I/flutter (25365): 注册状态变更-------------------------RegistrationStateEnum.REGISTRATION_FAILED
...
I/flutter (25365): [2024-09-06 21:58:46.721] Level.debug websocket_interface.dart:167 ::: WebSocket wss://flu.sip.us1.twilio.com:443 已关闭
I/flutter (25365): [2024-09-06 21:58:46.724] Level.debug sip_ua_helper.dart:158 ::: 已断开连接 => 代码: [0], 原因: error, 描述: 客户端发送断开连接指令
I/flutter (25365): 传输状态变更-------------------------TransportStateEnum.DISCONNECTED
I/flutter (25365): [2024-09-06 21:58:46.727] Level.debug transport.dart:183 ::: 重连尝试: 2. 下一次连接尝试将在4秒后进行
I/flutter (25365): [2024-09-06 21:58:46.731] Level.error websocket_interface.dart:131 ::: close() | 关闭WebSocket时出错: 在null值上使用了空检查运算符

问题分析与解决步骤

1. 核心问题:WebSocket未建立就发起注册

日志明确显示无法发送消息,传输未连接,说明调用helper.register()时,WebSocket连接还未完成初始化。await helper.start(settings)只是启动基础配置,WebSocket连接是异步操作,不会立即完成。

2. 修复方案:监听连接状态后再触发注册

移除start之后直接调用register的逻辑,通过SIPUAHelperListener的transportConnected回调来发起注册:

修改后的代码逻辑:

final SIPUAHelper helper = SIPUAHelper();
final UaSettings settings = UaSettings();
helper.addSipUaHelperListener(_sipListener);

settings.webSocketUrl = "wss://flu.sip.us1.twilio.com:443";
settings.uri = "sip:101@flu.sip.us1.twilio.com";
settings.authorizationUser = '101';
settings.password = '*******';
settings.displayName = 'Display name';
settings.register_expires = 3600;

await helper.start(settings);
// 不再直接调用helper.register()

实现监听回调:

final SIPUAHelperListener _sipListener = SIPUAHelperListener() {
  @override
  void transportConnected() {
    // 确认WebSocket连接成功后,再发起注册
    helper.register();
  }

  @override
  void registrationFailed(String? reason, int? code) {
    print("注册失败: $code - $reason");
  }

  @override
  void registrationDone() {
    print("注册成功");
  }

  // 按需实现其他回调方法
};

3. 额外排查点

  • WebSocket URL简化:尝试去掉端口号443,直接使用wss://flu.sip.us1.twilio.com,443是WSS默认端口,部分库对带端口的URL处理可能存在兼容问题。
  • 证书验证临时关闭:如果是证书验证问题,可临时关闭验证(仅测试用,生产环境禁用),添加配置:settings.badCertificateCallback = (cert, host, port) => true;。
  • 权限配置检查:AndroidManifest.xml中确保添加网络权限:
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    iOS的Info.plist中添加ATS例外(若有需要):
    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    

4. 空指针错误处理

日志末尾的在null值上使用了空检查运算符是sip_ua包内部bug,可尝试升级包到最新版本,或在transportDisconnected回调中避免操作已释放的WebSocket实例。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:37:33