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

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

1. SDK инициализирован до первого обращения; API key и section относятся к нужному проекту.
2. Просмотр отправляется при открытии экрана, событие — после фактического действия.
3. SKU, категории и lng совпадают с товарным фидом, включая регистр.
4. LoginEvent связывает профиль по согласованному CUID; ограничения setUser учтены.
5. In-app кампания опубликована, UI доступен, presentation lock снята.
6. Inline selector совпадает с кампанией; блок получает место в вёрстке и ProductViewBuilder для товаров.
7. Навигация по URL/deeplink обработана, tracking встроенного UI не дублируется.
8. Проверены ошибка сети, пустой ответ и возврат на экран; UI приложения сохраняет работоспособность.

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

На время диагностики включите `.debug`. Проверьте sec, user, ctx, selector и содержимое ответа. Полный debug-лог содержит Authorization и данные запросов; используйте его только для отладки. [Настройка логирования](./configuration.md#логирование-sdk).

## Вызов SDK до `GravitySDK.initialize(...)`

Если публичный метод SDK вызван до `GravitySDK.initialize(...)`, приложение не падает. SDK игнорирует вызов и пишет error-лог:

```text
called before GravitySDK.initialize() — call ignored
```

Что делать:

1. Инициализируйте SDK на раннем этапе старта приложения.
2. Проверьте порядок вызовов по логам SDK или через `setLogListener(...)`.

## Кампании не показываются после `trackView(...)` или `triggerEvent(...)`

Проверьте:

1. корректность `apiKey` и `section`;
2. корректность [`PageContext`](./events.md#pagecontext);
3. наличие доступного `UIViewController` для показа;
4. активность кампаний в Gravity Field для этого контекста.

## `getContentBySelector(...)` возвращает пустой `data`

Проверьте:

1. верный `selector`;
2. активность кампании;
3. соответствие [`PageContext`](./events.md#pagecontext) условиям таргетинга;
4. сетевые ограничения и `proxyUrl`, если он используется.
5. SDK-логи через `logLevel: .debug` или `setLogListener(...)`, если метод вернул `nil`.

## Почему кнопка с URL или deeplink внутри in-app ничего не делает?

Скорее всего, в приложении не обработаны `FollowUrlEvent` или `FollowDeeplinkEvent` в `gravityEventCallback`. iOS SDK передает эти события в callback, но сам переход не выполняет.

## Почему inline-кампания не отображается автоматически?

Проверьте `selector`, соответствие [`PageContext`](./events.md#pagecontext) условиям таргетинга, активность кампании и наличие контента в response. Для `GravityInlineView` дополнительно проверьте constraints, высоту ячейки/контейнера и то, что `initialize(pageContext:)` был вызван после установки `selector`.

## Почему не получается вручную отправить content/product engagement?

Проверьте, что вы используете публичные типы `ContentEngagement` / `ProductEngagement` и передаете в них корректные `content`, `campaign` и `slot` из ответа `getContentBySelector(...)`. Для content click отдельного публичного типа в iOS SDK сейчас нет.

## Можно ли использовать `pageNumber` и `referrer` для таргетинга?

`pageNumber` и `referrer` передаются в запросах. Для проверки конкретного правила таргетинга сопоставьте `ctx` в debug-логе с настройками кампании.

## После обновления SDK

Сопоставьте установленную версию со [справочником API](./api_reference.md), повторно проверьте события, выбор контента, navigation callbacks и показ рекомендаций. Полная интеграционная проверка требует реальной кампании и устройства/эмулятора.
