Mond Daten mit Apples WeatherKit anzeigen lassen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Mond Daten mit Apples WeatherKit anzeigen lassen

    Hallo,

    Ich habe mir eine APP angelegt und wollte mir Mond Daten mit Hilfe von Apples WeatherKit anzeigen lassen.
    Als Test habe ich dies hier versucht, was ich aus einem WWDC Tutorial hatte:

    Quellcode

    1. import WeatherKit
    2. let weatherService = WeatherService()
    3. let berlin = CLLocation(latitude: 52.1, longitude: 13.1)
    4. let weather = try! await weatherService.weather(for: berlin)
    5. let uvIndex = weather.currentWeather.uvIndex
    Die funktionierte aber leider noch nicht. in let weather = ... bekomme ich die folgende Fehlermeldung: 'async' call in a function that does not support concurrency. Offensichtlich muss ich hier mehr auf das korrekte Coden bei/mit async-Prozessen achten.

    Aber wenn ich das richtig verstanden habe, dann bekomme ich die WeatherKit Services auch nicht umsonst. Deshalb habe ich meine alte Developer Mitgliedschaft wieder verlängert und meinem App Identifier das WeatherKit hinzugefügt.
    Daraus ergeben sich jetzt für mich drei Fragen:

    1. Was muss ich tun, damit meine APP die Änderung (WeatherKit hinzugefügt) übernimmt?
    2. Hat jemand ein Codeschnipsel für mich, wie ich WeatherKit jetzt korrekt testen kann?
    3. Wie komme ich an die Mond Daten heran (diese befinden sich ja nicht im 'Container' currentWeather)?

    Vielen Dank!
  • Vetinari108 schrieb:

    Die funktionierte aber leider noch nicht. in let weather = ... bekomme ich die folgende Fehlermeldung: 'async' call in a function that does not support concurrency. Offensichtlich muss ich hier mehr auf das korrekte Coden bei/mit async-Prozessen achten.
    Hier müsstest Du die aufrufende Funktion entweder als asynchron definieren (und wiederum aufrufen) oder z. B. die aufrufende Funktion per @MainActor in die Main Queue zwingen.

    Vetinari108 schrieb:

    1. Was muss ich tun, damit meine APP die Änderung (WeatherKit hinzugefügt) übernimmt?
    2. Hat jemand ein Codeschnipsel für mich, wie ich WeatherKit jetzt korrekt testen kann?
    3. Wie komme ich an die Mond Daten heran (diese befinden sich ja nicht im 'Container' currentWeather)?
    Für mich sah dieser Code recht hilfreich aus ... und nur sehr oberflächlich beurteilt, würde ich versuchen, über WeatherQuery die Struktur DayWeather zu erhalten und dort auf moon zugreifen. Ist aber nur anhand der Doku theoretisches "Wissen"...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hallo,

    danke für den Link. Das sieht hilfreich aus.
    Ich habe jetzt eine ganze Weile herumprobiert und endlich das WeatherKit enabled. Zuerst musste ich auch noch meine aktuellen Geräte hinterlegen.
    Alles scheint ok zu sein, aber der untenstehende Code liefert für den UV Index leider nur N/A.

    Ich habe jetzt diesen Code, der zumindest erstmal funktioniert (auch wenn der catch Block noch nicht richtig ist):

    Quellcode

    1. import WeatherKit
    2. ...
    3. @State var uvIndex: UVIndex?
    4. ...
    5. if let uvIndex = uvIndex {
    6. Text("UV-Index: \(uvIndex)")
    7. }
    8. ...
    9. func getWeatherData() async {
    10. do {
    11. let weatherService = WeatherService()
    12. let berlin = CLLocation(latitude: 52.1, longitude: 13.1)
    13. let weather = try await weatherService.weather(for: berlin)
    14. DispatchQueue.main.async {
    15. self.uvIndex = weather.currentWeather.uvIndex
    16. }
    17. } catch {
    18. print(error)
    19. }
    20. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Vetinari108 ()

  • Vetinari108 schrieb:

    Alles scheint ok zu sein, aber der untenstehende Code liefert für den UV Index leider nur N/A.
    Du wartest ja auch nicht, bis der asynchrone Block in der Main-Queue ein Ergebnis erhalten hat ... so endet die Funktion, bevor die Zuweisung erfolgte. Warum nimmst Du hier ein DispatchQueue.main.async? Der Main-Thread ist notwendig, da die UI verändert wird, aber der Zugriff auf weather.currentWeather.uv ist doch nicht asynchron oder ein Langläufer, da kann man doch drauf warten.

    Oder verpasse ich was...?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.