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.