iOS Swift应用中Twilio Conversations API连接错误:网络连接丢失
问题场景
我在iOS Swift应用中使用Twilio Conversations API,从自有服务器获取token后,通过以下代码初始化TwilioConversationsClient:
func loginWithAccessToken(_ token: String) { // Set up Twilio Conversations client TwilioConversationsClient.conversationsClient(withToken: token, properties: nil, delegate: self) { (result, client) in self.client = client } }
执行后收到错误日志:
2023-03-22 22:44:46.186396-0700 app[21875:865489] Connection not set before response is received, failing task
2023-03-22 22:44:46.194863-0700 app[21875:865489] Task <724658EF-E3D3-4554-83C5-0975EE6C738C>.<1> finished with error [-1005] Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=https://tsock.us1.twilio.com:443/v3/wsconnect, NSErrorFailingURLKey=https://tsock.us1.twilio.com:443/v3/wsconnect, _NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalWebSocketTask <724658EF-E3D3-4554-83C5-0975EE6C738C>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <724658EF-E3D3-4554-83C5-0975EE6C738C>.<1>, NSLocalizedDescription=The network connection was lost.}
排查与解决步骤
1. 检查App Transport Security(ATS)配置
iOS默认ATS会限制不符合安全标准的网络连接,虽然Twilio域名使用HTTPS,但需确保ATS未拦截该域名。在Info.plist中添加以下配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>twilio.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.2</string> </dict> </dict> </dict>
注意:上架App Store时无需开启NSTemporaryExceptionAllowsInsecureHTTPLoads,Twilio域名符合苹果ATS安全标准。
2. 验证Access Token有效性
- 检查token是否包含
conversations:client权限,payload中的grants字段需包含chat(Conversations API的授权字段为chat) - 确认token未过期,查看
exp字段的时间戳是否在有效期内 - 可通过Twilio本地工具解析token payload,确认所有配置正确
3. 排查网络环境
- 用测试设备的Safari访问
https://tsock.us1.twilio.com:443/v3/wsconnect,若返回WebSocket upgrade required则说明网络可达 - 关闭设备的代理或VPN后重试,这类工具可能拦截WebSocket连接
4. 更新Twilio Conversations SDK版本
旧版本SDK可能存在WebSocket连接bug,通过CocoaPods或Swift Package Manager更新至最新稳定版:
# CocoaPods更新命令 pod update TwilioConversationsClient
5. 实现代理方法获取详细错误
确保已实现TwilioConversationsClientDelegate的错误回调,获取更具体的Twilio侧错误信息:
func conversationsClient(_ client: TwilioConversationsClient, encounteredError error: Error) { print("Twilio Client Detailed Error: \(error.localizedDescription)") }
6. 显式配置客户端属性
初始化时尝试设置WebSocket超时等属性,替换nil的properties参数:
let properties = TwilioConversationsClientProperties() properties.webSocketTimeout = 30 // 设置30秒超时 TwilioConversationsClient.conversationsClient(withToken: token, properties: properties, delegate: self) { (result, client) in self.client = client }
内容的提问来源于stack exchange,提问作者David

