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

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参数切换为摄氏度单位。
修复方案
  1. 修正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
}
  1. 修正ViewModel里的赋值逻辑:
DispatchQueue.main.async {                    
    self.name = model.name
    self.temp = "\(Int(model.main.temp))" // 可以转成整数显示更美观
    self.descriptionText = model.weather.first?.description ?? "No Description" // 从model顶层取weather字段
}
  1. 可选优化:调整接口地址切换温度单位
https://api.openweathermap.org/data/2.5/weather?q=chicago&units=metric&appid=你的真实APIKey

调试时可以把catch块的print("failed")改成print("解析失败:\(error)"),就能直接看到具体的错误原因,进一步提升排查效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:36:03