SwiftUI对接OpenWeatherMap API报Failed to log metrics错误如何解决
问题原因分析
你看到的[boringssl]开头的日志是iOS 15+的系统级冗余日志,和业务逻辑无关,代码里打印的failed才是实际业务错误,来自JSON解析的catch分支。
核心错误是JSON解析模型结构和OpenWeatherMap返回的结构不匹配:
OpenWeatherMap接口返回的结构中,weather数组是和name、main同级的顶层字段,不是嵌套在main字段下的。你当前的Model把weather放在了对应main字段的CurrentWeather结构体中,解析时找不到对应字段就会抛出错误,走到catch分支打印失败日志。
其他可能的排查点:
- 代码里的
<myAPIKeyGoesHere>有没有替换成OpenWeatherMap后台申请的真实有效API key?新申请的API key需要10分钟左右的激活时间,刚申请完直接调用会返回401错误,也会导致解析失败。 - 如果你修改过项目默认的ATS规则,需要确认已经允许HTTPS请求,否则会被系统拦截网络请求。
- 接口默认返回的温度是开尔文单位,数值不符合日常使用习惯,可以额外加
units=metric参数切换为摄氏度单位。
修复方案
- 修正Model的结构:
import Foundation struct WeatherModel: Codable { let name: String let main: CurrentWeather let weather: [WeatherInfo] // 将weather移到顶层,和main同级 } struct CurrentWeather: Codable { let temp: Float } struct WeatherInfo: Codable { let description: String }
- 修正ViewModel里的赋值逻辑:
DispatchQueue.main.async { self.name = model.name self.temp = "\(Int(model.main.temp))" // 可以转成整数显示更美观 self.descriptionText = model.weather.first?.description ?? "No Description" // 从model顶层取weather字段 }
- 可选优化:调整接口地址切换温度单位
https://api.openweathermap.org/data/2.5/weather?q=chicago&units=metric&appid=你的真实APIKey
调试时可以把catch块的print("failed")改成print("解析失败:\(error)"),就能直接看到具体的错误原因,进一步提升排查效率。
内容的提问来源于stack exchange,提问作者JS_is_awesome18
相关产品推荐
相关产品推荐

