WWDC Quick Look 💓 By SwiftGGTeam
Meet WeatherKit

Meet WeatherKit

元の動画を見る

ハイライト

Apple は高解像度の気象モデルと機械学習の予測アルゴリズムを使った新しい Apple Weather Service を構築し、世界中で超ローカルな天気予報を提供します。WeatherKit はそのデータを開発者向け API として公開します。


主要内容

天気データは小さな機能に見えがちです。温度を表示し、アイコンを描き、傘を持っていくよう促す。Session の冒頭はもっと具体的なシナリオから始まります。外出前の Apple Watch 確認、農業での降雨と霜の予測、冬の移動前の暴風リスクの確認。いずれも同じことに依存します。場所が与えられたとき、十分に正確で十分に近い天気情報を得ることです。(00:17

WeatherKit により、開発者は Apple Weather Service を直接使えます。このサービスは高解像度の気象モデル、機械学習、予測アルゴリズムで、世界中の超ローカルな天気予報を提供します。位置データは予報の提供にのみ使われ、個人を特定する情報とは紐づけられず、共有や販売もされません。(00:55

入口は2つあります。Apple プラットフォームの App は Swift フレームワークと Swift Concurrency で天気を取得できます。他のプラットフォームは REST API で weatherkit.apple.com から同じデータを取得します。REST API では、開発者がサーバーで署名付き JSON Web Token(JWT)を生成し、リクエストの Authorization ヘッダーに入れる必要があります。(04:1407:4809:08


詳細

6種類の天気データ

02:21)WeatherKit が公開するのは単一の「天気オブジェクト」ではありません。シナリオに応じてリクエストできるよう、データを複数のデータセットに分割しています。

  • 現在の天気:リクエスト地点の現時点の UV 指数、温度、風などの状態。
  • 分単位予報:今後1時間の分単位の降水状況。対応地域でのみ返却。
  • 時間単位予報:現在の時刻から最大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:1406:04

実際に動かす前に、ケイパビリティの設定が必要です。Developer Portal で App ID を登録し WeatherKit を有効化。Xcode で WeatherKit capability をプロジェクトに追加します。(05:43

画面に帰属表示を載せる

06:41)WeatherKit のデータには帰属表示が必要です。例では attribution.legalPageURL から法的帰属ページのリンクを取得し、Apple Weather マークの画像 URL を取得して、SwiftUI の colorScheme に応じてライト版かダーク版を選択します。

これはネイティブ App と Web App の両方に適用されます。App Store 公開や Web サービス公開前に、帰属リンクとロゴを表示する必要があります。天気警報を表示する場合は、レスポンスに含まれるイベントページへのリンクも必要です。(10:38

REST API で天気警報をリクエストする

07:56)REST API は任意のプラットフォームで使えます。例は天気警報をリクエスト。まず自前の token サービスから認証 token を取得し、WeatherKit エンドポイントにアクセスします。

/* 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=USweatherAlerts データセットをリクエストするときに必要。
  • Authorization ヘッダーに token を載せ、WeatherKit がリクエストの認可を検証。
  • weatherResponse.json() で戻り値を JSON に変換。
  • weather.weatherAlerts で天気警報データを読み取る。
  • weather.weatherAlerts.detailsUrl で警報詳細ページのリンクを読み取る。天気警報を表示するときはユーザーに提供する必要がある。

REST 認証はサーバー側で行う

09:08)REST API 認証には3段階の準備が必要:Developer Portal で WeatherKit を有効にした authentication key を作成。関連する services ID を作成。サーバーに token service をデプロイし、秘密鍵で署名 JWT を作成。

JWT は header、payload、署名で構成されます。Payload には WeatherKit REST API と App に関する情報(issuer、subject、expiration time など)が含まれます。クライアントは秘密鍵を直接保持せず、自前の token service から token をリクエストし、WeatherKit リクエストに追加します。(09:5110:17


重要ポイント

  • やること:旅行 App に「目的地の天気」欄を追加する。
    価値:Session のフライト計画例が道筋を示しています。各空港に緯度・経度を保存し、時間単位予報をリクエストし、天候・降水・風・気温を表示。
    始め方:App ID と Xcode で WeatherKit を有効化し、WeatherService().weather(for:) で空港の CLLocation をリクエスト。

  • やること:「出かける1時間前の降水リマインダー」を作る。
    価値:分単位予報は今後1時間の分単位降水を提供し、「今傘を持っていくか」に答えやすい。
    始め方:ユーザーの現在地で WeatherKit の分単位予報データセットをリクエストし、データが利用可能な地域でのみ分単位降水ビューを表示。

  • やること:屋外アクティビティページに悪天候警報を追加する。
    価値weatherAlerts データセットにはリクエスト地点の悪天候警告が含まれ、Session は警報表示時にレスポンスのイベントページへリンクすることを要求。
    始め方:Web またはバックエンドで REST API を使い dataSets=weatherAlerts&country=US をリクエストし、weather.weatherAlertsdetailsUrl を読み取る。

  • やること:農業や園芸の記録に履歴天気のトレンドを追加する。
    価値:WeatherKit は時間単位・日単位リクエストに開始日・終了日を指定して履歴天気にアクセスでき、天気の傾向を確認できる。
    始め方:特定の土地の緯度・経度を中心に日付範囲を保存し、時間単位または日単位の履歴リクエストで気温・降水・風などの変化グラフを生成。

  • やること:クロスプラットフォームの天気コンポーネントを作る。
    価値:Swift フレームワークは Apple プラットフォーム向け、REST API は Web や他プラットフォームをカバー。どちらも同じ Apple Weather Service 由来。
    始め方:Apple プラットフォームでは WeatherKit フレームワーク。Web では自前の token service から JWT を取得し、https://weatherkit.apple.com/1/weather/... を呼び出す。


関連セッション

  • 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、屋内地図に関する Q&A。位置情報 App の実装詳細の補足に。

コメント

GitHub Issues · utterances