CFNetwork未知错误日志:iOS JSON下载函数异常排查
排查CFNetwork未知错误的分步方案
我来帮你一步步拆解这个问题,从代码和iOS网络配置两个核心方向入手:
1. 先完善错误日志,把“未知”变成“可知”
你的代码里对错误的处理太简略了,根本看不到CFNetwork错误的具体信息,先把所有可能的错误都打印出来:
func downloadJSON(completed: @escaping () -> ()) { guard let url = URL(string: "http://tourofhonor.com/BonusData.json") else { print("❌ 无效的URL地址") completed() return } URLSession.shared.dataTask(with: url) { (data, response, error) in // 打印网络请求错误详情 if let error = error { print("🔴 网络请求失败: \(error.localizedDescription)") print("🔍 CFNetwork错误详情: \(error)") completed() return } // 检查返回数据是否为空 guard let data = data else { print("⚠️ 服务器未返回任何数据") completed() return } do { self.tohBonuses = try JSONDecoder().decode([jsonBonuses].self, from: data) DispatchQueue.main.async { completed() } } catch { // 打印JSON解码的具体错误 print("🟡 JSON解码失败: \(error)") } }.resume() }
修改后再运行,控制台会输出具体的错误码和描述,这是排查的核心第一步。
2. 最可能的原因:ATS拦截了HTTP请求
你用的是http协议,而iOS默认的App Transport Security(ATS)会阻止非HTTPS的网络请求,这大概率是CFNetwork错误的元凶。解决方法是在Info.plist里配置ATS例外:
- 右键点击
Info.plist→ 选择Open As→Source Code - 添加以下推荐的特定域名配置(比全局关闭ATS更安全,适合上线):
<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>tourofhonor.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
如果只是临时测试,也可以全局关闭ATS(不推荐用于上线版本):
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
3. 其他潜在问题排查
- 检查设备/模拟器的网络连接:确保能正常访问这个URL(可以在Safari里打开
http://tourofhonor.com/BonusData.json测试) - 确认
jsonBonuses模型的结构和返回的JSON完全匹配:如果结构不匹配,解码错误也可能伴随一些网络日志干扰,打印解码错误后就能明确这一点
内容的提问来源于stack exchange,提问作者DJFriar
相关产品推荐
相关产品推荐

