SwiftUI中调用API获取空响应、控制台libquic报错问题求助
问题排查与修正方案
核心问题点
- 接口返回格式与解析器不匹配:你调用的接口路径后缀为
.xml,返回的是XML格式数据,但代码中使用JSONDecoder做JSON解码,解码流程直接触发失败,完全无法给travelTime变量赋值。这是解析失效的根本原因。 - 异步逻辑顺序错误:
URLSession的网络请求是异步执行的,在调用resume()后代码会立刻向下执行到print(self.travelTime),此时网络请求尚未返回数据,变量自然为空值。哪怕解析逻辑完全正确,这行打印也拿不到赋值后的结果。 - UI状态更新未切主线程:网络请求回调默认运行在后台队列,直接在回调中修改
@State修饰的travelTime变量,会导致UI更新异常,甚至触发系统渲染警告。 - ATS明文请求拦截:你调用的是
http开头的非加密接口,iOS默认的应用传输安全(ATS)机制会直接拦截这类请求,导致根本无法拿到有效返回数据。
控制台报错说明
控制台输出的nw_protocol_get_quic_image_block_invoke dlopen libquic failed属于iOS网络栈的系统日志,含义是系统尝试加载QUIC协议可选组件失败,完全不影响普通TCP网络请求的正常运行,和当前遇到的解析问题没有任何关联,不需要专门处理。
修正参考代码
原接口返回XML格式数据,需替换原有JSON解析逻辑,以下为符合规范的代码框架:
import SwiftUI struct ContentView: View { @State private var travelTime = "" var body: some View { VStack(spacing: 20) { Text("Time: \(travelTime)") Button("FetchAPI") { fetchAPI() } } } private func fetchAPI() { // 用guard let替代强制解包,避免无效URL导致崩溃 guard let url = URL(string: "http://api.sl.se/api2/TravelplannerV3_1/trip.xml?key=40892db48b394d3a86b2439f9f3800fd&originExtId=300101416&destExtId=300101426&Date=2021-04-15&Time=08:00&searchForArrival=1") else { print("接口URL格式无效") return } URLSession.shared.dataTask(with: url) { data, _, error in // 完善错误处理 if let error = error { print("网络请求失败: \(error.localizedDescription)") return } guard let data = data else { print("未获取到有效返回数据") return } // 替换原有JSONDecoder逻辑,改用XML解析提取目标字段 if let targetTime = parseXMLTime(from: data) { // 必须切回主线程更新UI状态 DispatchQueue.main.async { travelTime = targetTime // 正确的打印位置:拿到解析结果后再输出 print("提取的出行时间: \(travelTime)") } } }.resume() } // XML解析逻辑占位,需遍历节点找到对应Leg元素下Origin的time字段值 private func parseXMLTime(from data: Data) -> String? { // 此处可使用系统XMLParser完成字段提取 return nil } }
额外配置要求
因为使用了http明文接口,需要在项目的Info.plist中添加ATS例外配置,否则系统会直接拦截请求:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
内容的提问来源于stack exchange,提问作者User123
相关产品推荐
相关产品推荐

