Клиентские 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
.
Инициализация Data Connect iOS SDK
Инициализируйте экземпляр 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 |