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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 07:57:00