81 lines
2.7 KiB
Swift
81 lines
2.7 KiB
Swift
|
|
import Foundation
|
||
|
|
import WeatherKit
|
||
|
|
import CoreLocation
|
||
|
|
|
||
|
|
@available(iOS 16.0, *)
|
||
|
|
@objc(WeatherKitBridge)
|
||
|
|
class WeatherKitBridge: NSObject {
|
||
|
|
let service = WeatherService.shared
|
||
|
|
|
||
|
|
@objc
|
||
|
|
static func requiresMainQueueSetup() -> Bool { return false }
|
||
|
|
|
||
|
|
@available(iOS 16.0, *)
|
||
|
|
@objc
|
||
|
|
func getWeather(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
||
|
|
let location = CLLocation(latitude: lat, longitude: lon)
|
||
|
|
Task {
|
||
|
|
do {
|
||
|
|
let weather = try await service.weather(for: location)
|
||
|
|
let current = weather.currentWeather
|
||
|
|
let result: [String: Any] = [
|
||
|
|
"temperature": current.temperature.value,
|
||
|
|
"humidity": current.humidity * 100,
|
||
|
|
"condition": current.condition.rawValue,
|
||
|
|
"pressure": current.pressure.value,
|
||
|
|
"uvIndex": current.uvIndex.value,
|
||
|
|
"windSpeed": current.wind.speed.value as Any,
|
||
|
|
"isDaylight": current.isDaylight,
|
||
|
|
"visibility": current.visibility.value as Any
|
||
|
|
]
|
||
|
|
resolve(result)
|
||
|
|
} catch {
|
||
|
|
reject("weatherkit", error.localizedDescription, error)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@available(iOS 16.0, *)
|
||
|
|
@objc
|
||
|
|
func getDailyForecast(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
||
|
|
let location = CLLocation(latitude: lat, longitude: lon)
|
||
|
|
Task {
|
||
|
|
do {
|
||
|
|
let weather = try await service.weather(for: location)
|
||
|
|
let daily = weather.dailyForecast.prefix(3).map { day in
|
||
|
|
return [
|
||
|
|
"high": day.highTemperature.value,
|
||
|
|
"low": day.lowTemperature.value,
|
||
|
|
"condition": day.condition.rawValue,
|
||
|
|
"precipitationChance": day.precipitationChance * 100
|
||
|
|
] as [String : Any]
|
||
|
|
}
|
||
|
|
resolve(daily)
|
||
|
|
} catch {
|
||
|
|
reject("weatherkit", error.localizedDescription, error)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@objc
|
||
|
|
func getHourlyForecast(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
||
|
|
let location = CLLocation(latitude: lat, longitude: lon)
|
||
|
|
Task {
|
||
|
|
do {
|
||
|
|
let weather = try await service.weather(for: location)
|
||
|
|
let hourly = weather.hourlyForecast.prefix(6).map { hour in
|
||
|
|
return [
|
||
|
|
"temperature": hour.temperature.value,
|
||
|
|
"condition": hour.condition.rawValue,
|
||
|
|
"precipitationChance": hour.precipitationChance * 100,
|
||
|
|
"date": hour.date.timeIntervalSince1970 * 1000
|
||
|
|
] as [String : Any]
|
||
|
|
}
|
||
|
|
resolve(hourly)
|
||
|
|
} catch {
|
||
|
|
reject("weatherkit", error.localizedDescription, error)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|