iOS WeatherKit으로 날씨 앱 만들기
>2023.01.15.
개요
WeatherKit은 WWDC 2022에서 공개된 Apple에서 제공하는 날씨 API로, 애플 기본 날씨 앱이 사용하는 날씨 데이터입니다.
iOS에서는 iOS 16부터 사용할 수 있고, Swift에서는 기본으로 제공하며 Web이나 다른 플랫폼에서는 REST API로 사용할 수 있습니다.
애플 말로는 머신러닝을 바탕으로 뛰어난 정확도를 보여준다고 하는데, 기상청 데이터와는 조금 차이가 있습니다.
저는 기본 날씨 앱도 주로 사용하지만, 날씨날씨도 함께 사용합니다. 커뮤니티를 둘러보니 기상청에서 틀렸던 예보가 애플 날씨앱에선 맞은 적도 있다고 하니 아예 신뢰 못할 데이터는 아니라고 생각합니다. 물론 국내 환경에서는 직접 관측소를 두고 측정하는 기상청이 더 신뢰도가 높겠지만 제가 만들 앱에서는 기상청과 WeatherKit 둘 다 사용할 예정이니 사용자의 취향에 맞게 선택하시면 될 것 같습니다 😎
일단 확실한 건 Swift를 사용하는 iOS 개발 환경에서는 WeatherKit을 쓰기가 정말 편합니다.
기상청에서 제공하는 OpenAPI는 위치 정보를 위도, 경도로 제공하지 않고 격자 좌표로 제공해서 이걸 위도, 경도로 바꿔줘야 하는 등 귀찮고 복잡한 점이 한두 가지가 아닌데, 쓰기 편하다는 건 분명한 장점입니다.
그런데 아쉬운 점을 하나 꼽자면 WeatherKit은 Apple Developer Program 멤버십 권한이 필요합니다.
이 멤버십의 가격이 꽤 비싸다는 걸 생각하면 접근성이 그닥 높다고 생각하진 않지만, 어차피 iOS로 개발하는 입장에선 당연히 가입해야 하는 멤버십이라 큰 걱정은 안 하셔도 될 것 같습니다.
멤버십에 가입되어 있다면 월 50만 건의 호출을 사용할 수 있습니다!
날씨 데이터 불러오기
날씨 데이터를 불러오려면 먼저 불러올 지점의 위도와 경도 값을 알아야 합니다.
현재 위치의 위도와 경도는 CoreLocation으로 가져올 수 있는데 크게 어렵지 않으니 생략하겠습니다.
먼저 날씨를 가져오는 코드를 보고 설명드리겠습니다.
import WeatherKit
import CoreLocation
func getAppleWeather(_ location: CLLocation) {
Task {
do {
let service = WeatherService.shared
let result = try await service.weather(for: location)
print("--- 현재 날씨 ---")
print("온도: \(result.currentWeather.temperature)")
print("습도: \(result.currentWeather.humidity)")
print("상태: \(result.currentWeather.condition)")
if let hourly = result.hourlyForecast.first {
print("\n--- 시간별 예보 (첫 데이터) ---")
print("시간: \(hourly.date)")
print("상태: \(hourly.condition)")
print("온도: \(hourly.temperature)")
}
if let daily = result.dailyForecast.first {
print("\n--- 주간 예보 (첫 데이터) ---")
print("날짜: \(daily.date)")
print("상태: \(daily.condition)")
print("최고 기온: \(daily.highTemperature)")
print("최저 기온: \(daily.lowTemperature)")
}
} catch {
print("날씨 데이터 불러오기 실패: \(String(describing: error))")
}
}
}실행 결과 예시
파라미터로 CLLocation을 받아 날씨 데이터를 불러오는 메서드입니다.
각각 현재 날씨, 시간별 예보, 주간 예보를 불러올 수 있습니다.
위 코드를 실행하면 다음과 같은 값이 프린트됩니다.
--- 현재 날씨 ---
온도: -1.11 °C
습도: 0.87
상태: Mostly Clear
--- 시간별 예보 (첫 데이터) ---
시간: 2024-01-11 14:00:00 +0000
상태: Mostly Clear
온도: 2.53 °C
--- 주간 예보 (첫 데이터) ---
날짜: 2024-01-11 15:00:00 +0000
상태: Clear
최고 기온: 4.4 °C
최저 기온: -3.63 °C이렇게
WeatherService.shared.weather(for: location) 한 줄로 현재 날씨, 시간별 예보, 주간 예보 등 방대한 데이터를 한 번에 가져올 수 있어 매우 효율적입니다.