生成された iOS SDK を使用する

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.yamloutputDirpackage、(ウェブ 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 と生成された SDK を使用するようにクライアントコードを設定するには、まず 標準の Firebase 設定手順に沿って設定します。

次に、Xcode を使用してアプリのワークスペースを開きます。

上部のナビゲーション バーで、[ファイル] > [パッケージの依存関係を追加] > [ローカルを追加] を選択し、生成された 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)")

映画を取得するには、クエリ参照を使用します。すべてのクエリ参照は 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")

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 データ型とカスタム GraphQL データ型を表します。これらは SDK で次のように表されます。

Data Connect の種類 Swift
文字列 文字列
Int Int
浮動小数点数 Double
ブール値 Bool
UUID UUID
日付 FirebaseDataConnect.LocalDate
タイムスタンプ FirebaseCore.Timestamp
Int64 Int64
すべて FirebaseDataConnect.AnyValue