🌤 SwiftWeather

GitHub code size in bytes Contributors GitHub build results

一个支持多种天气 API 的 Swift 天气包。

📡 支持的 API

📦 安装

将以下包添加到您的 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 与哪个平台关联)。

一旦您确定了感兴趣的设备,您可以使用它以多种方式检索天气报告

用例 #1:检索最新的报告

let report = try await device.latestReport

用例 #2:检索 N 个最新的报告

for try await report in device.latestReports(count: N) {
    
}

报告以倒序时间顺序返回(即从最新的开始)。 它们之间的时间间隔取决于天气平台和/或设备,并且如果例如有问题的天气设备遇到互联网连接问题,则也可能是不规则的。

注意:目前 Wunderground 不支持。

用例 #3:检索过去日期的报告

for try await report in device.reports(count: 1, upToAndIncluding: date) {
    
}

注意:目前 Wunderground 不支持。

用例 #4:检索截至给定日期的 N 个报告

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 BedrickWade Tregaskis