Проверка интеграции Flutter SDK

Проверяйте и UI приложения, и фактические запросы/события. Успешная загрузка кампании не подтверждает видимый показ, а завершение вызова события не гарантирует его доставку.

Чеклист перед выпуском

  • В приложении используется gravity_sdk 0.24.1 или совместимый обновлённый релиз; проверена фактическая сборка.
  • initialize() завершён до первого запроса; ключ и секция соответствуют окружению.
  • Android release-манифест разрешает интернет.
  • Просмотры отправляются при открытии экранов, не на каждом build().
  • SKU, категории и lng совпадают с фидом, включая регистр.
  • Кампания опубликована; selector, контекст, аудитория и расписание совпадают с запросом.
  • Обрабатываются FollowUrlEvent с browser/webview, диплинки и запрос push.
  • Login/SignUp содержат CUID с типом или hashedEmail.
  • Выход/смена аккаунта сбрасывает профиль и персонализированный UI; очистка очереди выбрана явно.
  • Исключения resetUser()/restoreUserId() обработаны; ошибка хранилища не считается успешным удалением или восстановлением UID.
  • Headless имеет fallback; JSON проверяется до применения.
  • Ручные показы привязаны к видимости, клики — к действиям; tracking SDK не дублируется.
  • У покупок постоянный уникальный uniqueTransactionId.
  • Проверены офлайн-доставка, перезапуск и блокировка автопоказа.

Диагностика

Симптом Что проверить
SDK сообщает, что не инициализирован Ключ/секция не пусты; initialize() завершён до вызова
Inline-блок не появился Selector, контекст, публикацию, placeholder, наличие товаров в slots
Кампания работает, но на новом товаре старый контент Пересоздать inline с новым Key; для своего запроса проверить его актуальность
In-app не показался Приоритет, задержку, актуальность ответа, presentation lock, тип контента, состояние экрана
Tooltip не показался Совпадение selector якоря и кампании, вызов onReady после layout
Кнопка не открывает ссылку Обработку callback; для webview открыть внутренний экран, для browser — внешний URL
Headless вернул null Наличие кампании, isFetchContentOnTrack, stale timeout, ошибки и очередь
Произвольного поля нет в типизированной модели Читать rawVariables/valueOf<T>(); проверить фактический ключ и JSON-тип
Видимость есть, аналитики нет Наличие events и on-обработчиков в серверном ответе; исходные объекты engagement
Показы завышены Вызовы из build(), повторную обработку callback и return, дубли встроенного tracking
Покупки исчезают без сети Настройки очереди, переполнение/срок хранения, ошибки хранилища, ID заказа
При ручном пользователе неправильный контент Версию SDK: исправление идентификации запросов контента вышло в 0.24.0
После смены аккаунта resetUser()/restoreUserId() завершился ошибкой Отказ локального хранилища; сессия уже сброшена, но операция с UID не завершена
Кампания не открылась после перехода на другой экран В 0.24.1 SDK пропускает запоздалый автопоказ; проверьте экран вызова и диагностический лог

Проверка запросов

На тестовом устройстве включите LogLevel.debug. Сверьте:

  1. Ключ/секцию и адрес SDK API/прокси.
  2. ctx.type, data, location и атрибуты.
  3. Идентификацию между просмотром, событием и запросом контента.
  4. Выбранный контент и переменные кампании.
  5. Tracking URL, которые действительно отправлены после видимости/клика.
  6. Событие покупки/формы на стороне Gravity Field.

До отправки логов в поддержку удалите ключи и пользовательские данные.

HTTP-логи доступны только в debug-сборке. Authorization скрыт, но тела запросов/ответов могут содержать пользовательские данные. Состав автоматических отчётов об ошибках отличается от состава этих логов.

Сценарии собственной отрисовки

Сценарий Ожидаемый результат
Ответ пустой Рабочий fallback; без фиктивного показа варианта
JSON имеет неверный тип или неизвестное действие Fallback, без выполнения команды
Пользователь ушёл до ответа Нет обновления размонтированного состояния
Товар изменился до ответа Предыдущий ответ не заменяет новый UI
Повторное построение/прокрутка Нет повторной загрузки или дублирующего visible impression
Два реальных клика Два клика, если сервер предоставил tracking
Смена аккаунта UI загружается заново для текущего пользователя

В A/B и BDUI приведены скачиваемые примеры с этими проверками.

Сценарии очереди и блокировки

  • Отключить сеть, отправить событие, перезапустить приложение: запись сохраняется до доставки, очистки или истечения срока.
  • Восстановить сеть и вызвать flushQueue(): проверить очередь и фактическое событие с исходным временем.
  • Сменить аккаунт до доставки: прежнее событие не должно приписаться новому пользователю.
  • Выполнить clearQueue(): ожидающие события не должны появиться снова после перезапуска.
  • Заблокировать автопоказ, отправить просмотр: UI не появляется; запрос контента может выполняться.
  • Снять блокировку: пропущенная кампания не показывается автоматически задним числом.
  • Проверить tooltip отдельно: presentation lock не блокирует этот путь.
  • Отправить форму офлайн: UI может перейти к следующему действию до доставки результата.
  • Очистить очередь во время ожидания сессии или паузы перед повторной отправкой: после успешного clearQueue() прежнее событие не должно отправиться.
  • Сменить аккаунт или открыть новый маршрут во время загрузки in-app: прежняя кампания не открывается; проверьте также вложенный Navigator.
  • Сменить пользователя во время загрузки inline/tooltip: SDK запрашивает данные для нового пользователя. Уже загруженные блоки пересоздаются приложением.

Обновление с прежних версий

При переходе с 0.24.0 на 0.24.1 проверьте:

  • точную зависимость gravity_sdk: 0.24.1 и сборку на выбранной версии Flutter; исправлена совместимость с Flutter 3.38–3.41, минимальные требования пакета прежние;
  • обработку ошибок локального хранилища у resetUser() и restoreUserId();
  • привязку события к исходному пользователю при смене аккаунта во время подготовки запроса;
  • очистку очереди во время ожидания сессии, записи личности и повторных попыток;
  • отказ от запоздалого автопоказа после смены пользователя/экрана, включая вложенную навигацию;
  • повторную загрузку inline/tooltip для нового пользователя, если смена произошла во время запроса;
  • логирование и состав телеметрии.

При обновлении с более ранних версий также проверьте:

  • новую идентификацию контентных запросов после setUser();
  • наличие включённой по умолчанию очереди и выбранную политику выхода;
  • customProps/eventTime и ID покупок;
  • обработку headless-ответа: модель в GravityDataResponse.data, исходный JSON в GravityDataResponse.json;
  • доступ к rawVariables и ContentClickEngagement;
  • блокировку и актуальность автопоказа.

История релизов: changelog 0.24.1. Полные сигнатуры: Справочник API.