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 拡張機能の [アプリに SDK を追加] ボタンを使用する
connector.yamlを更新する
Data Connect エミュレータを設定して使用し、反復処理を行います。
Swift SDK を生成する
Firebase CLI を使用して、アプリで Data Connect 生成 SDK を設定します。init コマンドは、現在のフォルダ内のすべてのアプリを検出し、生成された SDK を自動的にインストールします。
firebase init dataconnect:sdk
プロトタイピング中に SDK を更新する
Data Connect VS Code 拡張機能がインストールされている場合、生成された SDK は常に最新の状態に保たれます。
Data Connect VS Code 拡張機能を使用しない場合は、Firebase CLI を使用して生成された SDK を最新の状態に保つことができます。
firebase dataconnect:sdk:generate --watchビルド パイプラインで SDK を生成する
Firebase CLI を使用して、CI/CD ビルドプロセスで Data Connect SDK を生成できます。
firebase dataconnect:sdk:generateData 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")
列挙型フィールドの変更を処理する
アプリのスキーマには列挙型を含めることができ、GraphQL クエリでアクセスできます。
アプリの設計が変更されたら、サポートされている新しい列挙値を追加できます。たとえば、アプリケーションのライフサイクルの後半で、AspectRatio 列挙型に FULLSCREEN 値を追加するとします。
Data Connect ワークフローでは、ローカル開発ツールを使用してクエリと SDK を更新できます。
ただし、クライアントの更新バージョンをリリースする前に、以前にデプロイされたクライアントが破損する可能性があります。
復元力のある実装の例
生成された SDK では、生成された列挙型に _UNKNOWN 値が含まれており、Swift では網羅的な switch ステートメントが強制されるため、不明な値の処理が強制されます。
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
}
クライアントサイド キャッシュを有効にする
Data Connect には、オプションのクライアントサイド キャッシュ機能があります。この機能は、connector.yaml ファイルを編集することで有効にできます。この機能を有効にすると、生成されたクライアント SDK はクエリ レスポンスをローカルにキャッシュに保存します。これにより、アプリが作成するデータベース リクエストの数を減らし、ネットワークの可用性が中断されたときにアプリのデータベース依存部分が動作するようにできます。
クライアントサイド キャッシュ保存を有効にするには、コネクタ構成にクライアント キャッシュ保存構成を追加します。
generate:
swiftSdk:
outputDir: "../ios"
package: "FirebaseDataConnectGenerated"
clientCache:
maxAge: 5s
storage: persistent
この構成には 2 つのパラメータがあり、どちらも省略可能です。
maxAge: クライアント SDK が新しい値を取得する前に、キャッシュに保存されたレスポンスが保持できる最大期間。例: 「0」、「30s」、「1h30m」。maxAgeのデフォルト値は0です。これは、レスポンスがキャッシュに保存されるものの、クライアント SDK は常に新しい値を取得することを意味します。キャッシュに保存された値は、CACHE_ONLYがexecute()に指定されている場合にのみ使用されます。storage: クライアント SDK は、persistentストレージまたはmemoryのいずれかにレスポンスをキャッシュに保存するように構成できます。persistentストレージにキャッシュ保存された結果は、アプリの再起動後も保持されます。iOS SDK では、デフォルトはpersistentです。
コネクタのキャッシュ保存構成を更新したら、クライアント SDK を再生成してアプリを再ビルドします。これにより、execute() は構成したポリシーに従ってレスポンスをキャッシュに保存し、キャッシュに保存された値を使用します。通常、この処理は自動的に行われるため、追加の操作は不要です。ただし、次の点にご注意ください。
execute()のデフォルトの動作は上記のとおりです。クエリの結果がキャッシュに保存され、キャッシュに保存された値がmaxAgeより古くない場合は、キャッシュに保存された値を使用します。このデフォルトの動作はPREFER_CACHEポリシーと呼ばれます。また、
execute()の個々の呼び出しで、キャッシュに保存された値のみを処理する(CACHE_ONLY)か、サーバーから新しい値を無条件で取得する(SERVER_ONLY)かを指定することもできます。try await execute(fetchPolicy: .cacheOnly)try await execute(fetchPolicy: .serverOnly)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 appData Connect SDK のデータ型
Data Connect サーバーは、一般的な GraphQL データ型とカスタム GraphQL データ型を表します。これらは SDK で次のように表されます。
Data Connect 型 Swift 文字列 文字列 Int Int 浮動小数点数 Double ブール値 Bool UUID UUID 日付 FirebaseDataConnect.LocalDate タイムスタンプ FirebaseCore.Timestamp Int64 Int64 すべて FirebaseDataConnect.AnyValue