WeatherKit을 이용 날씨 가져오는 방법입니다.
0. 사전 준비
우선 WeatherKit을 사용하기 위해서는 Apple Developer Program 계정이 있어야 합니다.
참고로, 계정이 있다고 무제한 사용 가능한 것은 아니고, 계정 별 월 500,000건까지만 무료로 사용 가능합니다.
여기서 주의할 사항은 Application 별이 아닌 계정 별이라는 것입니다.
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로 현재 위치를 지도에 표시하는 방법
실행을 합니다.
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에 로그인을 합니다.
계정 > 식별자를 클릭합니다.
식별자 리스트 중 에러가 난 app을 선택합니다.
참고로 IDENTIFIER는 xcode의 bundle identifier와 같습니다.
다음과 같이 WeatherKit이 선택되어 있는지 확인합니다.
WeatherKit는 거의 맨 마지막에 있습니다.
그리고 App Services 탭을 클릭해서 WeatherKit이 선택 되어 있는지 확인합니다.
대부분은 선택되어 있지 않습니다.
선택되어 있지 않으면 선택하고 Save를 클릭합니다.
Confirm을 누르고 App을 다시 실행합니다.
참조사이트:
https://developer.apple.com/weatherkit/
https://developer.apple.com/videos/play/wwdc2022/10003/
'다시 개발자' 카테고리의 다른 글
가비아 네임서버 등록 (19) | 2024.11.10 |
---|---|
디지털 서비스법(DSA) 준수, 거래자 자격 여부 제공 (19) | 2024.11.06 |
apple in app 결제를 위한 유료 앱 계약 (102) | 2024.08.10 |
Apple Watch 개발자 모드 활성화 설정 (40) | 2024.01.19 |
[swiftui] The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions 오류 처리 (104) | 2024.01.15 |
댓글