升级Xcode13.1后请求API出现boringssl_metrics相关报错如何解决
问题原因分析
1. boringssl相关报错的本质
这个[boringssl] boringssl_metrics_log_metric_block_invoke(144) Failed to log metrics日志是Xcode 13+集成的新网络栈打印的系统级警告,并不是导致你接口请求失败的根因,绝大多数情况下这个警告不影响实际网络请求逻辑,可以忽略,你请求失败的问题出在自身的代码逻辑上。
2. 代码存在的问题
你的解码逻辑存在严重的命名冲突问题:
- 系统
Foundation框架本身已经存在名为Data的二进制数据类型,你自己定义的接收JSON结构的模型类/结构体不应该重名叫Data - 你当前代码里
JSONDecoder().decode(Data.self, from: data!)这里的Data.self实际指向系统的二进制类型,根本不是你自定义的模型,所以解码必然失败,才会走到catch分支打印Error
修复方案
- 首先将你自定义的接收接口返回结构的模型改名,比如改为
ApiResponse,对应内部嵌套的数据结构同步调整命名,不要和系统自带类型重名 - 增加解码错误的打印逻辑,方便排查后续可能的模型字段不匹配问题
- 避免强制解包,增加异常兼容
修复后的代码参考:
// 首先定义和接口返回结构匹配的模型,不要用Data作为类型名 struct ApiResponse: Codable { let data: ResponseData? // 其他接口返回的顶层字段按需补充 } struct ResponseData: Codable { let data: [Item]? // 对应结构里的其他字段按需补充 } struct Item: Codable { // 你每条数据的字段按需定义 } func parse() { let jsonUrlString = "https://api.tiki.vn/shopping-trend/api/trendings/hub?cursor=0&limit=20" guard let url = URL(string: jsonUrlString) else { return } URLSession.shared.dataTask(with: url) { [weak self] data, response, err in if let err = err { print("请求错误:\(err)") return } guard let data = data else { print("返回数据为空") return } do { // 这里填你改完名的顶层模型类型 let result = try JSONDecoder().decode(ApiResponse.self, from: data) DispatchQueue.main.async { self?.items = result.data?.data ?? [] print(self?.items ?? []) } } catch { // 打印解码错误详情,方便排查字段不匹配问题 print("解码错误:\(error)") } } .resume() }
额外说明
如果要完全屏蔽boringssl的警告日志,可以在Xcode的Scheme -> Run -> Arguments -> Environment Variables里添加变量OS_ACTIVITY_MODE,值设为disable即可,不过不建议这么做,会屏蔽掉其他有用的系统日志。
内容的提问来源于stack exchange,提问作者baohoang
相关产品推荐
相关产品推荐

