无法在 SwiftUI 应用程序中使用 WeatherKit 获取历史天气数据

问题描述 投票:0回答:1

我正在尝试在 SwiftUI 应用程序中使用 WeatherKit 来获取一系列日期的历史天气数据。这篇文章中的信息: 找不到 WeatherKit 历史数据且归属问题

让我相信正确的调用是:

let forecast = try await weatherService.weather(for: location, including: .daily(startDate: startDate, endDate: endDate))

但是,当我在测试应用程序中尝试此操作时,它失败并出现以下错误:

responseFailed( { URL: https://weather-data.apple.com/v3/weather/en-US/37.770/-122.410?timezone=America/Los_Angeles&dataSets=forecastDaily&dailyStart=2023-10-02T16:45:34Z&dailyEnd =2023-10-17T16:45:34Z&country=US&deviceLanguages=en-US&clientMetadata=CgJVUxoFZW4tVVNKAFABWAxgAIABA5gBALoBAhAB4gEICgseHR8hICLyAQJVUw } { 状态代码:404,标头 { “访问控制允许来源”=( “*” ); “缓存控制”=( “max-age=0,无缓存,无存储” ); 连接 = ( “活着” ); “内容长度”=( 0 ); “内容安全策略”=( “默认-src'自我';” ); 日期 = ( “2023 年 10 月 22 日星期日 16:45:34 GMT” ); 过期=( “2023 年 10 月 22 日星期日 16:45:34 GMT” ); 杂注 = ( “无缓存” ); 服务器 = ( 苹果 ); “严格传输安全” = ( “最大年龄=31536000;包括子域名” ); “X-Apple-起源”=( “8961098f-b238-3714-ba44-5b569c861456” ); “X 缓存” = ( “来自 a23-204-105-90.deploy.akamaitechnologies.com 的 TCP_MISS (AkamaiGHost/11.3.0-51620215) (-)” ); “X-内容类型-选项”=( 不闻 ); “X 框架选项”= ( 同源 ); “X-请求-ID”=( “CB4405F3-9FF0-4E60-81A3-D9657E9BA100” ); “X-XSS-保护”=( “1;模式=块” ); } },可选(“”))

这是我调用 WeatherKit 的代码:

import SwiftUI
import WeatherKit
import CoreLocation

struct ContentView: View {
    let location = CLLocation(latitude: 37.77, longitude: -122.41)
    let startDate = daysAgo(days: -20)
    let endDate = daysAgo(days: -5)
    let weatherService = WeatherService.shared
    
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .padding()
        .task {
            do {
                //let weather = try await weatherService.weather(for: location)
                let weather = try await weatherService.weather(for: location, including: .daily(startDate: startDate, endDate: endDate))
                print(weather)
            } catch {
                print(error)
            }
        }
    }
}

func daysAgo(days: Int) -> Date {
    var dayComponent = DateComponents()
    dayComponent.day = days
    let calendar = Calendar.current
    let prevDay = calendar.date(byAdding: dayComponent, to: Date())!
    return prevDay
}

#Preview {
    ContentView()
}

请注意,我已在 info.plist 和 apple.com 上的开发者帐户中正确完成了所有功能配置。如果我只是使用以下代码询问当前天气,上面的代码可以正常工作并打印当前天气:

let weather = try await weatherService.weather(for: location)

我哪里错了?我应该使用 WeatherKit 来获取历史数据吗?还有其他方法吗?我还应该明确指出,我的目标是获取给定位置每日最低和最高气温的日期列表。因此,对于这个硬编码的示例,我期望获取编码位置从 20 天前到 5 天前的每日高温和低温。

更新:我在 WeatherKit 文档中注意到它说“每个请求最多返回 10 天”。我认为这仅适用于未来的预测,而不适用于历史数据,所以我忽略了它。好吧,当我尝试小于 10 天的日期范围时,我确实得到了一些数据,但不是我所期望的。对于过去 8 天的日期范围,我得到了下面的数据,其中仅包含日期范围内第一天和最后一天的信息,没有中间日期的数据。这是应该如何工作的吗?这个不成立。如何获取日期范围内所有天的最低和最高气温?

天数=8,日期范围=2023-07-15 07:00:00 +0000 至 2023-07-22 07:00:00 +0000,第一个条件=晴间多云,第一个高=22.64 °C,第一个低=12.13 °C,最后天气=晴间多云,最后高点=22.32 °C,最后低点=12.1 °C

swiftui weather temperature historical-db weatherkit
1个回答
0
投票

事实上,Apple 对历史天气有 10 天的限制。我的解决方法是将工作分成 10 天的部分,然后循环遍历它们以获得所需的天数。这可能会导致相当多的样板代码,但它对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.