借助 Firebase Data Connect 客户端 SDK,您可以直接从 Firebase 应用调用服务器端查询和变更。您可以在设计要部署到 Data Connect 服务的架构、查询和变更时,并行生成自定义客户端 SDK。然后,将此 SDK 中的方法集成到您的客户端逻辑中。
正如我们在其他地方提到的,请务必注意 Data Connect 查��和变更不是由客户端代码提交,而是在服务器上执行。相反,部署后,Data Connect 操作会像 Cloud Functions 一样存储在服务器上。这意味着,您需要部署相应的客户端更改,以免破坏现有用户(例如,在旧版应用中)。
因此,Data Connect 为您提供了开发者环境和工具,可让您对部署在服务器上的架构、查询和更改进行原型设计。它还会在您进行原型设计时自动生成客户端 SDK。
迭代服务和客户端应用的更新后,服务器端和客户端更新均可部署。
生成 Swift SDK
与大多数 Firebase 项目一样,Firebase Data Connect 客户端代码的工作在本地项目目���中进行。Data Connect VS Code 扩展程序和 Firebase CLI 都是生成和管理客户端代码的重要本地工具。
SDK 生成选项的键值对应于您在初始化项目时生成的 dataconnect.yaml
文件中的多个条目。
初始化 SDK 生成
在connector.yaml
中,添加 outputDir
、package
和(对于 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 源文件。这在热(重新)加载工作流中非常有用。
.gql
更新设置监视,还可以自动更新 SDK 源代码。
或者,您也可以在 .gql 文件发生更改时使用 CLI 重新生成 SDK:
firebase dataconnect:sdk:generate --watch
生成用于集成和正式版的 SDK
在某些情况下(例如准备项目源代码以提交 CI 测试),您可以调用 Firebase CLI 进行批量更新。
在这种情况下,请使用 firebase dataconnect:sdk:generate
。
设置客户端代码
如需设置客户端代码以使用 Data Connect 和生成的 SDK,请先按照标准 Firebase 设置说明操作。
然后,使用 Xcode 打开应用工作区。
在顶部导航栏中,依次选择 File > Add Package Dependencies > Add Local,然后选择包含生成的 Package.swift
源文件的文件夹。
初始化 Data Connect iOS SDK
使用您在设置 Data Connect 时使用的信息初始化您的 Data Connect 实例(所有信息均可在 Firebase 控制台的“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)")
如需检索电影,您将使用查询引用。所有查询引用都是可观察发布者。根据配置的发布商(请参阅 connector.yaml)
),它们支持 @Observable
宏 (iOS 17 及更高版本) 或实现 ObservableObject
协议。如果未指定,默认值为 iOS 17 及更高版本支持的 @Observable
宏。
在 SwiftUI 视图中,您可以使用查询引用的已发布 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 中的表示方式如下。
Data Connect 类型 | Swift |
---|---|
字符串 | 字符串 |
整数 | 整数 |
浮点数 | 双精度型 |
布尔值 | 布尔值 |
UUID | UUID |
日期 | FirebaseDataConnect.LocalDate |
时间戳 | FirebaseCore.Timestamp |
Int64 | Int64 |
不限 | FirebaseDataConnect.AnyValue |