Użyj wygenerowanych pakietów SDK na iOS

Pakiety SDK klienta Firebase Data Connect umożliwiają wywoływanie zapytań po stronie serwera oraz mutacji bezpośrednio w aplikacji Firebase. Niestandardowy pakiet SDK klienta generuje się w podczas projektowania schematów, zapytań i mutacji wdrażanych w Data Connect. Następnie integrujesz metody z tego pakietu SDK z logiką klienta.

Jak już wspomnieliśmy w innym miejscu, Data Connect zapytania i mutacje nie są przesyłane przez kod klienta i wykonywane na serwera. Zamiast tego po wdrożeniu operacje Data Connect są przechowywane na serwerze, podobnie jak w przypadku Cloud Functions. Oznacza to, że musisz wdrożyć odpowiednie zmiany po stronie klienta, które zapobiegają awariom dotychczasowych użytkowników (na przykład w przypadku starszych aplikacji wersji).

Dlatego Data Connect udostępnia środowisko programistyczne i narzędzia, które umożliwiają tworzenie prototypów schematów, zapytań i mutacji wdrożonych na serwerze. Podczas tworzenia prototypu automatycznie generuje też zestawy SDK po stronie klienta.

Gdy wprowadzisz aktualizacje w aplikacjach usługi i klienta, będzie można wdrożyć aktualizacje po stronie serwera i klienta.

Generowanie pakietu SDK Swift

Podobnie jak w przypadku większości projektów Firebase, praca nad kodem klienta Firebase Data Connect odbywa się w lokalnym katalogu projektu. Zarówno Rozszerzenie Data Connect VS Code oraz interfejs wiersza poleceń Firebase są ważnymi elementami lokalnymi narzędzi do generowania kodu klienta i zarządzania nim.

Opcje generowania pakietu SDK są powiązane z kilkoma wpisami w dataconnect.yaml wygenerowany po zainicjowaniu projektu.

Inicjowanie generowania pakietu SDK

W connector.yaml dodaj pakiety outputDir, package oraz (w przypadku internetowego pakietu SDK) packageJsonDir
connectorId: "movies"
generate:
  swiftSdk:
    outputDir: "../movies-generated"
    package: "Movies"

outputDir określa, gdzie ma być zapisany wygenerowany pakiet SDK. Jeśli nie określono tego folderu, jako domyślny katalog wyjściowy będzie używany folder oprogramowania sprzęgającego.

package określa nazwę pakietu, który zostanie wygenerowany. Generator utworzy folder o nazwie pakietu, który zawiera Package.swift i wygenerował kod.

observablePublisher (opcjonalnie) określa wydawcę Observable, którego należy użyć w odniesieniach zapytania. Możliwe wartości to observableMacro (iOS 17 lub nowszy) oraz observableObject (starszy system – iOS 17). Jeśli nie podasz żadnej wartości, domyślną wartością będzie observableMacro.

Aktualizowanie pakietów SDK podczas prototypowania

Jeśli tworzysz interaktywne prototypy za pomocą rozszerzenia Data Connect VS Code i jego emulatorze Data Connect pliki źródłowe SDK są automatycznie generowanych i aktualizowanych podczas modyfikowania .gql plików definiujących schematy i zapytania i mutacje. Może to być przydatna funkcja w przypadku procesów (ponownego) wczytywania na gorąco.

W innych przypadkach, jeśli używasz emulatora Data Connect z usługi za pomocą interfejsu wiersza poleceń Firebase, możesz ustawić zegarek z aktualizacjami .gql i zainstalować pakiet SDK .

Możesz też użyć interfejsu wiersza poleceń, aby wygenerować pakiety SDK za każdym razem, gdy zmienisz pliki .gql:

firebase dataconnect:sdk:generate --watch

Generowanie pakietów SDK na potrzeby integracji i wersji produkcyjnych

W niektórych sytuacjach, na przykład w przypadku przygotowywania źródeł projektu do przesłania do testów CI, trzeba może wywołać interfejs wiersza poleceń Firebase w celu wykonania aktualizacji zbiorczej.

W takich przypadkach użyj firebase dataconnect:sdk:generate.

Konfigurowanie kodu klienta

Aby skonfigurować kod klienta pod kątem korzystania z Data Connect i wygenerowanego pakietu SDK, wykonaj standardowe instrukcje konfiguracji Firebase.

Następnie otwórz obszar roboczy aplikacji za pomocą Xcode.

Na górnym pasku nawigacyjnym wybierz Plik > Dodaj zależności pakietu > Dodaj Local i wybierz folder zawierający wygenerowany plik Package.swift plik źródłowy.

Inicjowanie pakietu Data Connect SDK na iOS

Zainicjuj instancję Data Connect, korzystając z informacji użytych do skonfigurowania usługi Data Connect (wszystkie dostępne w konsoli Firebase, na karcie Data Connect).

Pobieranie instancji oprogramowania sprzęgającego

Kod dla Twojego łącznika zostanie wygenerowany przez emulator Data Connect. Jeśli nazwa łącznika to movies, a pakiet to movies, zgodnie z definicją w pliku connector.yaml, pobierz obiekt łącznika, wywołując:

let connector = DataConnect.moviesConnector

Uruchomione zapytania i mutacje

Obiekt oprogramowania sprzęgającego umożliwia uruchamianie zapytań i mutacji zdefiniowanych w Kod źródłowy GraphQL. Załóżmy, że oprogramowanie sprzęgające ma zdefiniowane te operacje:

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

Następnie możesz utworzyć film w ten sposób:

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

Aby pobrać film, należy użyć odwołania do zapytania. Wszystkie odwołania do zapytań to wydawcy Observable. W zależności od skonfigurowanego wydawcy (patrz connector.yaml), obsługują makro @Observable (iOS w wersji 17 lub nowszej) lub implementują makro Protokół ObservableObject. Jeśli nie określisz żadnej wartości, domyślnie zostanie użyte makro @Observable obsługiwane w iOS 17 i nowszych.

W widoku SwiftUI możesz powiązać wyniki zapytania za pomocą opublikowanej metody data zmienną odsyłania zapytania i wywołanie metody execute() zapytania, aby zaktualizować dane. Zmienna data będzie pasować do kształtu danych, które zostały zdefiniowane w definicji zapytania GQL.

Wszystkie pobrane wyniki są zgodne z protokołem Decodable. Jeśli w wywołaniu GQL uwzględnisz klucz podstawowy obiektu, obiekty będą też Identifiable, co pozwoli Ci używać ich w iteracjach.

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

Zapytania obsługują również wykonywanie jednorazowych zadań.

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

Twórz prototypy i testuj swoją aplikację na iOS

Użyj klienta, aby użyć lokalnego emulatora

Możesz użyć emulatora Data Connect, korzystając z rozszerzenia Data Connect w VS Code lub z poziomu wiersza poleceń.

W obu przypadkach instrumentowanie aplikacji w celu połączenia z emulatorem jest takie samo.

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

Typy danych w Data Connect pakietach SDK

Serwer Data Connect reprezentuje typowe i niestandardowe typy danych GraphQL. Są one widoczne w pakiecie SDK w ten sposób.

Typ Data Connect Swift
Ciąg znaków Ciąg znaków
Liczba całkowita Liczba całkowita
Liczba zmiennoprzecinkowa Podwójne
Wartość logiczna Wartość logiczna
UUID UUID
Data FirebaseDataConnect.LocalDate
Sygnatura czasowa FirebaseCore.Timestamp
Int64 Int64
Dowolna FirebaseDataConnect.AnyValue