Используйте сгенерированные iOS SDK

Клиентские 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 , определяющие схемы, запросы и мутации. Это может быть полезной функцией в рабочих процессах горячей (повторной) загрузки.

В других сценариях, если вы используете эмулятор Data Connect из интерфейса командной строки Firebase , вы можете настроить наблюдение за обновлениями .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