Firebase Data Connect クライアント SDK を使用すると、Firebase アプリからサーバーサイドのクエリとミューテーションを直接呼び出すことができます。Data Connect サービスにデプロイするスキーマ、クエリ、ミューテーションを設計するのと並行して、カスタム クライアント SDK を生成します。次に、この SDK のメソッドをクライアント ロジックに統合します。
別の場所でも説明しましたが、Data Connect クエリとミューテーションはクライアント コードによって送信され、サーバーで実行されるわけではないことに注意してください。代わりに、デプロイ時に Data Connect オペレーションは Cloud Functions のようにサーバーに保存されます。つまり、既存のユーザー(古いバージョンのアプリなど)を壊さないように、対応するクライアントサイドの変更をデプロイする必要があります。
そのため、Data Connect には、サーバーにデプロイされたスキーマ、クエリ、ミューテーションのプロトタイプを作成できるデベロッパー環境とツールが用意されています。また、プロトタイピング中にクライアントサイド SDK を自動的に生成します。
サービスアプリとクライアント アプリの更新を繰り返すと、サーバーサイドとクライアントサイドの両方の更新をデプロイできるようになります。
クライアント開発のワークフローとは何ですか?
スタートガイドに沿って、Data Connect の開発フロー全体を学びました。このガイドでは、スキーマから Swift SDK を生成し、クライアント クエリとミューテーションを操作する方法について詳しく説明します。
まとめると、生成された Swift SDK をクライアント アプリで使用するには、次の前提条件の手順を行います。
- Firebase を iOS アプリに追加します。
生成された SDK を使用するには、Xcode で依存関係として構成します。
Xcode の上部ナビゲーション バーで、[File] > [Add Package Dependencies] > [Add Local] を選択し、生成された
Package.swift
を含むフォルダを選択します。
次に、以下のリソースをご覧ください。
- アプリのスキーマを開発します。
SDK の生成を設定します。
- Data Connect VS Code 拡張機能の [Add SDK to app] ボタンを使用する
connector.yaml
を更新する
Data Connect エミュレータを設定して使用し、反復処理を行います。
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 エミュレータを使用してインタラクティブにプロトタイピングを行う場合、スキーマ、クエリ、ミューテーションを定義する .gql
ファイルを変更すると、SDK ソースファイルが自動的に生成され、更新されます。これは、ホット(再)読み込みワークフローで役立つ機能です。
.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 エミュレータによって生成されます。connector.yaml
で指定されているように、コネクタ名が movies
でパッケージが movies
の場合は、次の呼び出しでコネクタ オブジェクトを取得します。
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 で次のように表されます。
データ接続タイプ | Swift |
---|---|
文字列 | 文字列 |
Int | Int |
浮動小数点数 | Double |
ブール値 | Bool |
UUID | UUID |
日付 | FirebaseDataConnect.LocalDate |
タイムスタンプ | FirebaseCore.Timestamp |
Int64 | Int64 |
すべて | FirebaseDataConnect.AnyValue |