大多数浏览器和
Developer App 均支持流媒体播放。
-
为当日天气提供更多参考
充分发挥 WeatherKit 的强大功能来获取详细的天气预报数据,例如不同类型的降水量、不同海拔的云层覆盖情况,或者最大风速。探索如何按照一天的不同时段提供天气概况,并突出显示气温或降水方面即将出现的重要变化。了解如何通过我们的 Historical Comparisons 数据集将当前天气与过往天气进行比较,并深入了解全球任何地方的历史天气数据。我们还将探索如何使用 Swift 和 REST API 更快地实现所有这些功能。
章节
- 0:00 - Introduction
- 1:10 - Richer forecast details
- 10:03 - Highlight weather changes
- 14:10 - Faster data transfer
资源
- Forum: Maps & Location
- Request authentication for WeatherKit REST API
- WeatherKit
- WeatherKit REST API
相关视频
WWDC22
-
下载
大家好 我是 Sidy 在“天气”团队担任软件工程师 今天我要向大家介绍 今年 WeatherKit 即将推出的一些精彩更新
WeatherKit 由 Apple“天气”服务提供支持 它的 API 简单易用 注重隐私保护 让你能够提供准确的 超本地化天气数据 而且 WeatherKit 不仅仅是 我们的“天气”App 的核心 它的 Swift 和 REST API 也被 Carrot Weather、 (Not Boring) Weather 和 DuckDuckGo 等开发者 用来向用户提供重要天气信息 今年 我们将会推出一些很棒的增强功能 让 WeatherKit 变得比以往更出色! 首先我们将在预报中加入更丰富的 详细信息 比如不同海拔高度的 降水量和云量 然后 我们将推出结合背景信息 突出显示即将发生的天气变化的功能 最后 我们还将支持二进制格式 以加快数据传输速度 今天 我要逐一详细介绍这些功能 包括如何在你的 App 中 实现这些功能 首先将介绍更丰富的预报详细信息
WeatherKit 由多个 很棒的 API 组成 Availability 可指明 哪些数据集适用于 给定的位置 Attribution 能让你了解 归因数据源 Active Alert 可以提供 有关持续恶劣天气的详细信息 但其中最重要的 是 Weather API 它可以提供 一些至关重要的天气数据 比如当前天气状况 每分钟降水量 10 天内的小时预报 和每日预报 以及天气提醒等
今年 我们将精益求精 为当前天气、小时预报 和每日预报添加更多详细信息
当前天气状况可提供 有关当下天气的详细信息 比如气温、风速或紫外线指数 现在 你可以添加更精细的详细信息 比如不同海拔高度的云量 小时预报中也将推出这些增强功能 现在可以为小时云量预报 补充详细信息 比如 随海拔高度变化而变化的云量情况等 或者 可以提供小时降雨量 就像 Apple“天气”App 一样
每日预报查询功能 将迎来这批增强功能中 力度最大的优化 现在 你可以轻松为 App 添加 粒度更精细的每日预报 比如湿度的高低 甚至还可以按一天中的不同时间段 拆分预报 将日间天气 与夜间天气分开
接下来 我将使用 Swift 中的 一个示例展示如何 在 App 中访问小时降水量数据
首先 我要在 CLLocation 上 快速添加一个扩展 这样便于在这个示例中 以及接下来的所有 Swift 示例中 将纽约作为我们的参考位置
降水数据很容易获取 首先 我需要传入 要获取的数据所对应的位置
然后是我想要的数据粒度 在这个示例中 我想要的是每小时 所以我指定了 .hourly 查询
最后 只需访问小时预报的 precipitationAmount 属性 和 WeatherKit 的所有其他属性一样 这些属性可以通过 REST API 提供 我要展示一下如何在 REST 中 实现上一个示例
WeatherKit API 托管在 weatherkit.apple.com 上 因此用它 作为 RESTful URL 路径进行传递 接下来 追加 表示 API 版本的参数 这是这个版本的第 2 版 在这个示例中 我要提供 weather API 然后添加一个参数 用来表示我想要获取的数据 所对应的语言区 这里我使用 en-US 来表示美式英语 但是我可以选择 iOS 支持的任何语言区 如果我传入一个不受支持的语言区 响应就会默认设置为 en-US 还要指定我需要的相关数据 所对应的位置坐标 在这个 Swift 示例中 位置坐标位于纽约市 最后 指定要获取的数据集 在这个示例中是小时预报 我还可以选择指定需要预报的 小时范围 在这个示例中 为简单起见 我把它限制为当前的一小时
但我也可以请求 最多 240 小时的天气预报
请注意 如果没有指定小时范围 WeatherKit 将默认设置为 从当前小时开始的 24 小时 还要注意的是 我使用了 相对小时查询参数 通过这类参数 Apple“天气”服务可以 根据提供的时区计算出确切的 开始时间和结束时间 提醒一下 为了访问 Apple“天气”服务 需要生成一个身份验证 Bearer 接下来 我们看看结果
我对这个 URL 发出了 GET 请求 它返回了一个 托管在 forecastHourly 键下的对象
它包含一个小时预报数组 每个小时预报 都具有几个属性 其中一个属性 名为 precipitationAmount Swift 程序中也有一个同样属性
查看天气预报时 我们会积极寻找变化的模式 因为天气的重大变化 可能会影响计划成败
提前了解这些变化 并将这些信息与背景信息相结合 至关重要 为此 我们将在 Weather API 中 添加两种全新的查询
接下来 我要介绍 Changes 和 Historical Comparisons 首先来看 Changes Changes 查询可提供 温度和降水量 即将发生的变化 包括发生变化的时间 即将出现的 符合条件的重大波动 例如升高或降低
“天气”App 现在使用这项查询 来向用户突出显示 即将发生的气温变化
现在 你也可以在 App 中 使用 Changes 查询 我来演示一下具体方法 继续使用纽约市作为我所在的位置 我通过使用 .changes 查询 来获取天气变化 这样会返回一个变化列表 我可以从中筛选出除明天之外 将会发生的所有变化 请注意 我扩展了 Date 结构 让它具有 isTomorrow 属性 这样是为了方便表达我的用例 下一步是将结果映射到一个数组 这个数组仅包含低温变化 最后 如果发生任何变化 并且这些变化包含了气温下降 我就会向用户显示相应的信息
要在 REST 中完成这一操作 我只需指定 weatherChanges 数据集 请注意 这款产品始终会返回信息 即使只是告诉你 接下来不会发生重大天气变化 我们来通过一个示例输出 明确我们的理解 我刚才发出了 GET 请求 来获取天气变化 然后得到了一些返回数据 天气变化对象位于 weatherChanges 键后面 不出所料
它是变化列表的包装器对象 藏在 changes 属性下
对于预报中的变化 每个变化都有一个开始日期 和一个结束日期 最后是预计会发生的变化的类型 这里的第一个变化意味着 我们预计在指定的时间范围内 最高气温将会升高
请注意 条件变化也可以是下降 或者 如果预计不会发生任何变化 则这个栏位中会填入表示稳定的标记
理解天气变化时 最好与背景信息相结合 因此 我们还将推出 Historical Comparisons
Historical Comparisons 基于过去 50 多年来收集的数据 让你能够将今天的天气 与历史平均数据进行比较 并按照与平均值的偏差显著性 对结果进行排序
你可以看到“天气”App 中 现在使用的 历史数据比较查询 其中显示了今日最高气温 与历史平均数据的偏差 “天气”API 的这项查询功能 使用起来也非常方便 为了展示具体操作方法 我们来看看另一个有趣的代码片段 在 Swift 中 仅请求天气数据 包括 .historicalComparisons 查询 请记住 这个列表 是按照与平均值的偏差显著性 进行排序的
现在 我们确定了显著的趋势偏差 接下来可以将它打印出来并告知客户
如果你使用的是 REST API 只需包含 Historical Comparisons 数据集 与 Swift 中一样 你将获得一个 比较列表 按照与平均值的 偏差显著性进行排序
我们来看看这个请求的输出
结果对象存储在 historicalComparisons 键下 并且包含一个比较列表
每个比较都包含了 用于计算趋势的条件
这个条件的当前值
基准值 你应该可以通过这个值 了解关于趋势变化方向的背景信息
还列出了偏差的类型 这一项与偏差的幅值对应 在这个示例中 偏差处于正常范围内 这个栏位中可能出现的其他值包括 higher、 much higher、lower 和 much lower
baselineType 表示 用于确立基准值的 统计方法 在这个示例中 我们使用平均值 而不是中位数之类 如果我们更新统计推理方法 则这个栏位的值可能会发生变化
最后 你可以获得 我们为这个条件的计算平均值 确立基准的日期
可以看到 Apple“天气”在 Weather API 中推出了多项增强功能 让你能够为当前的预报 添加更丰富的信息 进而能够 在你的 App 中 适时为用户提供 各种不同的预测数据切片 现在 我想谈谈 如何结合全球历史背景信息 来理解可通过 WeatherKit 获得的丰富的天气数据
结合气候背景信息来理解天气数据 对于任何出色的天气体验 都已变得不可或缺 除了提升对气候的认知之外 大致了解某个位置的长期天气模式 甚至可能有助于规划较远未来的 活动或假期
为了简化这一过程 我们将添加 全新的 Statistics API 借助这个精心设计的 API 你可以拓宽和收窄 天气相关历史统计数据的范围 Statistics API 提供了两种新查询 Historical Averages 和 Daily Summaries 通过 Historical Averages 可以 获取气温和降水量的长期平均值 这个平均值根据自 1970 年 1 月 1 日 以来记录的数据计算得出 粒度可以设置为小时、每日和每月 例如 “天气”App 利用这个 API 来显示每月平均降水量 因此用户在规划下一次美妙假期时 可以方便地避开雨季 接下来 我要展示 如何让你的 App 也能 获取统计数据
在这里 我实现了一个 获取每月统计数据的 Swift 示例 只需在 WeatherService 上调用 monthlyStatistics 函数 注明开始月份和结束月份 按照公历 1 表示 1 月 12 表示 12 月
还有感兴趣的查询类型 在这里 是降水量
现在 我得到了结果 将它们分组到以月份为键的词典中
使用 REST API 时 调用 Statistics/Monthly API 传入降水量作为数据集 然后指定开始月份和结束月份 这样会返回月平均值列表
接下来 我们看看输出
可以看到我们的 每月天气统计数据对象 它包含了计算平均值的基准开始日期 每月平均值列表 位于 months 属性下
由于我们仅获取了降水量 因此我们只有这个对象 降水量对象包含了 源自 Apple“天气”服务的 每月平均数据 最后 还会从 1 到 12 列出 相关月份的索引
通过 Statistics API 你还可以获取 2021 年 8 月 1 日之后 任一过往日期的天气摘要
摘要中包含了高温和低温 以及降水量和降雪量数据
“天气”App 使用这项功能 来显示过去三十天的 累计降水量 以便更好地 结合背景信息理解当日数据
我们来看看 如何 在 Swift 中获取这些数据
在这里 我想在 Swift 中获取 过去 30 天的天气摘要数据 重点关注降水量数据
我需要指定日期间隔 从 30 天前开始到现在结束 请注意 thirtyDaysAgo 是我在 Date 上定义的 一个自定扩展
我会将降水量作为查询包含进来 现在 我获取了数据 接下来我要使用 这些数据为用户提供相关信息 请注意 在这个示例中 我同样只请求了 降水量 如果使用 REST API 我会调用 summary daily 路径 然后 像在 Swift 示例中一样 筛选降水量数据集 最后 指定我希望接收数据的 开始日期和结束日期 结果是一个每日摘要数组 其中通常包含气温和降水量数据 请注意 只有降水量具有非零值 因为这就是我们的请求
可以看到 Apple“天气”服务 一直在投入大量资源 构建这些模型 让我们能够 结合更丰富的历史背景信息 来理解当日天气
在这个版本中 我们将向大家提供 这些模型计算出的数据 我们非常期待大家能够将这些 丰富的新数据整合到自己的 App 中
尽管如此 获取如此多的历史天气数据 可能需要付出高昂的成本 因此 我们让大家能够轻松通过 我们最强大的数据密集型 API 来获取天气数据 在这个版本中 我们将引入 对 FlatBuffers 的支持 从而能比以往更快地 通过 WeatherKit 获取天气数据 FlatBuffers 与同等压缩 JSON 相比 可以将有效负载的大小 缩小最多 25% 与 JSON 相比 还可以 将解析时间缩短最多 90%
如果你使用的是 Swift API 则可以免费获取这项优化 如果使用的是 REST API 那么这是一项可选功能 你可以 通过指定 accept 标头来激活它
所以不要担心 你可以获取比以往更多的数据 同时最大限度缩小有效负载大小
以上就是对 WeatherKit 的介绍 接下来 我们快速回顾一下 大家在这个讲座中了解的内容 除了已经提供的所有出色功能之外 我们还将为当前预报、小时预报 和每日预报添加 粒度更精细的详细信息 比如不同海拔高度的云量 更丰富的降水量数据、 湿度数据和能见度数据 我们将推出 Changes 和 Historical Comparisons 查询 全新的 Statistics API 并引入对 FlatBuffers 的支持
我们期待看到大家 利用这些增强功能进行创新 如果你已经使用过 WeatherKit 不妨思考一下如何利用这个版本 提供的更多数据点 来丰富你的预报数据 你也可以让用户 及时了解重大天气变化 此外 丰富的历史数据触手可及 你可以利用这些数据 让用户 从更广阔的视角了解当日天气 如果你使用的是 REST API 请考虑利用新的 FlatBuffer 响应 如果你从未使用过 WeatherKit 请考虑观看 WWDC22 中的 “WeatherKit 简介” 然后赶快尝试一下
感谢大家的观看
-
-
2:40 - Fetch Precipitation Amount
import CoreLocation import Foundation import WeatherKit extension CLLocation { static var newYork: CLLocation { CLLocation(latitude: 50.710, longitude: -74.006) } } let hourlyPrecipitation = try await WeatherService() .weather(for: .newYork, including: .hourly) .map(\.precipitationAmount)
-
3:25 - Fetch Precipitation Amount (REST)
https://weatherkit.apple.com/api/v2/weather/en-US/40.710/-74.006?dataSets=forecastHourly&relativeHourlyStart=0&relativeHourlyEnd=1&hourlyRelativeTo=now&timezone=America/New_York
-
6:05 - Weather Changes
import CoreLocation import Foundation import WeatherKit extension Date { var isTomorrow: Bool { return Calendar.current.isDateInTomorrow(self) } } let changes = try await WeatherService() .weather(for: .newYork, including: .changes) let lowTemperatureChanges = changes? .filter(\.date.isTomorrow) .map(\.lowTemperature) if let lowTemperatureChanges, lowTemperatureChanges.contains(.decrease) { // Lower temperatures expected tomorrow }
-
6:43 - Weather Changes (REST)
https://weatherkit.apple.com/api/v2/weather/en-US/40.710/-74.006?dataSets=weatherChanges
-
8:17 - Historical Comparisons
import CoreLocation import Foundation import WeatherKit let mostSignificant = try await WeatherService() .weather(for: .newYork, including: .historicalComparisons)? .first switch mostSignificant { case .highTemperature(let trend), .lowTemperature(let trend): // Display temperature trend break case .some, .none: break }
-
8:36 - Historical Comparisons (REST)
https://weatherkit.apple.com/api/v2/weather/en-US/40.710/-74.006?dataSets=historicalComparisons
-
11:11 - Monthly Statistics
import CoreLocation import Foundation import WeatherKit let averagePrecipitation = try await WeatherService() .monthlyStatistics( for: .newYork, startMonth: 1, endMonth: 12, including: .precipitation ) let averagePrecipitationAmountsPerMonth = Dictionary( grouping: averagePrecipitation, by: \.month )
-
11:41 - Monthly Statistics (REST)
https://weatherkit.apple.com/api/v2/statistics/monthly/40.710/-74.006?dataSets=precipitation&start=1&end=12
-
12:52 - Daily Summary
import CoreLocation import Foundation import WeatherKit extension Date { static var thirtyDaysAgo: Date { return Calendar.current.date(byAdding: .day, value: -30, to: .now)! } } let pastThirtyDaysSummary = try await WeatherService() .dailySummary( for: .newYork, forDaysIn: DateInterval(start: .thirtyDaysAgo, end: .now), including: .precipitation ) .first if let pastThirtyDaysSummary { // We have a daily weather summary for each day in the past 30 days }
-
13:22 - Daily Summary (REST)
https://weatherkit.apple.com/api/v2/summary/daily/40.710/-74.006?dataSets=precipitation&start=2024-05-12&end=2024-06-10
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。