스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
오늘의 날씨에 컨텍스트 가져오기
WeatherKit의 성능을 활용하여 형태별 강수량 예측, 고도별 운량, 최대 풍속 등 자세한 기상 예보 데이터를 얻을 수 있습니다. 하루의 시간대별로 날씨를 요약하는 방법과 기온 또는 강수 상태 변화와 관련된 중요 예보를 강조하는 방법을 확인해 보세요. Historical Comparisons 데이터세트를 통해 현재 날씨를 과거와 비교하고 전 세계 모든 위치의 과거 날씨 통계를 자세히 볼 수 있는 방법을 알아보세요. 아울러 Swift 및 REST API로 이러한 작업을 가속하는 방법도 다룹니다.
챕터
- 0:00 - Introduction
- 1:10 - Richer forecast details
- 10:03 - Highlight weather changes
- 14:10 - Faster data transfer
리소스
- Forum: Maps & Location
- Request authentication for WeatherKit REST API
- WeatherKit
- WeatherKit REST API
관련 비디오
WWDC22
-
다운로드
안녕하세요 저는 Sidy입니다 Weather 팀에서 소프트웨어 엔지니어로 일하고 있죠 그리고 오늘 올해 WeatherKit에 적용될 흥미로운 업데이트에 대해 소개하고자 합니다
WeatherKit은 Apple 날씨 서비스에서 제공합니다 사용하기 쉬운 개인정보 보호 우선 API를 통해 정확한 사용자 생활권의 날씨 데이터를 제공할 수 있습니다 그리고 WeatherKit은 단순히 날씨 앱의 핵심이 아닙니다 Swift 및 REST API는 Carrot Weather (Not Boring) Weather DuckDuckGo 등의 개발자가 사용하여 사용자에게 중요한 날씨 정보를 전달합니다 올해는 몇 가지 개선 사항을 통해 그 어느 때보다 더 나은 WeatherKit을 만들고 있습니다 먼저 강수량 예측 고도별 운량과 같은 세부 정보로 예측을 강화합니다 그리고 다가오는 날씨 변화를 상황에 맞게 강조하는 기능을 도입하고 있습니다 마지막으로 데이터 전송 속도를 높여 주는 바이너리 형식에 대한 지원을 추가합니다 오늘은 이러한 내용을 각각 하나씩 살펴보겠습니다 더 풍부한 예측 세부 정보부터 시작하여 앱에서 구현하는 방법이 포함됩니다
WeatherKit은 몇 가지 훌륭한 API로 구성되어 있습니다 특정 위치에서 어떤 데이터세트를 사용할 수 있는지 알려 주는 가용성이 있고 설정할 데이터 소스를 알려주는 어트리뷰션이 있습니다 진행 중인 악천후에 대한 세부 정보를 알려 주는 활성 알림도 있습니다 하지만 그중에서도 가장 중요한 것은 Weather API입니다 현재 상태 분 단위 강수량, 10일간의 시간별 일별 예보, 날씨 알림 등 가장 필수적인 날씨 데이터를 제공합니다
그리고 올해에는 현재, 시간별, 일별 예보에 더 많은 세부 정보를 추가하여 더 나은 예보를 제공하고 있습니다
현재 상태는 온도, 풍속 또는 자외선 지수와 같은 현재 날씨에 대한 세부 정보를 제공합니다 이제 고도별 운량과 같은 더욱 디테일한 세부 정보를 추가할 수 있습니다 이러한 개선 사항을 시간별 예보에도 적용하고 있습니다 이제 시간별 운량 예보를 고도별 변화와 같은 세부 정보로 보완할 수 있습니다 또는 Apple 날씨 앱처럼 시간별 강수량을 제공할 수도 있습니다
그리고 일일 예보 쿼리는 그중에서도 가장 큰 개선이 진행되고 있습니다 이제 앱에 습도의 높고 낮음과 같이 보다 세분화된 일별 예보를 쉽게 추가할 수 있고 낮의 날씨와 밤의 날씨를 구분하여 일기 예보를 시간대별로 나눌 수도 있습니다
이제 Swift의 예제를 통해 앱에서 시간별 강수량 데이터에 접근하는 방법을 보여 드리겠습니다
먼저 CLLocation에 확장 프로그램을 빠르게 추가하겠습니다 이렇게 하면 현재 및 향후 모든 Swift 예제에서 뉴욕을 참조 위치로 쉽게 설정할 수 있습니다
강수 데이터를 가져오는 것은 쉽습니다 먼저 데이터를 가져올 위치를 전달해야 합니다
그런 다음 데이터에 대해 어떤 세분성을 원하는지 정합니다 여기서는 시간별 쿼리를 원하므로 hourly 쿼리를 지정합니다
마지막으로 시간별 예보에서 precipitationAmount 속성에 접근하면 됩니다 WeatherKit의 다른 모든 항목과 마찬가지로 이러한 속성은 REST API를 통해 사용할 수 있습니다 이전 예제를 REST로 구현하는 방법을 보여 드리겠습니다
WeatherKit API는 weatherkit.apple.com에서 호스팅되므로 이를 RESTful URL 경로로 전달합니다 다음으로 API 버전을 나타내는 매개변수를 추가합니다 이번 릴리즈부터 버전 2입니다 API(이 경우 날씨)를 제공한 다음 데이터를 가져올 로케일을 나타내는 매개변수를 추가합니다 여기서는 미국 영어를 위해 en-US를 사용하지만 iOS에서 지원하는 모든 로케일 중에서 선택할 수 있습니다 지원되지 않는 로케일을 전달하면 응답이 기본적으로 en-US로 표시됩니다 또한 데이터가 필요한 위치 좌표도 지정합니다 여기서는 Swift 예제처럼 뉴욕시입니다 마지막으로 가져올 데이터세트를 지정합니다 이 예에서는 시간별 예보입니다 또한 예측이 필요한 시간 범위를 지정하는 옵션도 있습니다 이 예에서는 간결성을 위해 현재 시간으로 제한합니다
하지만 최대 240시간까지 예보를 요청할 수도 있습니다
범위를 지정하지 않으면 WeatherKit의 기본값은 현재 시간부터 24시간으로 설정됩니다 또한 Apple 날씨 서비스에서 제공된 시간대를 기준으로 예보의 정확한 시작 및 종료 시간을 계산할 수 있는 상대적 시간별 쿼리 매개변수를 사용하는 것에 유의하세요 참고로 Apple 날씨 서비스에 접근하려면 인증 무기명을 생성해야 합니다 이제 결과를 살펴보겠습니다
해당 URL에서 GET을 실행했더니 forecastHourly 키로 호스팅되는 객체가 반환되었습니다
여기에는 시간별 예보 배열이 포함되어 있으며 각 시간별 예보에는 Swift 프로그램에서와 같이 precipitationAmount라는 속성을 비롯한 여러 속성이 있습니다
날씨를 확인할 때 변화하는 패턴을 적극적으로 찾습니다 날씨 변화로 인해 계획이 성사될 수도 있고 무산될 수 있기 때문입니다
이러한 변화에 대해 미리 그리고 상황에 맞게 학습하는 것은 필수적입니다 따라서 이를 위해 Weather API에 두 가지 새로운 쿼리를 추가하고 있습니다
이제 Changes와 Historical Comparisons를 소개합니다 Changes부터 시작해 보겠습니다 Changes 쿼리는 온도 및 강수량에 대한 이후의 변경 사항과 함께 증가 또는 감소와 같이 향후 중요한 변동이 발생할 시간 변화 정보를 제공합니다
날씨 앱은 이 쿼리를 사용하여 사용자에 대한 향후 기온 변화를 강조합니다
이제 앱에서도 Changes 쿼리를 사용할 수 있습니다 방법을 보여 드리죠 계속해서 뉴욕시를 내 위치로 삼고 changes 쿼리를 사용하여 날씨의 변화를 가져옵니다 그러면 변경 사항 목록이 반환되며 이 목록에서 내일 발생하는 변경 사항을 제외하고 모두 필터링합니다 사용 사례를 편리하게 표현하기 위해 Date 구조를 확장하여 isTomorrow를 속성으로 사용했습니다 이 다음 단계에서는 낮은 온도 변화만 포함된 배열에 결과를 매핑합니다 마지막으로 변경 사항이 있고 이러한 변화에 온도 감소가 포함되는 경우 사용자에게 적절한 메시지를 표시합니다
REST에서 이 작업을 수행하려면 weatherChanges 데이터세트를 지정하면 됩니다 이 제품은 향후 중요한 날씨 변화가 없다고 알려 주는 경우에도 항상 정보를 반환합니다 이해를 돕기 위해 출력 예시를 살펴보겠습니다 방금 날씨 변화에 대해 GET 요청을 실행했고 일부 데이터를 다시 가져왔습니다 날씨 변화 객체는 예상대로 weatherChanges 키 뒤에 있습니다
changes 속성 아래에 있는 변경 사항 목록의 래퍼 객체입니다
각 변경 사항에는 예보 변경의 시작 날짜와 종료 날짜가 있습니다 마지막으로 발생할 것으로 예상되는 변화의 유형입니다 이 첫 번째 변경의 경우 지정된 시간대에 최대 온도가 상승할 것으로 예상한다는 의미입니다
조건 변화로 감소할 수도 있고 변화가 없을 것으로 예상되는 경우 필드가 고정 마커로 채워질 수도 있습니다
날씨의 변화는 컨텍스트에서 가장 잘 이해할 수 있습니다 Historical Comparisons도 소개합니다
지난 50년 이상 동안 수집된 데이터에 따르면 Historical Comparisons를 사용하면 오늘의 날씨를 과거 평균과 비교할 수 있으며 결과는 평균 편차의 유의성에 따라 정렬됩니다
날씨 앱에서 현재 사용 중인 Historical Comparisons 쿼리를 확인할 수 있습니다 오늘의 최고 기온과 과거 평균 기온의 편차를 확인할 수도 있죠 Weather API의 이 쿼리는 사용하기에도 편리합니다 그 방법을 보여 드리기 위해 재미있는 코드 스니펫을 하나 더 소개합니다 Swift에서는 .historicalComparisons 쿼리를 포함한 날씨 데이터를 요청하기만 하면 됩니다 목록은 평균 편차의 중요도에 따라 정렬된다는 점을 기억하세요
이제 중요한 추세 편차를 확인했으므로 이를 프린트하여 사용자에게 알려 줄 수 있습니다
REST API를 사용하는 경우 historical comparisons 데이터세트를 포함하면 됩니다 Swift에서와 마찬가지로 평균 편차의 중요도에 따라 정렬된 비교 목록이 표시됩니다
해당 요청의 출력을 살펴보겠습니다
결과 객체는 historicalComparisons 키 아래에 저장되며 비교 목록을 포함합니다
각 비교에는 추세가 계산되는 조건이 있습니다
조건의 현재 값입니다
기준값으로 어떤 방향으로 추세가 진행되고 있는지 컨텍스트를 파악할 수 있습니다
편차 유형도 나열됩니다 이는 편차의 진폭에 해당합니다 이 경우 편차가 정상 범위 내에 있습니다 이 필드에 가능한 다른 값은 더 높게, 훨씬 더 높게, 더 낮게, 훨씬 더 낮게 등입니다
baselineType은 기준선을 설정하는 데 사용되는 통계 방법을 나타냅니다 이 경우 중간값과 같은 값이 아닌 평균값을 사용합니다 이 필드 값은 통계적 추론 방법을 업데이트하면 변경될 수 있습니다
마지막으로 해당 조건에 대해 계산된 평균의 기준선을 설정한 날짜를 확인할 수 있습니다
보시다시피 Apple 날씨는 Weather API에 몇 가지 향상된 기능을 도입하여 현재 예보를 더욱 풍부하게 파악할 수 있게 함으로써 앱에 맞게 사용자에게 다양한 예보를 제공할 수 있도록 지원합니다 이번에는 전 세계 역사적 맥락에서 WeatherKit을 통해 얻을 수 있는 풍부한 날씨 데이터를 이해하는 방법을 이야기하고자 합니다
기후의 맥락에서 날씨를 이해하는 것은 멋진 날씨를 경험하는 데 필수적인 요소가 되었습니다 기후에 대한 인식을 높이는 데 그치지 않고 해당 지역의 장기적인 날씨 패턴을 전반적으로 이해하면 이벤트나 먼 미래의 휴가를 계획하는 데에도 도움이 될 수 있습니다
이를 쉽게 하기 위해 날씨에 대한 다양한 범위의 과거 통계를 얻을 수 있도록 설계된 완전히 새로운 Statistics API를 추가하고 있습니다 Statistics API에는 Historical Averages와 Daily Summaries의 두 가지 새 쿼리가 있습니다 Historical Averages를 사용하면 1970년 1월 1일 이후 기록된 데이터를 기반으로 기온과 강수량에 대한 장기 평균을 가져올 수 있습니다 시간별, 일별, 월별로 세분화되어 있습니다 예를 들어 날씨 앱은 이 API를 활용하여 월별 강수량 평균을 표시하므로 사용자가 다음 휴가를 계획할 때 편리하게 장마철을 피할 수 있습니다 이제 앱에서 통계 데이터를 가져오는 방법도 보여 드리겠습니다
여기서는 월별 통계를 가져오는 Swift 예제를 구현했습니다 WeatherService에서 monthlyStatistics 함수를 호출하면 됩니다 시작 월과 종료 월을 포함합니다 양력에 따르면 1은 1월 12는 12월입니다
그리고 관심 있는 쿼리 유형입니다 여기서는 강수량입니다
이제 결과를 받았으니 월별로 키가 지정된 사전으로 그룹화합니다
REST API를 사용할 때는 통계/월별 API를 호출합니다 강수량을 데이터세트로 전달한 다음 시작 및 종료 월을 지정합니다 월 평균 목록이 반환됩니다
다음 출력을 살펴보겠습니다
월별 날씨 통계 객체에는 계산된 평균의 기준 시작 날짜가 포함되어 있습니다 월별 평균 목록은 months 속성 아래에 호스팅됩니다
강수량만 가져왔기 때문에 이게 전부입니다 강수량 객체에는 Apple 날씨 서비스에서 도출한 월별 평균 데이터가 포함되어 있습니다 마지막으로 해당 월의 인덱스가 1부터 12까지 나열됩니다
Statistics API를 사용하여 2021년 8월 1일까지 과거 모든 날짜의 날씨를 요약해서 볼 수도 있습니다
요약에는 최고 기온과 최저 기온 강수량과 강설량이 포함됩니다
날씨 앱은 이를 사용하여 지난 30일 동안 강수량이 어떻게 누적되었는지 보여 주는 방식으로 현재를 더 잘 파악할 수 있도록 합니다
Swift에서 이 데이터를 가져오는 방법을 살펴보겠습니다
여기서는 강수량 데이터를 중심으로 지난 30일간의 날씨 요약 데이터를 Swift로 가져오고 싶습니다
30일 전에 시작하여 지금 끝나는 날짜 간격을 지정하는데 thirtyDaysAgo는 날짜에 정의한 사용자 지정 확장자입니다
강수량을 쿼리로 포함합니다 이제 데이터를 가지고 있으니 이를 사용하여 사용자에게 알려 줍니다 이 예에서는 강수량만 요청했다는 점에 다시 한 번 유의하세요 REST API를 사용하는 경우 일일 요약 경로를 호출합니다 그런 다음 Swift 예에서와 같이 강수량 데이터세트를 필터링합니다 마지막으로 수신하고자 하는 데이터의 시작 날짜와 종료 날짜를 지정합니다 결과는 일반적으로 기온과 강수량 데이터를 포함하는 일별 요약 배열입니다 강수량만 0이 아닌 값을 가집니다 그렇게 요청했기 때문입니다
보시다시피 Apple 날씨 서비스는 오늘날의 날씨를 더 큰 역사적 맥락에서 이해할 수 있는 이러한 모델을 구축하는 데 엄청난 자원을 투자했습니다
이번 릴리즈에서는 이러한 모델에 의해 계산된 데이터를 사용할 수 있게 되었습니다 그리고 이렇게 풍부한 새로운 데이터를 앱에 통합할 수 있기를 기대합니다
그렇지만 이렇게 많은 양의 과거 날씨 데이터를 가져오는 데는 많은 비용이 들 수 있습니다 따라서 가장 데이터 집약적인 API에서 날씨 데이터를 쉽게 수신할 수 있도록 했습니다 이번 릴리즈에서는 WeatherKit을 통해 날씨 데이터를 그 어느 때보다 빠르게 가져올 수 있도록 FlatBuffers에 대한 지원을 도입합니다 FlatBuffers는 동등한 압축 JSON에 비해 페이로드 크기를 최대 25%까지 줄일 수 있습니다 또한 JSON에 비해 구문 분석 시간을 최대 90%까지 단축할 수 있습니다
Swift API를 사용하는 경우 이 최적화는 무료로 제공됩니다 REST API를 사용하는 경우에는 선택 사항이며 accept 헤더를 지정하여 활성화할 수 있습니다
걱정하지 마세요 페이로드 크기는 최소화하면서 어느 때보다 많은 데이터를 가져올 수 있습니다
이렇게 WeatherKit을 살펴보았습니다 이 세션에서 확인한 내용을 빠르게 요약해 보겠습니다 이미 제공되는 모든 뛰어난 기능 외에도 현재 시간별 일일 예보에 고도별 운량 풍부한 강수량 데이터, 습도 가시성과 같은 세부 정보를 추가하고 있습니다 변경 사항과 historical comparisons 쿼리 완전히 새로운 Statistics API를 소개하고 FlatBuffers에 대한 지원도 소개했습니다
이러한 개선 사항을 통해 어떻게 혁신을 이룰지 기대됩니다 WeatherKit을 이미 사용하고 있다면 이번 릴리즈에서 제공하는 추가 데이터 포인트로 예보를 강화하는 것을 고려해 보세요 또는 중요한 날씨 변화에 대해 사용자에게 계속 알려줄 수 있습니다 또한 사용자에게 오늘의 날씨에 대한 더 넓은 관점을 제공하는 데 사용할 수 있는 풍부한 과거 데이터가 있습니다 REST API를 사용하는 경우 새로운 FlatBuffer 응답을 활용하는 것을 고려해 보세요 WederKit을 사용해 본 적이 없다면 WWDC22의 ‘WeatherKit 소개’ 비디오를 시청하고 지금 바로 시도해 보세요
시청해 주셔서 감사합니다
-
-
2:40 - Fetch Precipitation Amount
import CoreLocation import Foundation import WeatherKit extension CLLocation { static var newYork: CLLocation { CLLocation(latitude: 50.710, longitude: -74.006) } } let hourlyPrecipitation = try await WeatherService() .weather(for: .newYork, including: .hourly) .map(\.precipitationAmount)
-
3:25 - Fetch Precipitation Amount (REST)
https://weatherkit.apple.com/api/v2/weather/en-US/40.710/-74.006?dataSets=forecastHourly&relativeHourlyStart=0&relativeHourlyEnd=1&hourlyRelativeTo=now&timezone=America/New_York
-
6:05 - Weather Changes
import CoreLocation import Foundation import WeatherKit extension Date { var isTomorrow: Bool { return Calendar.current.isDateInTomorrow(self) } } let changes = try await WeatherService() .weather(for: .newYork, including: .changes) let lowTemperatureChanges = changes? .filter(\.date.isTomorrow) .map(\.lowTemperature) if let lowTemperatureChanges, lowTemperatureChanges.contains(.decrease) { // Lower temperatures expected tomorrow }
-
6:43 - Weather Changes (REST)
https://weatherkit.apple.com/api/v2/weather/en-US/40.710/-74.006?dataSets=weatherChanges
-
8:17 - Historical Comparisons
import CoreLocation import Foundation import WeatherKit let mostSignificant = try await WeatherService() .weather(for: .newYork, including: .historicalComparisons)? .first switch mostSignificant { case .highTemperature(let trend), .lowTemperature(let trend): // Display temperature trend break case .some, .none: break }
-
8:36 - Historical Comparisons (REST)
https://weatherkit.apple.com/api/v2/weather/en-US/40.710/-74.006?dataSets=historicalComparisons
-
11:11 - Monthly Statistics
import CoreLocation import Foundation import WeatherKit let averagePrecipitation = try await WeatherService() .monthlyStatistics( for: .newYork, startMonth: 1, endMonth: 12, including: .precipitation ) let averagePrecipitationAmountsPerMonth = Dictionary( grouping: averagePrecipitation, by: \.month )
-
11:41 - Monthly Statistics (REST)
https://weatherkit.apple.com/api/v2/statistics/monthly/40.710/-74.006?dataSets=precipitation&start=1&end=12
-
12:52 - Daily Summary
import CoreLocation import Foundation import WeatherKit extension Date { static var thirtyDaysAgo: Date { return Calendar.current.date(byAdding: .day, value: -30, to: .now)! } } let pastThirtyDaysSummary = try await WeatherService() .dailySummary( for: .newYork, forDaysIn: DateInterval(start: .thirtyDaysAgo, end: .now), including: .precipitation ) .first if let pastThirtyDaysSummary { // We have a daily weather summary for each day in the past 30 days }
-
13:22 - Daily Summary (REST)
https://weatherkit.apple.com/api/v2/summary/daily/40.710/-74.006?dataSets=precipitation&start=2024-05-12&end=2024-06-10
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.