rzaripov.kz

Подключение Firebase Analytics к Delphi-приложениям

Сбор данных о поведении пользователей стал обязательной частью коммерческой разработки. Мобильные и настольные программы, созданные на Delphi с использованием FireMonkey, охватывают несколько платформ одновременно, поэтому владельцу проекта требуется единый инструмент для аналитики. Firebase от Google закрывает эту задачу благодаря бесплатному тарифу, мультиплатформенной совместимости и понятной панели отчётов.

Интеграция сервиса в проекты на Pascal требует понимания особенностей Measurement Protocol — REST-интерфейса, через который сторонние приложения передают события. Такой способ отправки не привязан к нативным SDK, что позволяет применять один и тот же исходный код для Android, iOS, Windows и macOS. Дальше разобраны ключевые этапы реализации: от регистрации проекта до валидации данных.

Регистрация проекта в консоли Firebase

Перед началом разработки необходимо завести аккаунт Google и добавить его в Firebase. В мастере выбирается пункт «Создать проект», указывается название и глобальный идентификатор, после чего активируется Google Analytics. Система связывает ресурс с существующим аккаунтом BigQuery, если требуется экспорт сырых данных для собственных отчётов.

После активации аналитики Firebase выдаёт два ключевых значения: API Secret и Firebase App ID. App ID имеет вид 1:1234567890:web:abcdef1234567890, а секрет измерений — набор из 32 символов. Эти строки потребуются программе для авторизации запросов к серверу Google.

Дополнительно стоит включить Google Signals для получения демографических срезов и активировать связь с Google Ads, если планируется рекламная аналитика. На этапе настройки полезно задать правила Data Stream: имя потока, часовой пояс и валюту, в которой будут считаться доходы. Корректно заполненные параметры исключают ошибки интерпретации данных в дальнейшем.

Архитектура Measurement Protocol

Measurement Protocol представляет собой HTTP-эндпоинт, принимающий POST-запросы с полезной нагрузкой в формате JSON. Для GA4 основной адрес — https://www.google-analytics.com/mp/collect, валидационный — https://www.google-analytics.com/debug/mp/collect. Запрос состоит из query-параметров measurement_id и api_secret плюс тело с массивом объектов событий.

Каждое событие описывается объектом с полем name и словарём params. Словарь содержит как стандартные параметры GA4 (engagement_time_msec, session_id), так и пользовательские значения. Для идентификации пользователя передаётся client_id — анонимный идентификатор, который приложение генерирует при первом запуске и сохраняет в локальных настройках.

Существенной особенностью протокола является пакетная отправка: до 25 событий объединяются в один запрос. Это снижает энергопотребление на мобильных устройствах и сглаживает задержки при нестабильной сети. В Delphi-проектах пакетирование реализуется через буфер в памяти или локальную базу SQLite, откуда рабочий поток отправляет данные каждые 60 секунд.

Программная отправка событий из кроссплатформенного кода

В стандартной библиотеке Delphi доступны решения для HTTP-запросов разной степени сложности. Каждое из них подходит для интеграции Firebase, но отличается по удобству, кроссплатформенности и поддержке асинхронных вызовов.

Компонент Платформы Асинхронность TLS по умолчанию Размер зависимостей
TNetHTTPClient Все основные Да (BeginExecute) Да Минимальный
Indy (TIdHTTP) Все основные Через потоки Включается вручную Средний
REST Client Components Все основные Да Да Минимальный
ICS (Overbyte) Windows, macOS Да Включается вручную Большой

TNetHTTPClient из System.Net.HttpClient — оптимальный выбор для проектов на FireMonkey. Он работает на всех целевых платформах, корректно взаимодействует с современными сертификатами и предоставляет удобный механизм асинхронных вызовов через OnReceiveData и BeginExecute. Для простых сценариев подходят также REST Client Components из поставки Delphi, однако их настройка JSON-сериализации менее гибкая.

Пример отправки события login:

var
  LClient: TNetHTTPClient;
  LResponse: IHTTPResponse;
  LJSON: TJSONObject;
  LEvents: TJSONArray;
  LEvent: TJSONObject;
begin
  LClient := TNetHTTPClient.Create(nil);
  try
    LJSON := TJSONObject.Create;
    try
      LEvents := TJSONArray.Create;
      LEvent := TJSONObject.Create;
      LEvent.AddPair('name', 'login');
      LEvent.AddPair('params', TJSONObject.Create.AddPair('method', 'email'));
      LEvents.Add(LEvent);
      LJSON.AddPair('client_id', GetClientID);
      LJSON.AddPair('events', LEvents);

      LClient.ContentType := 'application/json';
      LResponse := LClient.Post(
        'https://www.google-analytics.com/mp/collect?measurement_id=G-XXXX&api_secret=Y',
        LJSON.ToJSON,
        nil,
        TStringStream.Create('')
      );
    finally
      LJSON.Free;
    end;
  finally
    LClient.Free;
  end;
end;

Для повышения надёжности в рабочем коде добавляется обработка исключений, повторные попытки при сетевых сбоях и сохранение событий в очередь при отсутствии соединения.

Типы событий и работа с пользовательскими параметрами

GA4 различает автоматически собираемые события (first_open, session_start, app_remove) и пользовательские, которые разработчик определяет самостоятельно. Стандартный набор рекомендуемых событий описан в справке Google и покрывает типовые сценарии: вход в систему, прохождение уровня, совершение покупки. Применение рекомендуемых имён улучшает совместимость с будущими отчётами и упрощает сегментацию аудитории.

Пользовательские параметры позволяют передавать до 25 пар ключ-значение на одно событие. Имена параметров должны соответствовать правилам Google: латиница, цифры, подчёркивание, длина до 40 символов. Значения ограничены 100 символами для строк и 40 байтами для чисел. В Delphi удобно создать справочник констант с именами событий и параметров, что снижает количество опечаток и упрощает рефакторинг.

Для расширения возможностей сегментации применяются свойства пользователя (user_properties). Через них передаются статичные характеристики: тип подписки, уровень приложения, выбранный язык интерфейса. Эти сведения обновляются реже, чем события, и применяются для построения аудиторий в рекламных кампаниях и персонализации контента.

Валидация, обработка ошибок и оптимизация

Перед выходом на реальных пользователей полезно проверять запросы через валидационный эндпоинт https://www.google-analytics.com/debug/mp/collect. Этот адрес возвращает расширенный JSON со списком найденных проблем: неверные имена параметров, превышение допустимого размера, ошибки формата. Интеграция валидации в процесс разработки экономит часы отладки в консоли Firebase.

Типичные ошибки связаны с пропуском обязательных полей, использованием зарезервированных имён и неправильной кодировкой строк. Последняя проблема часто проявляется при ручном формировании JSON: Delphi по умолчанию отдаёт строки в UTF-8, но некоторые HTTP-компоненты перекодируют тело запроса в ISO-8859-1. Решением служит принудительная установка заголовка Content-Type: application/json; charset=utf-8 и проверка содержимого перед отправкой.

Для мобильных платформ важна фоновая отправка. На Android события накапливаются в локальной базе, поток отправки запускается через WorkManager или Foreground Service. На iOS применяется BGTaskScheduler с идентификатором задачи. Такая схема снижает расход батареи и работает при закрытом приложении. При этом соблюдаются ограничения Firebase на одного пользователя: не более 500 событий в день на client_id, что на практике достигается редко.

Дополнительно стоит заранее спроектировать стратегию согласия пользователя. В соответствии с GDPR и аналогичными регламентами аналитика должна отключаться до получения разрешения. В Delphi реализуется флаг в настройках приложения, блокирующий формирование событий и отправку данных. После получения согласия флаг снимается, и накопленные сведения синхронизируются с сервером.