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中确保添加网络权限:
iOS的Info.plist中添加ATS例外(若有需要):<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
4. 空指针错误处理
日志末尾的在null值上使用了空检查运算符是sip_ua包内部bug,可尝试升级包到最新版本,或在transportDisconnected回调中避免操作已释放的WebSocket实例。
内容的提问来源于stack exchange,提问作者Subtain
相关产品推荐
相关产品推荐

