Firebase Data Connect 用戶端 SDK 可讓您直接從 Firebase 應用程式呼叫伺服器端查詢和變異。您可以同時產生自訂用戶端 SDK,同時設計要部署至 Data Connect 服務的結構定義、查詢和變異。接著,您將這個 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
和 (針對網路 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 模擬器進行互動式原型設計,SDK 來源檔案會在您修改定義結構定義、查詢和突變的 .gql
檔案時自動產生及更新。這項功能在熱門 (重新) 載入工作流程中相當實用。
.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 時所用的資訊 (所有資訊皆可在 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)")
如要擷取電影,您必須使用查詢參照。所有查詢參照都是可觀察的發布者。視設定的發布商而定 (請參閱 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 中的表示方式如下所示。
資料連結類型 | Swift |
---|---|
字串 | 字串 |
整數值 | 整數值 |
浮點值 | 雙人床 |
布林值 | 布林值 |
UUID | UUID |
日期 | FirebaseDataConnect.LocalDate |
時間戳記 | FirebaseCore.Timestamp |
Int64 | Int64 |
不限 | FirebaseDataConnect.AnyValue |