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

SwiftUI调用登录API崩溃求助:Thread 14错误排查

问题排查与解决步骤

这个错误的核心原因是:你尝试解析的接口返回内容不是标准的JSON数组或对象,可能是接口返回了HTML错误页、纯文本提示,或是请求本身出错导致返回非JSON数据。以下是具体排查和修复方法:

1. 先查看接口返回的原始内容

在解析JSON前,先打印接口返回的原始数据,确认实际内容:

// 修改你的URLSession请求代码,添加原始数据打印
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("请求出错:\(error.localizedDescription)")
        return
    }
    // 打印原始响应字符串
    if let data = data, let rawContent = String(data: data, encoding: .utf8) {
        print("接口返回内容:\(rawContent)")
    }
    // 原有的解析代码...
}
task.resume()

运行后看控制台输出,大概率会发现返回的是404/500错误页面、纯文本提示,而非预期的JSON数据。

2. 检查请求的合法性

  • 请求方法:确认接口loginScanAccount要求用POST还是GET,多数登录接口为POST,检查你是否用错了请求方法。
  • 请求头:如果是传JSON参数,需设置Content-Type: application/json;如果是表单参数,需对应设置application/x-www-form-urlencoded,确保头信息符合接口要求。
  • 参数格式:检查登录参数(如账号、密码)的键名是否拼写正确,参数是否按接口要求的格式传递(比如是否需要包裹成JSON字符串)。

3. 修复JSON解析逻辑

如果接口确实存在非JSON返回的场景(比如成功返回JSON,失败返回纯文本),可以开启允许解析JSON片段的选项:

do {
    // 添加.allowFragments选项,允许解析单个JSON值(如字符串、数字)
    let jsonResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
    // 处理解析结果
} catch {
    print("解析失败:\(error.localizedDescription)")
}

注意:这只是临时妥协方案,核心还是要确保接口返回合法的JSON对象/数组。

4. 处理HTTP响应异常

添加状态码判断,避免在请求出错时强行解析JSON:

if let httpResponse = response as? HTTPURLResponse {
    print("响应状态码:\(httpResponse.statusCode)")
    // 4xx/5xx状态码表示请求出错,直接返回不解析
    if httpResponse.statusCode >= 400 {
        return
    }
}

常见额外坑点

  • 确认接口地址是否正确:检查域名、端口号、路径是否拼写错误。
  • 模拟器网络权限:确保模拟器能正常访问外部网络,可直接用浏览器打开https://foldlab.io:8081/loginScanAccount测试连通性。

内容的提问来源于stack exchange,提问作者Athellan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:45:35