Juni 2023

Integration der Weatherkit API in ein NestJS-Backend

Damian Keller

Geschrieben von

Damian Keller

Kategorie

Software Engineering
Blogeintrag Integration der Weatherkit API in ein NestJS-Backend


Wenn Wettervorhersageinformationen für eine Service genutzt werden sollen, existieren verschiedene sehr gute Wetter-APIs, über die die Wetterdaten bezogen werden können. Dazu gehört auch die Weatherkit API von Apple mit ihrem grosszügigien Gratis-Kontingent. Deshalb zeigt dieses Beispiel, wie die API trotz einigen Hürden in Javascript korrekt konfiguriert und genutzt werden kann.

Die Dokumentation der API-Endpunkte(https://developer.apple.com/documentation/weatherkitrestapi) scheint anfangs ein wenig unübersichtlich, aber folgende Daten werden in diesem Beispiel abgerufen: https://developer.apple.com/documentation/weatherkitrestapi/hourweatherconditions

Leider fehlen beispielsweise die von Apple genutzten Enums wie z.B. den ConditionCodes in der offiziellen Dokumentation, welche zur Taxierung der aktuellen Wetterzustände genutzt werden. Glücklicherweise konnten diese Mappings aber über Forenbeiträge auf inoffiziellen Open-Source-Repositories gefunden werden konnten.

Auch bei der Authentifizierung gegenüber Apple und der korrekten Einbindung des Keys und der Tokens gabe es noch einige Fragen zu klären:

Die Dokumentation betreffend Auth ist hier zu finden:
https://developer.apple.com/documentation/weatherkitrestapi/request_authentication_for_weatherkit_rest_api

Hier leicht zu übersehen:
Die WeatherkitAPI ist sowohl bei den Capabilites als auch bei den App Services zu aktivieren, sonst sendet die API einen unauthorizedf-Fehler mit folgender Fehlermeldung zurück: {"reason": "NOT_ENABLED"}

Der Identifier ist über das Apple Developer Dashboard (https://developer.apple.com/account/resources/identifiers/list) verfügbar.

Der Key wird beim Erstellen einer App unter https://developer.apple.com/account/resources/authkeys/list zum einmaligen Download bereitgestellt.

Anwendungscode in Javascript

async getWeatherForecast(dateToCheck) {
   const privateKey = fs.readFileSync('path/to/apple/authKey.p8');
   const token = jwt.sign(
     {
       sub: '<APP_ID>',
     },
     privateKey,
     {
       issuer: '<TEAM_ID>', // teamId
       expiresIn: '1h',
       keyid: '<KEY_ID>',
       algorithm: 'ES256',
       header: {
         id: '<TEAM_ID>.<APP_ID>', // teamId.appId
       },
     },
   );
   // make coordinates dynamic (currently ZH Seebecken)
   const url = `https://weatherkit.apple.com/api/v1/weather/en/47.3384981/8.5492907?dataSets=forecastHourly&timezone=Europe/Zurich`
   this.logger.log(`weather-check url: ${url}`);
   return await firstValueFrom(
     this.httpService.get(url, {
       headers: { Authorization: `Bearer ${token}` },
     }),
   );
 }

Die Variablen sind aus den Account-Informationen im Apple Developer Portal zu beziehen.
https://developer.apple.com/account/resources/identifiers/bundleId/edit/JX5PVTMD28

Mit dem korrekten Auth-Token und den passenden Konfiguration können wie in diesem Bseispiel gezeigt Wetterdaten von der Apple WeatherkitApi in Javascript abgefragt werden.