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. Sie müssen also entsprechende clientseitige Änderungen vornehmen, 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 generiert, während Sie den Prototyp erstellen.

Wenn Sie Updates für Ihre Dienst- und Client-Apps iteriert haben, können sowohl server- als auch clientseitige Updates bereitgestellt werden.

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 als auch die Firebase-Befehlszeile sind wichtige lokale Tools zum Generieren und Verwalten von Clientcode.

Die Optionen zur SDK-Generierung sind mit mehreren Einträgen in der dataconnect.yaml-Datei verknüpft, die beim Initialisieren Ihres Projekts generiert wurde.

SDK-Generierung initialisieren

Fügen Sie in Ihrer connector.yaml Ihre outputDir, package und (für das Web SDK) packageJsonDir hinzu.
connectorId: "movies"
generate:
  swiftSdk:
    outputDir: "../movies-generated"
    package: "Movies"

outputDir gibt an, wo das generierte SDK ausgegeben werden 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 und den generierten Code enthält.

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 und dem Data Connect-Emulator interaktiv Prototypen erstellen, werden SDK-Quelldateien automatisch generiert und aktualisiert, während Sie .gql-Dateien ändern, in denen Schemas, Abfragen und Mutationen definiert werden. Dies kann eine nützliche Funktion in Workflows für das Hot-Reloading (Neuladen) 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

Wenn Sie Ihren Clientcode so einrichten möchten, dass er Data Connect und das generierte SDK verwendet, folgen Sie zuerst 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 > Lokal hinzufügen aus und wählen Sie den Ordner mit der generierten Package.swift-Quelldatei aus.

Data Connect iOS SDK initialisieren

Initiieren Sie Ihre Data Connect-Instanz mit den Informationen, die Sie zum Einrichten von Data Connect verwendet haben. Diese sind alle auf dem Tab „Data Connect“ der Firebase-Konsole verfügbar.

Connector-Instanz abrufen

Der Code für Ihren Connector wird vom Data Connect-Emulator generiert. Wenn der Name des Connectors movies und das Paket movies ist, wie in connector.yaml angegeben, rufen Sie das Connector-Objekt mit folgendem Aufruf ab:

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 mit der veröffentlichten data-Variablen der Abfragereferenz binden und die execute()-Methode der Abfrage aufrufen, um die Daten zu aktualisieren. 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 Ihre GQL-Abfrage 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 prototypieren und testen

Clients für die Verwendung eines lokalen Emulators instrumentieren

Sie können den Data Connect-Emulator über die VS Code-Erweiterung „Data Connect“ oder über die Befehlszeile verwenden.

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. Sie werden im SDK so 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