iOS集成WeatherKit SDK调用天气接口返回401网络错误
WeatherKit调用返回401 invalidJWTResponse错误排查
问题背景
- 测试WWDC22推出的WeatherKit能力时,从苹果官方渠道下载的示例项目可正常拉取天气数据,自行创建的Demo项目调用天气接口失败
- 测试用核心请求代码如下:
func fetchWeather() async { let service = WeatherService.shared let location: CLLocation = CLLocation(latitude: 22.7196, longitude: 75.8577) let weatherData = try? await service.weather(for: location, including: .current) print(weatherData) }
错误表现
运行代码后控制台输出错误,核心异常为请求https://weather-data.apple.com/v2/token接口时返回401状态码,错误类型为invalidJWTResponse,最终返回的weatherData结果为nil。错误日志关键片段如下:
2022-06-22 17:31:48.470130+0530 WeatherAPIDemo[25490:231389] [Database] Attempting to invalidate an assertion that is no longer valid 2022-06-22 17:31:49.208346+0530 WeatherAPIDemo[25490:231387] [WeatherService] Encountered an error when fetching weather data subset; location= +/- 0.00m (speed -1.00 mps / course -1.00) @ 6/22/22, 5:31:48 PM India Standard Time, error=invalidJWTResponse(Optional( { URL: https://weather-data.apple.com/v2/token } { Status Code: 401, Headers { Connection = (close); "Content-Length" = (0); // 其余响应头字段省略 } })) nil
注:日志开头的
[Database] Attempting to invalidate an assertion that is no longer valid是系统打印的无关日志,不影响WeatherKit功能,无需额外处理。
排查解决步骤
- 检查开发者后台服务配置
登录苹果开发者账号,找到当前Demo项目对应的App ID,确认已勾选WeatherKit服务权限,不要复用官方示例项目的App ID配置。权限修改完成后更新对应描述文件,避免Xcode拉取到旧的缓存签名配置。 - 检查Xcode项目能力配置
打开项目的Signing & Capabilities页,点击添加能力按钮,搜索并添加WeatherKit能力,确认能力列表中存在WeatherKit条目,和官方示例项目的本地配置保持一致。 - 清理缓存后重新验证
- 执行Xcode菜单
Product > Clean Build Folder清理构建缓存 - 删除模拟器/真机上已经安装的旧版本Demo安装包
- 完全退出Xcode后重新打开项目,重新签名构建运行
注意:开发者后台修改服务配置后,苹果服务端的配置同步通常有1-10分钟延迟,刚开通权限后不要立刻测试,等待几分钟再发起请求
- 执行Xcode菜单
- 校验基础配置一致性
确认项目的Bundle ID和开发者后台配置的App ID完全一致,无拼写错误。如果后续改用REST接口自定义请求WeatherKit,需要自行生成符合规范的JWT签名,使用系统WeatherService类时不需要手动处理Token逻辑,只要签名和权限配置正确即可正常请求。
内容的提问来源于stack exchange,提问作者Kudos
相关产品推荐
相关产品推荐

