使用生成的 iOS SDK

借助 Firebase Data Connect 客户端 SDK,您可以直接从 Firebase 应用调用服务器端查询和突变。在设计部署到 Data Connect 服务的架构、查询和突变时,您可以并行生成自定义客户端 SDK。然后,将此 SDK 中的方法集成到客户端逻辑中。

正如我们在其他地方提到的,请务必注意,Data Connect查询和突变不是由客户端代码提交的,而是在服务器上执行的。相反,部署后,Data Connect 操作会像 Cloud Functions 一样存储在服务器上。这意味着您需要部署相应的客户端更改,以避免影响现有用户(例如,使用旧版应用的用户)。

因此,Data Connect 为您提供了一个开发者环境和工具,让您可以对服务器部署的架构、查询和突变进行原型设计。它还会在您进行原型设计时自动生成客户端 SDK。

当您对服务和客户端应用进行迭代更新后,服务器端和客户端更新即可部署。

客户端开发工作流程是怎样的?

如果您按照使用入门中的说明操作,则已了解 Data Connect 的整体开发流程。在本指南中,您可以详细了解如何从架构生成 Swift SDK,以及如何处理客户端查询和突变。

总而言之,如需在客户端应用中使用生成的 Swift SDK,您需要先完成以下前提步骤:

  1. 将 Firebase 添加到您的 iOS 应用。
  2. 如需使用生成的 SDK,请在 Xcode 中将其配置为依赖项。

    在 Xcode 顶部导航栏中,依次选择 File > Add Package Dependencies > Add Local,然后选择包含生成的 Package.swift 的文件夹。

然后:

  1. 开发应用架构。
  2. 设置 SDK 生成:

    • 使用 Data Connect VS Code 扩展程序中的将 SDK 添加到应用按钮
    • 通过更新 connector.yaml
  3. 初始化客户端代码并导入库

  4. 实现对查询和变更的调用

  5. 设置并使用 Data Connect 模拟器,然后进行迭代。

生成 Swift SDK

与大多数 Firebase 项目一样,Firebase Data Connect客户端Firebase Data Connect代码的开发工作在本地项目目录中进行。Data Connect VS Code 扩展程序和 Firebase CLI 都是用于生成和管理客户端代码的重要本地工具。

SDK 生成选项与您初始化项目时生成的 dataconnect.yaml 文件中的多个条目相关联。

初始化 SDK 生成

connector.yaml 中,添加 outputDirpackage 和(对于 Web SDK)packageJsonDir
connectorId: "movies"
generate:
  swiftSdk:
    outputDir: "../movies-generated"
    package: "Movies"

outputDir 用于指定生成的 SDK 应输出到何处。如果未指定,则连接器文件夹将用作默认输出目录。

package 指定将生成的软件包的名称。生成器将创建一个以软件包名称命名的文件夹,其中包含 Package.swift 和生成的代码。

observablePublisher(可选)指定要在查询引用中使用的 Observable 发布者。可能的值包括 observableMacro(iOS 17 及更高版本)和 observableObject(iOS 17 之前的版本)。如果未指定任何值,则默认值为 observableMacro

在原型设计期间更新 SDK

如果您使用 Data Connect VS Code 扩展程序及其 Data Connect 模拟器进行交互式原型设计,那么在您修改定义架构、查询和变更的 .gql 文件时,系统会自动生成并更新 SDK 源文件。在热(重新)加载工作流中,这可能是一项实用功能。

在其他情况下,如果您使用的是 Firebase CLI 中的 Data Connect 模拟器,则可以监视 .gql 更新,还可以自动更新 SDK 来源。

或者,您也可以使用 CLI 在每次更改 .gql 文件时重新生成 SDK:

firebase dataconnect:sdk:generate --watch

生成用于集成和正式版发布的 SDK

在某些情况下(例如准备要提交以进行 CI 测试的项目源),您可以调用 Firebase CLI 进行批量更新。

在这些情况下,请使用 firebase dataconnect:sdk:generate

初始化 Data Connect iOS SDK

使用您在设置 Data Connect 时所用的信息(全部可在 Firebase 控制台的“Data Connect”标签页中找到)初始化 Data Connect 实例。

获取连接器实例

连接器的代码将由 Data Connect 模拟器生成。如果您的连接器名称为 movies,且软件包为 movies(如 connector.yaml 中所指定),则通过调用以下代码检索连接器对象:

let connector = DataConnect.moviesConnector

实现查询和变更

借助连接器对象,您可以运行 GraphQL 源代码中定义的查询和变更。假设您的连接器定义了以下操作:

mutation createMovie($title: String!, $releaseYear: Int!, $genre: String!, $rating: Int!) {
  movie_insert(data: {
    title: $title
    releaseYear: $releaseYear
    genre: $genre
    rating: $rating
  })
}

query getMovieByKey($key: Movie_Key!) {
  movie(key: $key) { id title }
}

query listMoviesByGenre($genre: String!) {
  movies(where: {genre: {eq: $genre}}) {
    id
    title
  }
}

然后,您可以按如下方式制作影片:

let mutationResult = try await connector.createMovieMutation.execute(
  title: "Empire Strikes Back",
  releaseYear: 1980,
  genre: "Sci-Fi",
  rating: 5)

print("Movie ID: \(mutationResult.data.movie_insert.id)")

如需检索电影,您将使用查询引用。所有查询引用都是 Observable 发布者。根据配置的发布商(请参阅 connector.yaml)),它们要么支持 @Observable 宏(iOS 17 及更高版本),要么实现 ObservableObject 协议。如果未指定,则默认值为 iOS 17 及更高版本支持的 @Observable 宏。

在 SwiftUI 视图中,您可以使用查询 ref 的已发布 data 变量绑定查询结果,并调用查询的 execute() 方法来更新数据。data 变量将与 GQL 查询定义中定义的数据形状相匹配。

所有检索到的结果均符合 Decodable 协议。如果您在 GQL 提取中包含对象的主键,则这些对象也是 Identifiable,因此您可以在迭代器中使用它们。

struct ListMovieView: View {
    @StateObject private var queryRef = connector.listMoviesByGenreQuery.ref(genre: "Sci-Fi")
    var body: some View {
        VStack {
            Button {
                Task {
                    do {
                        try await refresh()
                    } catch {
                        print("Failed to refresh: \(error)")
                    }
                }
            } label: {
                Text("Refresh")
            }
                // use the query results in a view
            ForEach(queryRef.data?.movies ?? [], id: \.self.id) { movie in
                    Text(movie.title)
                }
            }
    }
    @MainActor
    func refresh() async throws {
        _ = try await queryRef.execute()
    }
}

查询还支持单次执行。

let resultData = try await DataConnect.moviesConnector.listMoviesByGenreQuery.execute(genre: "Sci-Fi")

为 iOS 应用设计原型并进行测试

配置客户端以使用本地模拟器

您可以使用 Data Connect 模拟器,无论是在 Data Connect VS Code 扩展程序中还是在 CLI 中。

在应用中植入代码以连接到模拟器,这两种情况是相同的。

let connector = DataConnect.moviesConnector
// Connect to the emulator on "127.0.0.1:9399"
connector.useEmulator()

// (alternatively) if you're running your emulator on non-default port:
connector.useEmulator(port: 9999)

// Make calls from your app

Data Connect SDK 中的数据类型

Data Connect 服务器表示常见和自定义 GraphQL 数据类型。在 SDK 中,这些内容表示如下。

数据连接类型 Swift
字符串 字符串
整数 整数
浮点数 双精度型
布尔值 布尔值
UUID UUID
日期 FirebaseDataConnect.LocalDate
时间戳 FirebaseCore.Timestamp
Int64 Int64
不限 FirebaseDataConnect.AnyValue