Клиентские SDK Firebase Data Connect позволяют вызывать запросы и изменения на стороне сервера непосредственно из приложения Firebase. Пользовательский клиентский SDK создается параллельно с разработкой схем, запросов и изменений, которые вы развертываете в службе Data Connect . Затем вы интегрируете методы из этого SDK в свою клиентскую логику.
Как мы уже упоминали, важно отметить, что запросы и изменения Data Connect не отправляются клиентским кодом и не выполняются на сервере. Вместо этого при развертывании операции Data Connect сохраняются на сервере, как и облачные функции. Это означает, что вам необходимо развернуть соответствующие изменения на стороне клиента, чтобы не нарушать работу существующих пользователей (например, в старых версиях приложения).
Вот почему Data Connect предоставляет вам среду разработки и инструменты, которые позволяют создавать прототипы схем, запросов и мутаций, развернутых на сервере. Он также автоматически генерирует клиентские SDK во время создания прототипа.
После повторного обновления служб и клиентских приложений обновления как на стороне сервера, так и на стороне клиента готовы к развертыванию.
Создайте свой Swift SDK
Как и в большинстве проектов Firebase, работа над клиентским кодом Firebase Data Connect происходит в локальном каталоге проекта. И расширение Data Connect VS Code, и интерфейс командной строки Firebase являются важными локальными инструментами для создания клиентского кода и управления им.
Параметры создания SDK привязаны к нескольким записям в файле dataconnect.yaml
, созданном при инициализации проекта.
Инициализировать создание SDK
В вашconnector.yaml
добавьте свой outputDir
, package
и (для веб-SDK) packageJsonDir
. connectorId: "movies"
generate:
swiftSdk:
outputDir: "../movies-generated"
package: "Movies"
outputDir
указывает, куда должен выводиться сгенерированный SDK. Если не указано, папка соединителя используется в качестве выходного каталога по умолчанию.
package
указывает имя пакета, который будет создан. Генератор создаст папку с именем пакета, содержащую Package.swift
и сгенерированный код.
observablePublisher
(необязательно) указывает издателя Observable, который будет использоваться в ссылках на запросы. Возможные значения: observableMacro
(iOS 17+) и observableObject
(до iOS 17). Значение по умолчанию, если оно не указано, — observableMacro
.
Обновляйте SDK во время прототипирования
Если вы создаете прототипы в интерактивном режиме с помощью расширения Data Connect VS Code и его эмулятора Data Connect , исходные файлы SDK автоматически генерируются и обновляются, пока вы изменяете файлы .gql
, определяющие схемы, запросы и мутации. Это может быть полезной функцией в рабочих процессах горячей (повторной) загрузки.
.gql
, а также автоматически обновлять источники SDK.Альтернативно вы можете использовать CLI для повторного создания SDK при каждом изменении файлов .gql:
firebase dataconnect:sdk:generate --watch
Создание SDK для интеграции и производственных выпусков.
В некоторых сценариях, например при подготовке источников проекта к отправке на CI-тесты, вы можете вызвать интерфейс командной строки Firebase для пакетного обновления.
В этих случаях используйте firebase dataconnect:sdk:generate
.
Настройка клиентского кода
Чтобы настроить клиентский код для использования Data Connect и созданного вами SDK, сначала следуйте стандартным инструкциям по настройке Firebase .
Затем откройте рабочую область приложения с помощью Xcode.
На верхней панели навигации выберите «Файл» > «Добавить зависимости пакета» > «Добавить локальный» и выберите папку, содержащую сгенерированный исходный файл Package.swift
.
Инициализируйте SDK Data Connect iOS.
Инициализируйте экземпляр Data Connect , используя информацию, которую вы использовали для настройки Data Connect (все доступно на вкладке Data Connect консоли Firebase ).
Получение экземпляра соединителя
Код для вашего соединителя будет создан эмулятором Data Connect . Если имя вашего соединителя — movies
, а пакет — movies
, как указано в connector.yaml
, то получите объект соединителя, вызвав:
let connector = DataConnect.moviesConnector
Запуск запросов и мутаций
С помощью объекта соединителя вы можете выполнять запросы и мутации, как определено в исходном коде GraphQL. Предположим, что в вашем соединителе определены следующие операции:
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
}
}
Затем вы можете создать фильм следующим образом:
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)")
Чтобы получить фильм, вы будете использовать ссылку на запрос. Все ссылки на запросы являются издателями Observable. В зависимости от настроенного издателя (см. connector.yaml)
они либо поддерживают макрос @Observable
(iOS 17+), либо реализуют протокол ObservableObject
. По умолчанию, если ничего не указано, используется макрос @Observable
поддерживаемый в iOS 17+.
В представлении SwiftUI вы можете связать результаты запроса, используя переменную опубликованных data
ссылки на запрос, и вызвать метод execute()
запроса для обновления данных. Переменная data
будет соответствовать форме данных, определенной в определении запроса GQL.
Все полученные результаты соответствуют протоколу Decodable
. Если вы включили первичный ключ объекта в выборку GQL, объекты также будут Identifiable
, что позволит вам использовать их в итераторах.
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()
}
}
Запросы также поддерживают однократное выполнение.
let resultData = try await DataConnect.moviesConnector.listMoviesByGenreQuery.execute(genre: "Sci-Fi")
Создайте прототип и протестируйте свое приложение для iOS.
Инструментизация клиентов для использования локального эмулятора
Вы можете использовать эмулятор Data Connect как из расширения Data Connect VS Code, так и из CLI.
Инструментирование приложения для подключения к эмулятору одинаково для обоих сценариев.
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
Типы данных в Data Connect SDK
Сервер Data Connect представляет общие и пользовательские типы данных GraphQL. В SDK они представлены следующим образом.
Тип подключения данных | Быстрый |
---|---|
Нить | Нить |
Int | Int |
Плавать | Двойной |
логическое значение | Бул |
UUID | UUID |
Дата | FirebaseDataConnect.LocalDate |
Временная метка | FirebaseCore.Timestamp |
Int64 | Int64 |
Любой | FirebaseDataConnect.AnyValue |