weatherkit▌
dpearson2699/swift-ios-skills · updated Apr 8, 2026
Fetch current conditions, hourly and daily forecasts, weather alerts, and
- ›historical statistics using WeatherService. Display required Apple Weather
- ›attribution. Targets Swift 6.3 / iOS 26+.
WeatherKit
Fetch current conditions, hourly and daily forecasts, weather alerts, and
historical statistics using WeatherService. Display required Apple Weather
attribution. Targets Swift 6.3 / iOS 26+.
Contents
- Setup
- Fetching Current Weather
- Forecasts
- Weather Alerts
- Selective Queries
- Attribution
- Availability
- Common Mistakes
- Review Checklist
- References
Setup
Project Configuration
- Enable the WeatherKit capability in Xcode (adds the entitlement)
- Enable WeatherKit for your App ID in the Apple Developer portal
- Add
NSLocationWhenInUseUsageDescriptionto Info.plist if using device location - WeatherKit requires an active Apple Developer Program membership
Import
import WeatherKit
import CoreLocation
Creating the Service
Use the shared singleton or create an instance. The service is Sendable and
thread-safe.
let weatherService = WeatherService.shared
// or
let weatherService = WeatherService()
Fetching Current Weather
Fetch current conditions for a location. Returns a Weather object with all
available datasets.
func fetchCurrentWeather(for location: CLLocation) async throws -> CurrentWeather {
let weather = try await weatherService.weather(for: location)
return weather.currentWeather
}
// Using the result
func displayCurrent(_ current: CurrentWeather) {
let temp = current.temperature // Measurement<UnitTemperature>
let condition = current.condition // WeatherCondition enum
let symbol = current.symbolName // SF Symbol name
let humidity = current.humidity // Double (0-1)
let wind = current.wind // Wind (speed, direction, gust)
let uvIndex = current.uvIndex // UVIndex
print("\(condition): \(temp.formatted())")
}
Forecasts
Hourly Forecast
Returns 25 contiguous hours starting from the current hour by default.
func fetchHourlyForecast(for location: CLLocation) async throws -> Forecast<HourWeather> {
let weather = try await weatherService.weather(for: location)
return weather.hourlyForecast
}
// Iterate hours
for hour in hourlyForecast {
print("\(hour.date): \(hour.temperature.formatted()), \(hour.condition)")
}
Daily Forecast
Returns 10 contiguous days starting from the current day by default.
func fetchDailyForecast(for location: CLLocation) async throws -> Forecast<DayWeather> {
let weather = try await weatherService.weather(for: location)
return weather.dailyForecast
}
// Iterate days
for day in dailyForecast {
print("\(day.date): \(day.lowTemperature.formatted()) - \(day.highTemperature.formatted())")
print(" Condition: \(day.condition), Precipitation: \(day.precipitationChance)")
}
Custom Date Range
Request forecasts for specific date ranges using WeatherQuery.
func fetchExtendedForecast(for location: CLLocation) async throws -> Forecast<DayWeather> {
let startDate = Date.now
let endDate = Calendar.current.date(byAdding: .day, value: 10, to: startDate)!
let forecast = try await weatherService.weather(
for: location,
including: .daily(startDate: startDate, endDate: endDate)
)
return forecast
}
Weather Alerts
Fetch active weather alerts for a location. Alerts include severity, summary, and affected regions.
func fetchAlerts(for location: CLLocation) async throws -> [WeatherAlert]? {
let weather = try await weatherService.weather(for: location)
return weather.weatherAlerts
}
// Process alerts
if let alerts = weatherAlerts {
for alert in alerts {
print("Alert: \(alert.summary)")
print("Severity: \(alert.severity)")
print("Region: \(alert.region)")
if let detailsURL = alert.detailsURL {
// Link to full alert details
}
}
}
Selective Queries
Fetch only the datasets you need to minimize API usage and response size. Each
WeatherQuery type maps to one dataset.
Single Dataset
let current = try await weatherService.weather(
for: location,
including: .current
)
// current is CurrentWeather
Multiple Datasets
let (current, hourly, daily) = try await weatherService.weather(
for: location,
including: .current, .hourly, .daily
)
// current: CurrentWeather, hourly: Forecast<HourWeather>, daily: Forecast<DayWeather>
Minute Forecast
Available in limited regions. Returns precipitation forecasts at minute granularity for the ne
Discussion
Product Hunt–style comments (not star reviews)- No comments yet — start the thread.
Ratings
4.6★★★★★59 reviews- ★★★★★Jin Jackson· Dec 24, 2024
weatherkit reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Ren Johnson· Dec 24, 2024
Useful defaults in weatherkit — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
- ★★★★★Diego Abbas· Dec 24, 2024
Solid pick for teams standardizing on skills: weatherkit is focused, and the summary matches what you get after install.
- ★★★★★Jin Harris· Dec 12, 2024
We added weatherkit from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Aditi Ramirez· Nov 15, 2024
We added weatherkit from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
- ★★★★★Ren Dixit· Nov 15, 2024
I recommend weatherkit for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
- ★★★★★Aanya Haddad· Nov 15, 2024
Registry listing for weatherkit matched our evaluation — installs cleanly and behaves as described in the markdown.
- ★★★★★Sakshi Patil· Nov 7, 2024
weatherkit fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
- ★★★★★Meera Khan· Nov 3, 2024
weatherkit reduced setup friction for our internal harness; good balance of opinion and flexibility.
- ★★★★★Chaitanya Patil· Oct 26, 2024
weatherkit has been reliable in day-to-day use. Documentation quality is above average for community skills.
showing 1-10 of 59