Highlight
Apple 创建了全新的 Apple Weather Service,使用高分辨率气象模型和机器学习预测算法提供全球超本地化天气预报。WeatherKit 把这套数据通过开发者 API 暴露出来。
核心内容
天气数据很容易被当成一个小功能:显示温度,画一个图标,提醒用户带伞。Session 开头给出的场景更具体:出门前看 Apple Watch、农业里预测降雨和霜冻、冬季出行前确认风暴风险。它们都依赖同一件事:给定一个地点,拿到足够准确、足够近的天气信息。(00:17)
WeatherKit 的变化在于,开发者可以直接使用 Apple Weather Service。这个服务使用高分辨率气象模型、机器学习和预测算法,提供全球范围的超本地化天气预报。位置数据只用于提供预报,不关联个人身份信息,也不会分享或出售。(00:55)
它提供两条入口。Apple 平台上的 App 可以用 Swift 框架和 Swift Concurrency 获取天气;其他平台可以走 REST API,从 weatherkit.apple.com 拉取同样的数据。REST API 需要开发者在服务端生成签名 JSON Web Token(JWT),再把 token 放进请求的 Authorization header。(04:14、07:48、09:08)
详细内容
六类天气数据
(02:21)WeatherKit 暴露的不是单一“天气对象”。它把数据拆成多个数据集,便于按场景请求。
- 当前天气:请求地点此刻的 UV 指数、温度、风等状态。
- 分钟级预报:未来一小时的逐分钟降水情况,覆盖地区可用时返回。
- 小时级预报:从当前小时开始,最多提供 240 小时数据;每小时包含湿度、能见度、气压、露点等信息。
- 日级预报:未来 10 天的集合;每天包含最高温、最低温、日出和日落等信息。
- 天气警报:请求地点的恶劣天气警告。
- 历史天气:通过给小时级和日级请求指定开始和结束日期,查看过去保存的天气预报。
这个拆分影响 API 使用方式。航班行程页只需要目的地的小时级预报,就不必把所有数据集都拉下来;安全提醒页只关心天气警报,可以只请求 weatherAlerts。
用 Swift 请求当前位置的天气
(04:27)Swift 框架的入口是 WeatherService。示例先导入 WeatherKit 和 CoreLocation,再用经纬度创建 CLLocation,最后通过 async/await 请求天气。
// Request the weather
import WeatherKit
import CoreLocation
let weatherService = WeatherService()
let syracuse = CLLocation(latitude: 43, longitude: -76)
let weather = try! await weatherService.weather(for: syracuse)
let temperature = weather.currentWeather.temperature
let uvIndex = weather.currentWeather.uvIndex
关键点:
import WeatherKit引入天气框架,import CoreLocation提供位置类型。WeatherService()创建访问 Apple Weather Service 的入口对象。CLLocation(latitude:longitude:)描述要查询的地点;示例使用 Syracuse, New York 的坐标。await weatherService.weather(for: syracuse)发起异步请求,返回该地点的天气对象。weather.currentWeather.temperature读取当前温度。weather.currentWeather.uvIndex读取当前 UV 指数。
Session 里的航班规划示例也是同一思路。App 已有机场结构体,里面保存目的地机场的纬度和经度;点击航班后,请求目的地的小时级预报,并在自定义视图里展示天气状况、降水、风和温度。(05:14、06:04)
在真正运行前,还要完成能力配置:先在 Developer Portal 注册 App ID,启用 WeatherKit;再回到 Xcode,把 WeatherKit capability 加到项目里。(05:43)
在界面里显示归因信息
(06:41)WeatherKit 的数据源需要归因。示例里,开发者从 attribution.legalPageURL 取得法律归因页面链接;再取得 Apple Weather mark 的图片 URL,并根据 SwiftUI 的 colorScheme 选择浅色或深色版本。
这个要求适用于原生 App 和 Web App。发布到 App Store 或上线 Web 服务前,需要展示归因链接和归因 logo;如果显示天气警报,还需要链接到响应里提供的事件页面。(10:38)
用 REST API 请求天气警报
(07:56)REST API 可以在任意平台使用。示例请求天气警报,先从自己的 token 服务拿到认证 token,再访问 WeatherKit endpoint。
/* Request a token */
const tokenResponse = await fetch('https://example.com/token');
const token = await tokenResponse.text();
/* Get my weather object */
const url = "https://weatherkit.apple.com/1/weather/en-US/41.029/-74.642?dataSets=weatherAlerts&country=US"
const weatherResponse = await fetch(url, {
headers: {
"Authorization": token
}
});
const weather = await weatherResponse.json();
/* Check for active weather alerts */
const alerts = weather.weatherAlerts;
const detailsUrl = weather.weatherAlerts.detailsUrl;
关键点:
fetch('https://example.com/token')从开发者自己的服务请求 token。Session 后面说明,这个服务在服务器端用私钥生成签名 JWT。tokenResponse.text()把响应内容读成 token 字符串。- URL 路径里的
en-US指定本地化语言。 41.029/-74.642是请求地点的纬度和经度。dataSets=weatherAlerts只请求天气警报数据集;参数名是复数,因此可以用逗号一次请求多个数据集。country=US在请求weatherAlerts数据集时需要提供。Authorizationheader 携带 token,WeatherKit 用它验证请求授权。weatherResponse.json()把返回值转换为 JSON。weather.weatherAlerts读取天气警报数据。weather.weatherAlerts.detailsUrl读取警报详情页链接,展示天气警报时需要把它提供给用户。
REST 认证放在服务端
(09:08)REST API 认证需要三步准备:在 Developer Portal 创建启用 WeatherKit 的 authentication key;创建关联的 services ID;在服务器部署 token service,用私钥创建签名 JWT。
JWT 由 header、payload 和签名组成。Payload 包含 WeatherKit REST API 和应用相关信息,例如 issuer、subject、expiration time。客户端不直接保存私钥,只向自己的 token service 请求 token,再把 token 加到 WeatherKit 请求里。(09:51、10:17)
核心启发
-
做什么:给行程 App 加“目的地天气”栏。
为什么值得做:Session 的航班规划示例已经给出路径:每个机场保存经纬度,请求小时级预报,再展示条件、降水、风和温度。
怎么开始:在 App ID 和 Xcode 中启用 WeatherKit,用WeatherService().weather(for:)请求机场CLLocation。 -
做什么:做一个“出门前一小时降水提醒”。
为什么值得做:分钟级预报提供未来一小时逐分钟降水情况,适合回答“现在要不要带伞”。
怎么开始:按用户当前位置请求 WeatherKit 的分钟级预报数据集,只在数据可用地区显示逐分钟降水视图。 -
做什么:给户外活动页面加恶劣天气警报。
为什么值得做:weatherAlerts数据集包含请求地点的恶劣天气警告,Session 明确要求展示警报时链接到响应里的事件页面。
怎么开始:Web 或后端服务用 REST API 请求dataSets=weatherAlerts&country=US,读取weather.weatherAlerts和detailsUrl。 -
做什么:给农业或园艺记录加历史天气趋势。
为什么值得做:WeatherKit 可以通过给小时级和日级请求指定开始、结束日期访问历史天气,用来查看天气趋势。
怎么开始:围绕某块地的经纬度保存日期范围,用小时级或日级历史请求生成温度、降水、风等变化图。 -
做什么:做一个跨平台天气组件。
为什么值得做:Swift 框架适合 Apple 平台,REST API 可以覆盖 Web 和其他平台,二者来自同一 Apple Weather Service。
怎么开始:Apple 平台用 WeatherKit 框架;Web 端通过自己的 token service 获取 JWT,再调用https://weatherkit.apple.com/1/weather/...。
关联 Session
- Meet Apple Maps Server APIs — 同样使用服务端 token 和 Apple 地图相关服务,适合和 WeatherKit REST API 的认证流程一起看。
- What’s new in MapKit — 展示地图、3D 城市、覆盖物和 Look Around;天气图层或地点详情可以接在这些地图能力之上。
- Q&A: Maps technologies — 面向 MapKit、MapKit JS、Maps Server API 和室内地图的问答,适合补充位置类 App 的实现细节。
评论
GitHub Issues · utterances