Los SDKs cliente de Firebase Data Connect te permiten llamar a tus consultas y mutaciones del servidor directamente desde una app de Firebase. Generas un SDK cliente personalizado en paralelo a medida que diseñas los esquemas, las consultas y las mutaciones que implementas en tu servicio de Data Connect. Luego, integra los métodos de este SDK en la lógica de tu cliente.
Como mencionamos en otro lugar, es importante tener en cuenta que el código del cliente no envía las consultas ni las mutaciones, sino que se ejecutan en el servidor.Data Connect En cambio, cuando se implementan, las operaciones Data Connect se almacenan en el servidor, como Cloud Functions. Esto significa que debes implementar los cambios correspondientes del cliente para evitar que se interrumpa la experiencia de los usuarios existentes (por ejemplo, en versiones anteriores de la app).
Por eso, Data Connect te proporciona un entorno de desarrollo y herramientas que te permiten crear prototipos de tus esquemas, consultas y mutaciones implementados en el servidor. También genera SDKs del cliente automáticamente mientras creas prototipos.
Cuando hayas iterado las actualizaciones de tus apps de servicio y cliente, las actualizaciones del servidor y del cliente estarán listas para implementarse.
¿Cuál es el flujo de trabajo de desarrollo del cliente?
Si seguiste la sección Comienza ahora, se te presentó el flujo de desarrollo general de Data Connect. En esta guía, encontrarás información más detallada para generar SDKs de Swift a partir de tu esquema y trabajar con consultas y mutaciones del cliente.
En resumen, para usar los SDKs de Swift generados en tus apps cliente, deberás seguir estos pasos previos:
- Agrega Firebase a tu app para iOS.
Para usar el SDK generado, configúralo como una dependencia en Xcode.
En la barra de navegación superior de Xcode, selecciona File > Add Package Dependencies > Add Local y elige la carpeta que contiene el
Package.swift
generado.
Luego, haz lo siguiente:
- Desarrolla el esquema de tu app.
Configura la generación del SDK:
- Con el botón Add SDK to app en nuestra extensión Data Connect de VS Code
- Actualiza tu
connector.yaml
.
Inicializa tu código de cliente y bibliotecas de importación.
Configura y usa el emulador de Data Connect y realiza iteraciones.
Genera tu SDK de Swift
Usa la CLI de Firebase para configurar los SDKs generados por Data Connect en tus apps.
El comando init
debería detectar todas las apps en la carpeta actual y, luego, instalar los SDKs generados automáticamente.
firebase init dataconnect:sdk
Actualiza los SDKs mientras creas prototipos
Si tienes instalada la extensión Data Connect de VS Code, siempre mantendrá actualizados los SDKs generados.
Si no usas la extensión de Data Connect para VS Code, puedes usar la CLI de Firebase para mantener actualizados los SDKs generados.
firebase dataconnect:sdk:generate --watch
Genera SDKs en canalizaciones de compilación
Puedes usar Firebase CLI para generar SDK de Data Connect en procesos de compilación de CI/CD.
firebase dataconnect:sdk:generate
Inicializa el SDK de iOS de Data Connect
Inicializa tu instancia de Data Connect con la información que usaste para configurar Data Connect (toda la información está disponible en la pestaña Data Connect de la consola de Firebase).
Cómo obtener una instancia de conector
El emulador de Data Connect generará el código de tu conector. Si el nombre del conector es movies
y el paquete es movies
, como se especifica en connector.yaml
, recupera el objeto del conector llamando a lo siguiente:
let connector = DataConnect.moviesConnector
Implementa consultas y mutaciones
Con el objeto del conector, puedes ejecutar consultas y mutaciones según se definen en el código fuente de GraphQL. Supongamos que tu conector tiene definidas estas operaciones:
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
}
}
Luego, puedes crear una película de la siguiente manera:
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 una película, usarás una referencia de consulta. Todas las referencias de consulta son publicadores de Observable. Según el publicador configurado (consulta connector.yaml)
), admiten la macro de @Observable
(iOS 17 y versiones posteriores) o implementan el protocolo de ObservableObject
. Si no se especifica ninguno, el valor predeterminado es la macro @Observable
compatible con iOS 17 y versiones posteriores.
En una vista de SwiftUI, puedes vincular los resultados de la consulta con la variable data
publicada de la referencia de la consulta y llamar al método execute()
de la consulta para actualizar los datos. La variable data
coincidirá con la forma de los datos que se definieron en la definición de la consulta de GQL.
Todos los resultados recuperados cumplen con el protocolo de Decodable
. Si incluiste la clave principal del objeto en tu recuperación de GQL, los objetos también son Identifiable
, lo que te permite usarlos en 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()
}
}
Las consultas también admiten la ejecución de un solo intento.
let resultData = try await DataConnect.moviesConnector.listMoviesByGenreQuery.execute(genre: "Sci-Fi")
Cómo controlar los cambios en los campos de enumeración
El esquema de una app puede contener enumeraciones, a las que pueden acceder tus consultas de GraphQL.
A medida que cambia el diseño de una app, es posible que agregues nuevos valores admitidos de enumeración. Por ejemplo, imagina que, más adelante en el ciclo de vida de tu aplicación, decides agregar un valor FULLSCREEN al enum AspectRatio
.
En el flujo de trabajo de Data Connect, puedes usar herramientas de desarrollo locales para actualizar tus consultas y SDKs.
Sin embargo, antes de lanzar una versión actualizada de tus clientes, es posible que los clientes implementados más antiguos dejen de funcionar.
Ejemplo de implementación resistente
El SDK generado obliga a controlar los valores desconocidos, ya que los enums generados contienen un valor _UNKNOWN
y Swift exige instrucciones switch exhaustivas.
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
}
Crea un prototipo y prueba tu aplicación para iOS
Instrumenta clientes para usar un emulador local
Puedes usar el emulador de Data Connect, ya sea desde la extensión de Data Connect para VS Code o desde la CLI.
La instrumentación de la app para conectarse al emulador es la misma en ambos casos.
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 datos en los SDK de Data Connect
El servidor Data Connect representa tipos de datos GraphQL comunes y personalizados. En el SDK, se representan de la siguiente manera.
Tipo de conexión de datos | Swift |
---|---|
String | String |
Int | Int |
Número de punto flotante | Doble |
Booleano | Bool |
UUID | UUID |
Fecha | FirebaseDataConnect.LocalDate |
Marca de tiempo | FirebaseCore.Timestamp |
Int64 | Int64 |
Cualquiera | FirebaseDataConnect.AnyValue |