본문 바로가기
다시 개발자

swiftui, WeatherKit 이용 날씨 가져오기

by 까삼스 이삐 2024. 10. 25.
728x90
반응형

WeatherKit을 이용 날씨 가져오는 방법입니다.

 

0. 사전 준비

우선 WeatherKit을 사용하기 위해서는 Apple Developer Program 계정이 있어야 합니다.

참고로, 계정이 있다고 무제한 사용 가능한 것은 아니고, 계정 별 월 500,000건까지만 무료로 사용 가능합니다.

여기서 주의할 사항은 Application 별이 아닌 계정 별이라는 것입니다.

 

반응형
728x90

1. swiftui 코드 작성

weatherkit을 capabilities에 추가합니다.

 

Signing & Capabilities에 Capability를 클릭합니다.

 

 

pop-up 창의 맨 아래 쪽에 있는 WeatherKit을 double click 합니다.

 

아래의 코드를 적용합니다.

import SwiftUI
import CoreLocation


struct ContentView: View {
    @StateObject var locationManager = LocationManager()
    @StateObject var weatherServiceManager = WeatherServiceManager()
    
    var body: some View {
        VStack {
            if let location = locationManager.location {
                if let currentWeather = weatherServiceManager.currentWeather {
                    Text("Temperature: \(currentWeather.temperature.formatted())")
                    Text("Condition: \(currentWeather.condition.description)")
                } else {
                    ProgressView("Loading weather data...")
                        .onAppear {
                            Task {
                                await weatherServiceManager.getWeather(for: location)
                            }
                        }
                }
            } else if let error = locationManager.errorMessage {
                Text(error)
            } else {
                ProgressView("Fetching location...")
            }
        }
        .padding()
    }
}


import Foundation
import CoreLocation


class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {
    private let locationManager = CLLocationManager()
    
    @Published var location: CLLocationCoordinate2D?
    @Published var errorMessage: String?
    
    override init() {
        super.init()
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()
    }
    
    func locationManager( _ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            self.location = location.coordinate
        }
    }
    
    func locationManager( _ manager: CLLocationManager, didFailWithError error: Error) {
        errorMessage = "Failed to get user location: \(error.localizedDescription)"
    }
}


import Foundation
import WeatherKit
import CoreLocation


@MainActor
class WeatherServiceManager: ObservableObject {
    private let weatherService = WeatherService()  // 'shared'가 아닌 인스턴스 생성
    
    @Published var currentWeather: CurrentWeather?
    
    func getWeather(for location: CLLocationCoordinate2D) async {
        do {
            print("location: ", location)
            let weather = try await weatherService.weather(for: CLLocation(latitude: location.latitude, longitude: location.longitude))
            self.currentWeather = weather.currentWeather
        } catch {
            print("Failed to fetch weather data: \(error.localizedDescription)")
        }
    }
}

 

참고로, 위 코드는 현재의 위치에 해당하는 날씨를 가져오는 것입니다.

따라서 현재 위치를 가져오기 위해서는 사용자의 동의를 구하는 로직을 추가해야 합니다.

 

 

추가 방법에 대해서는 아래글을 참조하십시오.

2023.10.10 - [다시 개발자] - Swiftui로 현재 위치를 지도에 표시하는 방법

 

Swiftui로 현재 위치를 지도에 표시하는 방법

Swiftui로 현재 위치를 지도에 표시하는 방법입니다. info.plist에 "Privacy - Location When In Use Usage Description"를 추가합니다. Swiftui의 view를 다음과 같이 구현합니다. import SwiftUI import MapKit import CoreLocation s

kka3seb.tistory.com

 

실행을 합니다.

 

 

2. Certificates, Identifiers & Profiles 확인

 

만약 실행을 했을 때 아래와 같은 에러가 나온다면 App ID의 설정을 확인해야 합니다.

Failed to generate jwt token for: com.apple.weatherkit.authservice with error: Error Domain=WeatherDaemon.WDSJWTAuthenticatorServiceListener.Errors Code=2 "(null)"

 

Apple developer에 로그인을 합니다.

https://developer.apple.com/

 

계정 > 식별자를 클릭합니다.

 

식별자 리스트 중 에러가 난 app을 선택합니다.

 

 

참고로 IDENTIFIER는 xcode의 bundle identifier와 같습니다.

 

다음과 같이 WeatherKit이 선택되어 있는지 확인합니다.

 

WeatherKit는 거의 맨 마지막에 있습니다.

 

그리고 App Services 탭을 클릭해서 WeatherKit이 선택 되어 있는지 확인합니다.

대부분은 선택되어 있지 않습니다. 

 

선택되어 있지 않으면 선택하고 Save를 클릭합니다.

 

Confirm을 누르고 App을 다시 실행합니다.

 

 

 

 

참조사이트:

https://developer.apple.com/weatherkit/

 

WeatherKit - Apple Developer

WeatherKit brings valuable weather information to your apps and services through a wide range of data that can help people stay up to date, safe, and prepared.

developer.apple.com

https://developer.apple.com/videos/play/wwdc2022/10003/

 

Meet WeatherKit - WWDC22 - Videos - Apple Developer

WeatherKit offers valuable weather data for your apps and services to help people stay up to date on the latest conditions. Learn how to...

developer.apple.com

 

 

 

 

728x90
반응형

댓글