TibberSwift Logo

GitHub Actions Workflow Status Codecov
Swift 5.9 Swift UI MIT License
Mastodon Follow Twitter Follow

TibberSwift

TibberSwift 是一个 Swift 包,旨在简化对 Tibber GraphQL 后端的简单查询,而无需嵌入大型库。TibberSwift 需要您提供 API 密钥才能运行。您需要编写 GraphQL 查询,并将其作为 .graphql 文件存储在您的 bundle 中,或者直接将查询添加到操作中。

TibberSwift 的工作方式是创建一个操作,该操作进而设置一个 Input 和一个 OutputInputEncodable 类型,OutputDecodable 类型。您可以查看示例应用中的自定义 UserLoginOperation,了解如何在您的应用程序中创建操作。

文档

TibberSwift 自带 Xcode 内置文档,但您也可以通过 https://ppeelen.github.io/TibberSwift/ 在线获取这些文档。

安装

TibberSwift 可以通过 Swift Package Manager 安装

https://github.com/ppeelen/TibberSwift.git

示例

dependencies: [
    .package(url: "https://github.com/ppeelen/TibberSwift.git", branch: "main"),
    ...
]

支持

您可以在此 Github 项目中请求支持,但也有一个 Facebook 群组,您可以在其中请求支持和/或展示您的工作。请查看 Facebook 群组 Tibber for Developers

用法

TibberSwift 自带 Xcode 内置文档,此外还有一个示例应用程序,展示了如何从 Tibber 获取数据的几个示例。您需要从 Tibber 获取 API 密钥,可以通过 他们的开发者门户 或通过 oAuth 获取。

此文档会随着时间的推移不断更新,并包含更多示例。

使用从开发者门户或 OAuth 连接获取的 API 密钥初始化 TibberSwift。

let tibberSwift = TibberSwift(apiKey: "my-api-key")

操作

您可以执行两种类型的操作。 一种是预定义的操作,它们存在于 TibberSwift 项目中,另一种是您可以创建自定义的操作。

预定义操作

TibberSwift 带有两个预定义的操作,名为 homesconsumption。如果您想获取 Consumption.graphql 中定义的标准 consumption(基于 API Explorer 中的 consumption),您可以像这样从 Tibber swift 调用 consumption() 函数

private func fetchConsumption() {
    Task {
        do {
            self.consumption = try await tibberSwift.consumption()
        } catch {
            debugPrint("Could not fetch the consumption. Error: \(error.localizedDescription)")
        }
    }
}

获取 homes 也是一样。

自定义操作

如果您希望创建自己的自定义操作,请按照以下步骤操作

1:创建查询

GraphQL 使用查询来获取特定数据。 查看 API 参考,了解您可以创建哪些查询,并使用 API Explorer 试用它们。 一旦您有了一个查询,您需要为 Tibber Swift 定义 Input 和 Output。

1.2:输入

输入参数是您发送到查询中的参数。 这可以是 resulutionlast,它们用于 Consumption。 某些查询不需要任何输入,例如获取哪个用户已登录。 在这种情况下,您可以使用 EmptyInput 作为您的输入参数。

您的输入应符合 Encodable

1.3:输出

Output 是您希望从 GraphQL 中提取的数据,它存在于 viewer 节点内。 例子

{
  "data": {
    "viewer": {
        <<< OUTPUT JSON >>>
    }
  }
}

您的 Output 应符合 Codable

2:创建操作

创建 GraphQLOperation 的扩展,其中 *Input* = *您的新输入*,并且 *Output* = *您的新输出*。

示例

// Import the Tibber Swift project
import TibberSwift

// Create the operation
public extension GraphQLOperation where Input == EmptyInput, Output == UserLogin {
    // Create and return the operation with your query
    static func userLogin() -> Self {
        GraphQLOperation(
            input: EmptyInput(), // The input needed for your query
            // The query you created in step 1
            operationString: """
                {
                  viewer {
                    login
                  }
                }
                """
        )
    }
}

// The output you are expecting from the operation
public struct UserLogin: Codable {
    public let login: String
}

2.1:.graphql 文件

如果您希望将您的查询分离到 graphql 文件中,您可以这样做,而是使用 GraphQLOperation(input:queryFilename:),如下所示

static func currentEnergyPrice() throws -> Self {
    try GraphQLOperation(input: EmptyInput(), queryFilename: "CurrentEnergyPrice")
}

3:运行操作

现在在您的代码中,剩下要做的就是运行该操作; 这是来自示例应用程序的一个示例

func userLoginAction() {
    userLoginLoading = true
    Task {
        do {
            let operation = GraphQLOperation.userLogin()
            self.userLogin = try await tibberSwift.customOperation(operation)
            userLoginLoading = false
        } catch {
            errorMessage = error.localizedDescription
            userLoginLoading = false
        }
    }
}

未来发展

此包当前不支持订阅。 这是将来应该添加的内容。