一个支持多种天气 API 的 Swift 天气包。
将以下包添加到您的 Package.swift 文件中
.package(url: "https://github.com/wadetregaskis/SwiftWeather", .branch("master")),
SwiftWeather 为天气平台提供了一个通用框架,因此您可以编写主要通用的代码来支持任何平台。 但是,您必须明确选择要使用的天气平台,并首先初始化它们。 例如
guard let platform = AmbientWeather(applicationKey: yourApplicationKey, apiKey: yourAPIKey)) else { return }
或者
guard let platform = Wunderground(apiKey: yourAPIKey)) else { return }
一旦您拥有平台实例,您就可以从中找到天气设备(气象站)。 此 API 因平台而异,因为它们的操作方式截然不同。 例如,对于 AmbientWeather
let devices = try await platform.devices
或者对于 Wunderground
let devices = try await platform.devices(near: someCLLocation)
请注意,在实际代码中,您可能需要处理抛出的任何异常(例如,提供的密钥无效、网络连接问题等)。
devices
是设备 ID 到设备实例的映射。 您可以持久化天气设备 ID(例如,到用户偏好设置中),以便稍后调用相同的设备(但请注意,设备 ID 仅在每个天气平台类型中是唯一的 - 请务必同时记录 ID 与哪个平台关联)。
一旦您确定了感兴趣的设备,您可以使用它以多种方式检索天气报告
let report = try await device.latestReport
for try await report in device.latestReports(count: N) {
…
}
报告以倒序时间顺序返回(即从最新的开始)。 它们之间的时间间隔取决于天气平台和/或设备,并且如果例如有问题的天气设备遇到互联网连接问题,则也可能是不规则的。
注意:目前 Wunderground 不支持。
for try await report in device.reports(count: 1, upToAndIncluding: date) {
…
}
注意:目前 Wunderground 不支持。
for try await report in device.reports(count: N, upToAndIncluding: date) {
…
}
注意:目前 Wunderground 不支持。
每个报告的具体内容取决于天气平台和正在使用的天气设备。 来自 AmbientWeather 的示例
MAC Address: A1:B2:C3:D4:E5:F6
Info:
Name: My Station
Location: My Roof
GeoLocation:
Location: Somewhere
Address: Some Address
Elevation: Some Elevation
Coordiates:
Type: Point
Latitude: Some Latitutde
Longitude: Some Longitude
Outdoor Battery Status: 0
Date: 1590605700000 ms
Relative Pressure: 29.62 inHg
Absolute Pressure: 29.58 inHg
Hourly Rain: 0.0 in/hr
Rain Today: 0.0 in
Monthly Rain: 1.54 in
Yearly Rain: 13.85 in
Last Time it Rained: 2020-05-23T08:32:00.000Z
Indoor Temperature: 90.7 ºF
Outdoor Temperature: 77.2 ºF
Outdoor Dew Point: 63.61 ºF
Outdoor Temperature Feels Like: 77.58 ºF
Wind Direction: 116 º
Wind Speed: 6.5 MPH
Wind Gust: 15.0 MPH
Max Wind Gust Today: 17.4 MPH
Wind Gust Direction: 190 º
2 Minute Wind Speed Avg: 5.2 MPH
10 Minute Wind Speed Avg: 5.2 MPH
10 Minute Wind Direction Avg: 133 º
UV Index: 5
Solar Radiation: 358.0 W/m^2
Outdoor Humidity: 63 %
Indoor Humidity: 30 %
每个报告至少包含生成报告的日期和时间,以及该时间点的所有可用测量值。
public protocol WeatherReport {
var date: Date { get }
var sensors: [WeatherSensorID: WeatherSensor] { get }
}
…其中 WeatherSensor 定义为
open class WeatherSensor {
public let type: WeatherSensorType
public let ID: WeatherSensorID
public let name: String
public let description: String?
public let measurement: Any
}
测量值的类型各不相同 - Foundation 的 Measurement 类在适用时使用,但有些是更原始的类型(例如,上次下雨的 Date)。
查看软件包 - 并针对您感兴趣的真实气象站对此库进行实验 - 以获取有关可在您的应用程序中使用的传感器的详细信息。
根据 MIT 许可证发布。
最初由 Mike Manzo 创建。 其他贡献者包括 Steven Bedrick 和 Wade Tregaskis。