Generierte iOS-SDKs verwenden

Mit Firebase Data Connect-Client-SDKs können Sie Ihre serverseitigen Abfragen und Mutationen direkt über eine Firebase-App aufrufen. Sie generieren ein benutzerdefiniertes Client-SDK parallel, während Sie die Schemas, Abfragen und Mutationen entwerfen, die Sie in Ihrem Data Connect-Dienst bereitstellen. Anschließend integrieren Sie Methoden aus diesem SDK in Ihre Clientlogik.

Wie bereits erwähnt, werden Data Connect-Abfragen und ‑Mutationen nicht vom Clientcode gesendet und auf dem Server ausgeführt. Stattdessen werden Data Connect-Vorgänge bei der Bereitstellung wie Cloud Functions auf dem Server gespeichert. Das bedeutet, dass Sie entsprechende clientseitige Änderungen vornehmen müssen, um Probleme für bestehende Nutzer zu vermeiden (z. B. bei älteren App-Versionen).

Deshalb bietet Data Connect eine Entwicklerumgebung und Tools, mit denen Sie serverseitig bereitgestellte Schemas, Abfragen und Mutationen prototypisieren können. Außerdem werden clientseitige SDKs automatisch während des Prototyps generiert.

Wenn Sie Ihre Dienst- und Client-Apps aktualisiert haben, clientseitige Updates bereitgestellt werden können.

Swift-SDK generieren

Wie bei den meisten Firebase-Projekten erfolgt die Arbeit am Firebase Data Connect-Clientcode in einem lokalen Projektverzeichnis. Sowohl die Data Connect VS Code-Erweiterung und die Firebase-Befehlszeile sind wichtige lokale Tools zum Generieren und Verwalten von Clientcode.

Die Optionen für die SDK-Generierung sind an mehrere Einträge im dataconnect.yaml gebunden Datei, die bei der Initialisierung Ihres Projekts generiert wurde.

SDK-Generierung initialisieren

Füge im connector.yaml Folgendes hinzu: outputDir, package und (für das Web SDK) packageJsonDir.
connectorId: "movies"
generate:
  swiftSdk:
    outputDir: "../movies-generated"
    package: "Movies"

outputDir gibt an, wohin das generierte SDK die Daten ausgeben soll. Wenn keine Angabe erfolgt, wird der Connector-Ordner als Standardausgabeverzeichnis verwendet.

package gibt den Namen des zu generierenden Pakets an. Der Generator erstellt einen Ordner mit dem Namen des Pakets, der Package.swift enthält und generierter Code.

observablePublisher (optional): Gibt den Observable-Publisher an, der in Abfragereferenzen verwendet werden soll. Mögliche Werte sind observableMacro (iOS 17 und höher) und observableObject (vor iOS 17). Wenn kein Wert angegeben ist, lautet der Standardwert observableMacro

SDKs während des Prototypings aktualisieren

Wenn Sie mit der Data Connect VS Code-Erweiterung interaktiv Prototyping erstellen und dem Data Connect-Emulator erstellt, werden SDK-Quelldateien automatisch generiert und aktualisiert, während Sie .gql-Dateien ändern, mit denen Schemas, Abfragen definiert werden und Mutationen. Dies kann bei Hot-Loading-Workflows nützlich sein.

Wenn Sie in anderen Fällen den Data Connect-Emulator über die Firebase-Befehlszeile verwenden, können Sie .gql-Updates beobachten und SDK-Quellen automatisch aktualisieren lassen.

Alternativ können Sie die SDKs über die Befehlszeile neu generieren, wenn .gql-Dateien geändert werden:

firebase dataconnect:sdk:generate --watch

SDKs für die Integration und für Produktionsversionen generieren

In einigen Fällen, z. B. bei der Vorbereitung von Projektquellen für CI-Tests, können Sie die Firebase CLI für ein Batch-Update aufrufen.

Verwenden Sie in diesen Fällen firebase dataconnect:sdk:generate.

Clientcode einrichten

Um Ihren Clientcode für die Verwendung von Data Connect und Ihrem generierten SDK einzurichten, Folgen Sie der standardmäßigen Firebase-Einrichtungsanleitung.

Öffnen Sie dann Ihren App-Arbeitsbereich mit Xcode.

Wählen Sie in der oberen Navigationsleiste Datei > Paketabhängigkeiten hinzufügen > Hinzufügen Lokal und wählen Sie den Ordner mit den generierten Package.swift-Quelldatei.

Data Connect iOS SDK initialisieren

Initialisieren Sie die Data Connect-Instanz mit den von Ihnen angegebenen Informationen zur Einrichtung von Data Connect (verfügbar in der Firebase-Konsole) Data Connect.

Connector-Instanz abrufen

Der Code für Ihren Connector wird vom Data Connect-Emulator. Lautet der Name Ihres Connectors movies und der Paket movies ist, wie in connector.yaml angegeben, gilt: rufen Sie das Connector-Objekt ab, indem Sie Folgendes aufrufen:

let connector = DataConnect.moviesConnector

Abfragen und Mutationen ausführen

Mit dem Connector-Objekt können Sie Abfragen und Mutationen ausführen, wie im GraphQL-Quellcode definiert. Angenommen, für Ihren Connector sind die folgenden Vorgänge definiert:

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
  }
}

So erstellst du einen Film:

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)")

Zum Abrufen eines Films verwenden Sie eine Abfragereferenz. Alle Abfragereferenzen sind Observable Publisher. Je nach konfiguriertem Publisher (siehe connector.yaml)) wird entweder das @Observable-Makro (iOS 17 und höher) unterstützt oder das ObservableObject-Protokoll implementiert. Wenn keine Angabe erfolgt, ist das @Observable-Makro standardmäßig aktiviert. Dieses wird unter iOS 17 und höher unterstützt.

In einer SwiftUI-Ansicht können Sie die Abfrageergebnisse mithilfe des veröffentlichten data-Objekts binden. Variable der Abfragereferenz und rufen Sie zum Aktualisieren die Methode execute() der Abfrage auf mit den Daten. Die Variable data entspricht der Datenstruktur, die in der GQL-Abfragedefinition definiert wurde.

Alle abgerufenen Ergebnisse entsprechen dem Decodable-Protokoll. Wenn Sie den Primärschlüssel des Objekts in Ihren GQL-Abruf aufgenommen haben, sind die Objekte auch Identifiable. Sie können sie dann in Iteratoren verwenden.

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()
    }
}

Abfragen unterstützen auch die einmalige Ausführung.

let resultData = try await DataConnect.moviesConnector.listMoviesByGenreQuery.execute(genre: "Sci-Fi")

iOS-App prototypisieren und testen

Clients für die Verwendung eines lokalen Emulators instrumentieren

Sie können den Data Connect-Emulator aus dem Data Connect VS Code-Erweiterung oder über die Befehlszeile

Die Instrumentierung der App für die Verbindung zum Emulator ist für beide Szenarien identisch.

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

Datentypen in Data Connect SDKs

Der Data Connect-Server stellt gängige und benutzerdefinierte GraphQL-Datentypen dar. Diese werden im SDK wie folgt dargestellt.

Data Connect-Typ Swift
String String
Integer Integer
Float Doppelt
Boolesch Bool
UUID UUID
Datum FirebaseDataConnect.LocalDate
Zeitstempel FirebaseCore.Timestamp
INT64 INT64
Beliebig FirebaseDataConnect.AnyValue