WeatherKit を使って天気情報を取得する方法 (Swift)

ここでは、iOS アプリで WeatherKit を使って天気情報を取得する方法をご説明します。

WeatherKit を使って天気情報を取得する方法 1-1

WeatherKit について

WeatherKit は Apple の提供しているフレームワークのひとつで、Apple Weather サービスから天気の情報取得することができます。

WeatherKit を使うには、有料の Apple Developer Program に登録する必要があります。

詳しくは「Apple Developer Program について」をご覧ください。


また、WeatherKit を使うには、iOS 16, iPadOS 16, macOS 13, tvOS 16, watchOS が必要です。

ここでは、iPhone 用のテストアプリを作るので iOS 16 で開発します。

ウエブアプリやアンドロイドなど、WeatherKit が使えない他のプラットフォーム用に REST API も提供されています。


WeatherKit は 1 ヶ月 500,000 API コールまでは Apple Developer Program に含まれていて無料ですが、リクエストがそれより多くなる場合は有料になります。

料金の詳細は Apple の WeatherKit のページでご確認ください。


WeatherKit を使って天気情報を取得する方法

WeatherKit を使って天気情報を取得するには、WeatherKit サービスを追加した App ID を生成し、iOS アプリに Capability を追加する必要がありますので、その方法を順を追ってご説明します。


WeatherKit サービスを追加した App ID を生成する

WeatherKit サービスを追加した App ID を生成するのに、Bundle Identifier が必要になります。

Bundle Identifier (Bundle ID) は Apple がアプリを特定するのに使う、アプリの ID です。

Bundle Identifier はユニークでなくてはならず、リバースドメインスタイル (com.domainname.appname) が推奨されています。


先に、WeatherKit を使う iOS アプリの Bundle Identifier を設定しておきます。

Xcode で [iOS] の [App] の新規プロジェクトを作成します。

左側のナビゲーターエリアの上のプロジェクト名をクリックし、TARGETS のプロジェクト名をクリックし、Signing & Capabilities タブをクリックします。

ここでは Bundle Identifier を「com.softmoco.WeatherKitTest」に設定しました。

WeatherKit を使って天気情報を取得する方法 1-2


続いて、Apple Developer で WeatherKit を使いたい iOS アプリの App ID を生成します。

Apple Developer のサイトにログインし、Certificates, Identifiers & ProfilesIdentifiers をクリックします。

WeatherKit を使って天気情報を取得する方法 1


Identifiers の横の + ボタンをクリックします。

WeatherKit を使って天気情報を取得する方法 2


[App IDs] を選択し、[Continue] をクリックします。

WeatherKit を使って天気情報を取得する方法 3


[App] を選択し、[Continue] をクリックします。

WeatherKit を使って天気情報を取得する方法 4


[Description] にはお好きな名前を、[Bundle ID] は Explicit で Xcode で指定したものと同じものを入力します。

下の App Services で WeatherKit を選択して、[Continue] をクリックします。

WeatherKit を使って天気情報を取得する方法 5


確認画面が出てくるので、確認して、よければ [Register] をクリックします。

WeatherKit を使って天気情報を取得する方法 6


これで、iOS アプリの WeatherKit サービスを使う App ID が登録できました。

アプリの Bundle ID に WeatherKit サービスが登録されるまで 30 分程度かかるとのことです。

WeatherKit を使って天気情報を取得する方法 7


WeatherKit を使う iOS アプリの準備をする

WeatherKit を使って天気情報を取得して、表示する簡単な iOS アプリを作ります。

まずは、iOS アプリに WeatherKit の Capability を追加します。


先ほど新規作成して Bundle Identifier を設定したプロジェクトを Xcode で開きます。

左側のナビゲーターエリアの上のプロジェクト名を選択し、TARGETS のプロジェクト名を選択します。

そして、Signing & Capabilities タブの + Capability をクリックします。

WeatherKit を使って天気情報を取得する方法 8


Capability のリストから WeatherKit を探し、ダブルクリックして追加します。

WeatherKit を使って天気情報を取得する方法 9


これで、WeatherKit の Capability が追加できました。

WeatherKit を使って天気情報を取得する方法 10


次に、天気情報を表示する画面を作ります。

デザインや場所などは適当で良いので、Main ストーリーボードの View Controller に Location、Temperature 用の Label と、お天気シンボル用の Image View をひとつと、Condition 用の Label をひとつ追加します。

WeatherKit を使って天気情報を取得する方法 11


ViewController.swift をアシスタントエディタで開き、Label と Image View のアウトレットを以下の名前で作っておきます。

オブジェクトの追加の方法や、アウトレットの作り方がわからない方は「基本的な iOS アプリの作り方」をご覧ください。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var locationLabel: UILabel!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var conditionLabel: UILabel!
    @IBOutlet weak var symbolImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

WeatherKit を使って天気情報を取得する

それでは、iOS アプリで Swift で WeatherKit を使って天気情報を取得するコードを書いていきましょう。

今回は Los Angeles の LAX(ロサンゼルス国際空港)の天気情報を取得してみます。

緯度と経度は latitude: 33.942791 と longitude: -118.410042 です。

現在地の天気を取得したい場合は「iOS アプリで現在地情報を取得する方法」をご参考に現在地のロケーションを取得してください。


WeatherKit を使ってロサンゼルスの天気情報を取得して表示するサンプルコードは以下の通りです。

import UIKit
import CoreLocation
import WeatherKit

class ViewController: UIViewController {

    let weatherService = WeatherService()

    @IBOutlet weak var locationLabel: UILabel!
    @IBOutlet weak var temperatureLabel: UILabel!
    @IBOutlet weak var conditionLabel: UILabel!
    @IBOutlet weak var symbolImageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        temperatureLabel.text = ""
        conditionLabel.text = ""
        
        locationLabel.text = "Los Angeles, CA"
        let loc = CLLocation(latitude:33.942791, longitude: -118.410042)
        
        Task {
            let weather = try? await weatherService.weather(for: loc)
            if let weather = weather {
                let tempF = weather.currentWeather.temperature
                let tempC = tempF.converted(to: .celsius)
                temperatureLabel.text = "\(tempF.formatted()) / \(tempC.formatted(.measurement(usage: .asProvided)))"
                
                conditionLabel.text = weather.currentWeather.condition.rawValue
                symbolImageView.image = UIImage(systemName: weather.currentWeather.symbolName)
            }
        }
    }
}

WeatherKit を使って天気情報を取得する方法 12


2 ~ 3 行目では、CLLocation と WeatherKit を使うので、CoreLocation と WeatherKit を import しています。

7 行目では、WeatherService オブジェクトを生成しています。

20 行目で Location ラベルに Los Angeles, CA と設定して、緯度・経度から CLLocation オブジェクトを生成しています。


24 行目でロケーションを指定して WeatherService から天気情報を取得しています。

今回は CurrentWeather を使いますが、その他にも 日ごと(dailyForecast)、時間ごと(hourlyForecast)、分ごと(minuteForecast) の天気予報の情報なども取得できます。


戻り値の weather が nil でない場合は 26 行目で現在の気温を取得しています。

formatted() 関数はデフォルトのフォーマットスタイルを使って、気温を文字列にフォーマットして変換します。

私の環境ではロケールが en_US なので、 デフォルトの °F にフォーマットされます。

27 行目では気温を摂氏に変換して、28 行目で temperatureLabel に華氏と摂氏の温度を表示するようにしています。


30 行目では、currentWeather.condition に設定されている WeatherCondition の Enum の rawValue を conditionLabel.text に代入しています。

31 行目では、currentWeather.symbolName に設定されているシンボル名から UIImage オブジェクトを生成し、symbolImageView に表示するようにしています。


これをビルドしてシミュレーターにインストールして実行すると次のように現在の天気が取得され画面に表示されます。

WeatherKit を使って天気情報を取得する方法 1-1


以上、iOS アプリで WeatherKit を使って天気情報を取得する方法をご説明しました。

© 2024 iOS 開発入門