Проблема с получением данных WeatherKit в виджете

Я пытаюсь получить текущие погодные условия пользователя, используяWeatherKitна виджете основное приложение работает нормально. Но приложение виджета вообще не работает, я имею в виду, что оно не получает никаких данных от службы погоды. Я включил WeatherKit для идентификатора основного приложения и виджета, а также добавил возможности WeatherKit для обеих целей.

Когда я пытаюсь получить данные, ничего не происходит, даже отладчик виджета не дает мне никаких журналов!

Вот мой код:

       func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        Task {
            await viewModel.getCurrentWeather() //fetching data
            
            var entries: [SimpleEntry] = []
            // Generate a timeline consisting of five entries an hour apart, starting from the current date.
            let currentDate = Date()
            for hourOffset in 0 ..< 5 {
                print(viewModel.locationManager.locationName)
                let entryDate = Calendar.current.date(byAdding: .minute, value: hourOffset, to: currentDate)!
                let entry = SimpleEntry(date: entryDate, weather: viewModel.currentWeather)
                entries.append(entry)
            }
            let timeline = Timeline(entries: entries, policy: .atEnd)
            completion(timeline)
            print(completion)
        }
    }
}

struct SimpleEntry: TimelineEntry {
    let date: Date
    let weather: Weather
}

struct Forecast_WidgetsEntryView : View {
    var entry: Provider.Entry
    @Environment(\.widgetFamily) var type
    var body: some View {
        DailyForecast1(weather: entry.weather)
    }
}

Я также включилWidget Wants Locationв виджете info.plist, чтобы получить текущее местоположение пользователя.

Вот коды классов WeatherViewModel:

      @MainActor class WeatherViewModel: ObservableObject {
    
    let locationManager = LocationManager()
    @Published var currentWeather: Weather = .empty()
    @Published var isLoading = true
    
    init() { }
    
    func getCurrentWeather() async {
        print("fetching data...")
        isLoading = true
        do {
            guard let currentLocation = locationManager.lastLocation else { return }
            let weather = try await WeatherService.shared.weather(for: currentLocation)
            self.currentWeather = Weather(temperature: weather.currentWeather.temperature.value,
                                          condition: weather.currentWeather.condition.description.capitalized,
                                          symbolName: weather.currentWeather.symbolName,
                                          hightTemp: weather.dailyForecast.first?.highTemperature.value ?? 0.0,
                                          lowTemp: weather.dailyForecast.first?.lowTemperature.value ?? 0.0,
                                          dailyWeathers: weather.dailyForecast.forecast,
                                          hourlyWeathers: weather.hourlyForecast.forecast,
                                          daylight: weather.currentWeather.isDaylight)
            isLoading = false
        } catch {
            isLoading = false
            print(error.localizedDescription)
        }
    }
}

0 ответов

Другие вопросы по тегам