Files
mao1/shenyan-app/ios/ShenYanApp/WeatherKitBridge.swift

81 lines
2.7 KiB
Swift
Raw Normal View History

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)
}
}
}
}