Usar SDKs do iOS gerados

Com os SDKs do cliente do Firebase Data Connect, é possível chamar consultas e mutações do lado do servidor diretamente de um app do Firebase. Você gera um SDK do cliente personalizado em paralelo ao projetar os esquemas, as consultas e as mutações que implanta no seu serviço Data Connect. Em seguida, integre métodos desse SDK à lógica do cliente.

Como mencionamos em outro lugar, é importante observar que Data Connect consultas e mutações não são enviadas pelo código do cliente e executadas no servidor. Em vez disso, quando implantadas, as operações Data Connect são armazenadas no servidor, como o Cloud Functions. Isso significa que você precisa implantar as mudanças correspondentes do lado do cliente para evitar falhas nos usuários atuais (por exemplo, em versões mais antigas do app).

Por isso, o Data Connect oferece um ambiente de desenvolvimento e ferramentas que permitem criar protótipos de esquemas, consultas e mutações implantados no servidor. Ele também gera SDKs do lado do cliente automaticamente enquanto você cria protótipos.

Depois de iterar as atualizações nos apps de serviço e cliente, as atualizações do lado do servidor e do cliente estarão prontas para implantação.

Qual é o fluxo de trabalho de desenvolvimento do cliente?

Se você seguiu a seção Começar, conheceu o fluxo geral de desenvolvimento do Data Connect. Neste guia, você encontra informações mais detalhadas sobre como gerar SDKs Swift do seu esquema e trabalhar com consultas e mutações de clientes.

Em resumo, para usar os SDKs Swift gerados nos seus apps cliente, siga estas etapas de pré-requisito:

  1. Adicione o Firebase ao seu app iOS.
  2. Para usar o SDK gerado, configure-o como uma dependência no Xcode.

    Na barra de navegação superior do Xcode, selecione Arquivo > Adicionar dependências de pacote > Adicionar local e escolha a pasta que contém o Package.swift gerado.

Depois, siga estas instruções:

  1. Desenvolva o esquema do app.
  2. Configure a geração de SDKs:

  3. Inicialize o código do cliente e importe bibliotecas.

  4. Implemente chamadas para consultas e mutações.

  5. Configure e use o emulador Data Connect e itere.

Gerar o SDK do Swift

Use a CLI Firebase para configurar os SDKs gerados pelo Data Connect nos seus apps. O comando init detecta todos os apps na pasta atual e instala os SDKs gerados automaticamente.

firebase init dataconnect:sdk

Atualizar SDKs durante a criação de protótipos

Se você tiver a extensão do Data Connect VS Code instalada, ela sempre manterá os SDKs gerados atualizados.

Se você não usa a extensão Data Connect do VS Code, pode usar a CLI do Firebase para manter os SDKs gerados atualizados.

firebase dataconnect:sdk:generate --watch

Gerar SDKs em pipelines de build

É possível usar a CLI do Firebase para gerar SDKs do Data Connect em processos de build de CI/CD.

firebase dataconnect:sdk:generate

Inicializar o SDK do iOS Data Connect

Inicialize sua instância Data Connect usando as informações que você usou para configurar o Data Connect. Todas estão disponíveis na guia "Data Connect" do console Firebase.

Como conseguir uma instância de conector

O código do conector será gerado pelo emulador Data Connect. Se o nome do conector for movies e o pacote for movies, conforme especificado em connector.yaml, recupere o objeto do conector chamando:

let connector = DataConnect.moviesConnector

Implementar consultas e mutações

Com o objeto conector, é possível executar consultas e mutações conforme definido no código-fonte GraphQL. Suponha que seu conector tenha estas operações definidas:

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

Em seguida, crie um filme da seguinte maneira:

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

Para recuperar um filme, você vai usar uma referência de consulta. Todas as referências de consulta são publishers observáveis. Dependendo do editor configurado (consulte connector.yaml)), eles oferecem suporte à macro @Observable (iOS 17 ou mais recente) ou implementam o protocolo ObservableObject. O padrão, se nenhum for especificado, é a macro @Observable compatível com o iOS 17 e versões mais recentes.

Em uma visualização do SwiftUI, é possível vincular os resultados da consulta usando a variável data publicada da referência de consulta e chamar o método execute() da consulta para atualizar os dados. A variável data vai corresponder ao formato dos dados definidos na definição da consulta GQL.

Todos os resultados recuperados estão em conformidade com o protocolo Decodable. Se você incluiu a chave primária do objeto na busca de GQL, os objetos também são Identifiable, permitindo que você os use em iteradores.

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

As consultas também são compatíveis com a execução única.

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

Processar mudanças em campos de enumeração

O esquema de um app pode conter enumerações, que podem ser acessadas pelas suas consultas GraphQL.

À medida que o design de um app muda, você pode adicionar novos valores compatíveis com enumeração. Por exemplo, imagine que, mais tarde no ciclo de vida do aplicativo, você decida adicionar um valor FULLSCREEN à enumeração AspectRatio.

No fluxo de trabalho do Data Connect, você pode usar ferramentas de desenvolvimento local para atualizar suas consultas e SDKs.

No entanto, antes de lançar uma versão atualizada dos clientes, os clientes implantados mais antigos podem falhar.

Exemplo de implementação resiliente

O SDK gerado força o processamento de valores desconhecidos, já que as enumerações geradas contêm um valor _UNKNOWN, e o Swift exige instruções de troca exaustivas.

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
}

Desenvolver protótipos e testar seu aplicativo iOS

Instrumentar clientes para usar um emulador local

É possível usar o emulador Data Connect, seja na extensão do Data Connect para VS Code ou na CLI.

A instrumentação do app para se conectar ao emulador é a mesma nos dois cenários.

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

Tipos de dados nos SDKs Data Connect

O servidor Data Connect representa tipos de dados GraphQL comuns e personalizados. Elas são representadas no SDK da seguinte maneira.

Tipo de conexão de dados Swift
String String
Int Int
Ponto flutuante Duplo
Booleano Booleano
UUID UUID
Data FirebaseDataConnect.LocalDate
Carimbo de data/hora FirebaseCore.Timestamp
Int64 Int64
Qualquer FirebaseDataConnect.AnyValue