rugaard/weatherkit 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

rugaard/weatherkit

Composer 安装命令:

composer require rugaard/weatherkit

包简介

Integrate Apple WeatherKit API into your project

README 文档

README

Banner PHP 8.1 Coding style Tests Coverage License

⚠️ DISCLAIMER ⚠️

Apple's WeatherKit REST API is currently still in beta and the documentation is not fully up-to-date.

During development undocumented responses and values were encountered, but have been handled to the best of what information was available at the time.

📖 Table of contents

🚀 Features

  • Multiple forecast types
    • Current weather
    • Next hour (minute-by-minute) forecast 🔹
    • Hourly forecast
    • Daily forecast
  • Weather alerts 🔸
  • Built-in unit conversions
    • Length
    • Pressure
    • Speed
    • Temperature

🔹 = In countries where available. 🔸 = When a country code is provided.

📦 Installation

You can install the package via Composer, by using the following command:

composer require rugaard/weatherkit

Laravel provider

This package comes with a out-of-the-box Service Provider for the Laravel framework. If you're using a newer version of Laravel (>= 5.5) then the service provider will loaded automatically.

Are you using an older version, then you need to manually add the service provider to the config/app.php file:

'providers' => [
    Rugaard\WeatherKit\Providers\LaravelServiceProvider::class,
]

Configuration

The default package configuration are setup to use the following environment variables.

Variable name Default Description
RUGAARD_WEATHERKIT_AUTH_FILEPATH Path to the .p8 key file.
RUGAARD_WEATHERKIT_AUTH_KEY_ID Key ID matching the .p8 key file
RUGAARD_WEATHERKIT_AUTH_APP_PREFIX_ID App Prefix ID (aka. Team ID)
RUGAARD_WEATHERKIT_AUTH_BUNDLE_ID Bundle ID of your App ID.
RUGAARD_WEATHERKIT_LANGUAGE_CODE config('app.locale', 'en') Language code
RUGAARD_WEATHERKIT_TIMEZONE config('app.timezone', 'UTC') Set timezone of timestamps

Should you need to change the default configuration, you can publish the configuration file to your project.

php artisan vendor:publish --provider=\Rugaard\WeatherKit\Providers\LaravelServiceProvider

🔑 Authentication

After Apple bought DarkSky and turned into WeatherKit, the API now requires authentication. To be able to authenticate, you are required to be part of Apple's Developer Program.

Once you're enrolled with Apple Developer Program, you must register a new App ID and create a new Key.

Create new App ID

To create a new App ID, you must register your app on this form. Enter a short description and give your app a unique bundle ID (reverse url).

Example:

Description Bundle ID
Latest weather forecast com.forecast.weather

When you are done filling out the required fields, you need ☑️ WeatherKit under the Capabilities and App Services tabs.

Afterwards, click the blue Continue button and you're done.

Create new key

To create a new key, you must generate it from this form.

Give your key a name and make sure to enable ☑️ WeatherKit. When you're done, click the blue Continue button. You'll be redirected to a confirmation page, where you click the blue Register button.

Then, download your key as physical file to your machine. It's required for authenticating with the API.

And that's it. You're done.

⚙️ Usage

Before the client can be instantiated, it requires an access token. To generate an access token, Apple requires you to create an App ID and Key, which you to download as a physical file.

If you have not done these things yet, you can follow the guide in the 🔑 Authentication section of this README.

Generate access token

To generate an access token, you're going to need a few things:

<?php

use Rugaard\WeatherKit\Token;

// Details from "Create new App ID" section.
$appIdPrefix = 'O9876S4E2I';
$bundleId = 'com.forecast.weather';

// Details from "Create new key" section.
$pathToKey = 'credentials/AuthKey_I2E4S6789O.p8'
$keyId = 1234567890;

// Create Token instance.
$token = new Token($pathToKey, $keyId, $appIdPrefix, $bundleId);

When a Token instance has been created, you can retrieve the generated access token in two different ways.

// Method 1: getToken()
$accessToken = $token->getToken();

// Method 2: __toString()
$accessToken = (string) $token;

Standalone

Before we are able to make any requests to the API, we need to instantiate the HTTP client. A client can be instantiated with or without a default location.

<?php

use Rugaard\WeatherKit\Client;

// Instantiate client without default location.
$weatherKit = new Client($token->getToken(), null, null, null);

// Instantiate client with default location.
$weatherKit = new Client((string) $token, 55.6736841, 12.5681471, 'dk');

// Instantiate client with default location and local language/timezone.
$weatherKit = new Client((string) $token, 55.6736841, 12.5681471, 'dk', 'da', 'Europe/Copenhagen');

When a client has been instantiated, it's possible to change the location, language and timezone, if needed.

// Change location to London.
$weatherKit->setLocation(51.5286416, -0.1015987);

// Country code is optional
// but required to retrieve weather alerts.
$weatherKit->setLocation(51.5286416, -0.1015987, 'gb');

// Change language to German.
$weatherKit->setLanguage('de');

// Change timezone to Paris.
$weatherKit->setTimezone('Europe/Paris');

You can either retrieve all forecasts at once or individually.

// Get all forecasts at once.
/* @var $forecasts \Illuminate\Support\Collection */
$forecasts = $weatherKit->weather();

// Get current forecast.
/* @var $forecast \Rugaard\WeatherKit\DTO\DataSets\Currently */
$forecast = $weatherKit->currently();

// Get next hour (minute-by-minute) forecast.
/* @var $forecast \Rugaard\WeatherKit\DTO\DataSets\NextHour */
$forecast = $weatherKit->nextHour();

// Get hourly forecast.
/* @var $forecast \Rugaard\WeatherKit\DTO\DataSets\Hourly */
$forecast = $weatherKit->hourly();

// Get daily forecast.
/* @var $forecast \Rugaard\WeatherKit\DTO\DataSets\Daily */
$forecast = $weatherKit->daily();

When a country code has been set with the client, you are able to retrieve weather alerts, should there be any associated with the location.

// Get weather alerts.
/* @var $alerts \Rugaard\WeatherKit\DTO\DataSets\Alerts */
$alerts = $weatherKit->alerts();

// Get detailed information about a specific alert.
/* @var $alertDetails \Rugaard\WeatherKit\DTO\Forecasts\AlertDetails */
$alertDetails = $weatherKit->alert($alerts->getData()->first()->getId());

With Laravel

When using this package with Laravel, the client will automatically be instantiated and added to the service container.

By default the settings are set via environment variables, described in the 📦 Installation section. Should you want to use something else than environment variables, you can change it in the config file at config/weatherkit.php.

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller;
use Rugaard\WeatherKit\Client as WeatherKit;

class WeatherController extends Controller
{
    /**
     * Get all forecasts at once.
     *
     * @param \Rugaard\WeatherKit\Client $weatherKit
     */
    public function forecast(WeatherKit $weatherKit)
    {
        $forecasts = $weatherKit->setLocation(55.6736841, 12.5681471, 'dk')->weather();
    }
    
    /**
     * Get current weather measurements.
     *
     * @param \Rugaard\WeatherKit\Client $weatherKit
     */
    public function currently(WeatherKit $weatherKit)
    {
        $forecasts = $weatherKit->setLocation(55.6736841, 12.5681471, 'dk')->currently();
    }
    
    /**
     * Get next hour (minute-by-minute) forecast.
     *
     * @param \Rugaard\WeatherKit\Client $weatherKit
     */
    public function nextHour(WeatherKit $weatherKit)
    {
        $forecasts = $weatherKit->setLocation(55.6736841, 12.5681471, 'dk')->nextHour();
    }
    
    /**
     * Get hourly forecast.
     *
     * @param \Rugaard\WeatherKit\Client $weatherKit
     */
    public function hourly(WeatherKit $weatherKit)
    {
        $forecasts = $weatherKit->setLocation(55.6736841, 12.5681471, 'dk')->hourly();
    }
    
    /**
     * Get daily forecast.
     *
     * @param \Rugaard\WeatherKit\Client $weatherKit
     */
    public function daily(WeatherKit $weatherKit)
    {
        $forecasts = $weatherKit->setLocation(55.6736841, 12.5681471, 'dk')->daily();
    }
}

It's possible to set/change default settings on the Client by setting them in the boot() method of the AppServiceProvider. This way, you can avoid setting location/language/timezone on each request.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Rugaard\WeatherKit\Client as WeatherKit;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(WeatherKit $weatherKit)
    {
        // Change location to London.
        $weatherKit->setLocation(51.5286416, -0.1015987);
        
        // Country code is optional
        // but required to retrieve weather alerts.
        $weatherKit->setLocation(51.5286416, -0.1015987, 'gb');
        
        // Change language to German.
        $weatherKit->setLanguage('de');
        
        // Change timezone to Paris.
        $weatherKit->setTimezone('Europe/Paris');
    }
}

📚 Documentation

For more in-depth documentation about forecast types, measurements and more, please refer to the Wiki.

🚓 License

This package is licensed under MIT.

Since this package uses an Apple service, you need follow the guidelines and requirements for attributing Apple weather data. For more details, view the attribution requirements on Apple's website.

rugaard/weatherkit 适用场景与选型建议

rugaard/weatherkit 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1.38k 次下载、GitHub Stars 达 11, 最近一次更新时间为 2022 年 09 月 05 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「api」 「weather」 「forecast」 「weather forecast」 「rugaard」 「morten」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 rugaard/weatherkit 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 rugaard/weatherkit 我们能提供哪些服务?
定制开发 / 二次开发

基于 rugaard/weatherkit 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 1.38k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 11
  • 点击次数: 22
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 11
  • Watchers: 2
  • Forks: 7
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2022-09-05