iOS/swift

WeatherKit 사용하기

skyiOS 2023. 11. 29. 10:51
반응형
앱을 개발하며 날씨를 받아오는 기능이 필요해서 WeatherKit 을 사용해봤습니다.

 


WeatherKit은 애플 개발자 계정이 있어야 사용가능합니다~


제공 데이터 

더 자세한 내용은 WWDC2022  와  데이터셋  을 확인 해주세요 


1. Key 생성

인증서  페이지에서 key를 생성합니다.

2. AppID 생성

번들 아이디는 프로젝트의 번들아이디와 같아야 합니다.
capabilities 와 appservices 에서 weatherKit 을 체크합니다.


3. Xcode 기본 설정

Capablility 를 클릭해서 weatherKit 을 추가합니다.


날씨 정보 받기 

사용자의 위치를 받기위해 설정 합니다.

class WeatherTestViewController: UIViewController {
    
    let weatherService = WeatherService()
    var locationManager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setLocationManager()
    }
    
}

extension WeatherTestViewController: CLLocationManagerDelegate {
    
    
    private func setLocationManager() {
        locationManager.delegate = self
        // 거리 정확도
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        // 위치사용 알림
        locationManager.requestWhenInUseAuthorization()
        
        locationManager.startUpdatingLocation()
    }
}

날씨를 받아올 함수를 만듭니다.

func getWeather(location: CLLocation) {
        Task{
            do{
               let result =  try await weatherService.weather(for: location)
                print("날씨정보:")
                print(result)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("currentMetadata: ",result.currentWeather.symbolName)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("Current: ",result.currentWeather)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("daily first :",result.dailyForecast.first!)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("daily: ",result.dailyForecast.forecast.first!.date)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("daily2: ",result.dailyForecast.forecast[1])
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("minute: ",result.minuteForecast)
            } catch {
                print(error.localizedDescription)
            }
        }
    }

위치 가 변경되면  날씨를 받아오는 함수를 호출합니다.

 func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            print("위치 업데이트!")
            print("위도 : \(location.coordinate.latitude)")
            print("경도 : \(location.coordinate.longitude)")
            locationManager.stopUpdatingLocation()
            getWeather(location: location)
        }
    }
    
    // 위치 가져오기 실패
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("error")
    }

 

 

전체 코드 

import WeatherKit
import CoreLocation


class WeatherTestViewController: UIViewController {
    
    let weatherService = WeatherService()
    var locationManager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setLocationManager()
    }
    
}

extension WeatherTestViewController: CLLocationManagerDelegate {
    
    
    private func setLocationManager() {
        locationManager.delegate = self
        // 거리 정확도
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        // 위치사용 알림
        locationManager.requestWhenInUseAuthorization()
        
        locationManager.startUpdatingLocation()
    }
    func getWeather(location: CLLocation) {
        Task{
            do{
               let result =  try await weatherService.weather(for: location)
                print("날씨정보:")
                print(result)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("currentMetadata: ",result.currentWeather.symbolName)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("Current: ",result.currentWeather)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("daily first :",result.dailyForecast.first!)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("daily: ",result.dailyForecast.forecast.first!.date)
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("daily2: ",result.dailyForecast.forecast[1])
                print("ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ")
                print("minute: ",result.minuteForecast)
            } catch {
                print(error.localizedDescription)
            }
        }
    }
    
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.first {
            print("위치 업데이트!")
            print("위도 : \(location.coordinate.latitude)")
            print("경도 : \(location.coordinate.longitude)")
            locationManager.stopUpdatingLocation()
            getWeather(location: location)
        }
    }
    
    // 위치 가져오기 실패
    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("error")
    }
    
}

 

https://www.youtube.com/watch?v=4J80kTRFL70&t=285s

반응형

 

반응형