使用系統產生的 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 擴充功能的「Add SDK to app」(將 SDK 新增至應用程式) 按鈕
    • 更新connector.yaml
  3. 初始化用戶端程式碼並匯入程式庫

  4. 實作查詢和異動的呼叫

  5. 設定及使用 Data Connect 模擬器,並進行疊代。

產生 Swift SDK

使用 Firebase CLI 在應用程式中設定產生的 SDK。Data Connectinit 指令應會偵測目前資料夾中的所有應用程式,並自動安裝產生的 SDK。

firebase init dataconnect:sdk

在原型設計期間更新 SDK

如果您已安裝 Data Connect VS Code 擴充功能,系統一律會將產生的 SDK 維持在最新狀態。

如果您未使用 Data Connect VS Code 擴充功能,可以透過 Firebase CLI 讓產生的 SDK 維持最新狀態。

firebase dataconnect:sdk:generate --watch

在建構管道中產生 SDK

您可以在 CI/CD 建構程序中使用 Firebase CLI,產生 Data Connect SDK。

firebase dataconnect:sdk:generate

初始化 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)")

如要擷取電影,請使用查詢參照。所有查詢參照都是 Observable 發布商。視設定的發布商而定 (請參閱 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")

處理列舉欄位的變更

應用程式的結構定義可以包含列舉,可供 GraphQL 查詢存取。

隨著應用程式設計變更,您可能會新增支援的列舉值。舉例來說,假設您在應用程式生命週期的稍後階段,決定將 FULLSCREEN 值新增至 AspectRatio 列舉。

Data Connect 工作流程中,您可以使用本機開發工具更新查詢和 SDK。

不過,在您發布用戶端更新版本之前,舊版已部署的用戶端可能會中斷。

具備復原機制的導入範例

產生的 SDK 會強制處理不明值,因為產生的列舉包含 _UNKNOWN 值,而 Swift 會強制執行詳盡的切換陳述式。

do {
    let result = try await DataConnect.moviesConnector.listMovies.execute()
    if let data = result.data {
        for movie in data.movies {
            switch movie.aspectratio {
                case .ACADEMY: print("academy")
                case .WIDESCREEN: print("widescreen")
                case .ANAMORPHIC: print("anamorphic")
                case ._UNKNOWN(let unknownAspect): print(unknownAspect)
            }
        }
    }
} catch {
    // handle error
}

設計 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