Swift中使用URLSession调用WunderGraph订阅接口超时问题求助
解决Swift URLSession调用WunderGraph订阅超时(错误码-1001)的方案
调整URLSession超时配置
默认的timeoutIntervalForRequest(60秒)对于长连接订阅来说过短,直接触发超时。需要针对性调大超时参数:let config = URLSessionConfiguration.default // 请求超时设为5分钟,覆盖长连接的空闲等待期 config.timeoutIntervalForRequest = 300 // 资源超时设为1天,适配订阅的长期连接需求 config.timeoutIntervalForResource = 86400 let session = URLSession(configuration: config)禁用HTTP Pipelining
WunderGraph订阅通常基于HTTP/2或WebSocket实现,而httpShouldUsePipelining是HTTP/1.1的特性,强制开启可能和HTTP/2的多路复用机制冲突,导致连接异常中断:config.httpShouldUsePipelining = false完全匹配请求头(对齐cURL/Postman配置)
复制cURL/Postman中所有请求头,尤其是订阅相关的关键字段,避免因头信息缺失或不匹配导致服务端拒绝长连接:var request = URLRequest(url: yourWunderGraphSubscriptionURL) request.httpMethod = "POST" // 确保和cURL的请求方法一致 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 若为SSE类型订阅,Accept需设为text/event-stream request.setValue("text/event-stream", forHTTPHeaderField: "Accept") request.setValue("keep-alive", forHTTPHeaderField: "Connection") request.setValue("no-cache", forHTTPHeaderField: "Cache-Control") // 添加授权等自定义头,完全对齐cURL中的配置 request.setValue("Bearer your-auth-token", forHTTPHeaderField: "Authorization")使用数据流模式处理实时数据
不要用传统的dataTask(with:completionHandler:),它会等待完整响应返回(长连接永远不会完成),必然触发超时。改用实时数据流处理方式:// 方案1:Combine(iOS 13+) import Combine let cancellable = session.dataTaskPublisher(for: request) .sink(receiveCompletion: { completion in // 处理连接终止或错误 }, receiveValue: { data, response in // 实时处理收到的分片数据 if let content = String(data: data, encoding: .utf8) { print("实时数据:\(content)") } }) // 方案2:URLSessionDataDelegate(兼容低版本iOS) class SubscriptionHandler: NSObject, URLSessionDataDelegate { func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) { // 实时处理每一批收到的数据 } } let handler = SubscriptionHandler() let session = URLSession(configuration: config, delegate: handler, delegateQueue: nil) let task = session.dataTask(with: request) task.resume()排查网络环境干扰
iOS的URLSession可能受系统代理、VPN或网络防火墙影响,导致连接中途断开。尝试关闭代理/VPN,切换到稳定的Wi-Fi或蜂窝网络测试。核对WunderGraph订阅端点要求
部分场景下WunderGraph要求使用WebSocket而非HTTP长连接,此时需改用URLSessionWebSocketTask实现:let webSocketTask = session.webSocketTask(with: yourWunderGraphWebSocketURL) webSocketTask.resume() // 发送订阅请求 let subscribeMsg = URLSessionWebSocketTask.Message.string("{\"query\": \"your-subscription-query-content\"}") webSocketTask.send(subscribeMsg) { error in if let err = error { print("发送订阅请求失败:\(err)") } } // 循环接收实时消息 func handleWebSocketReceive(result: Result<URLSessionWebSocketTask.Message, Error>) { switch result { case .success(let msg): if case .string(let content) = msg { print("WebSocket实时数据:\(content)") } webSocketTask.receive(completionHandler: handleWebSocketReceive) case .failure(let err): print("接收消息失败:\(err)") } } webSocketTask.receive(completionHandler: handleWebSocketReceive)
内容的提问来源于stack exchange,提问作者Amrit Tiwari
相关产品推荐
相关产品推荐

