---
metadata:
  - name: generator
    content: Diplodoc Platform v5.55.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/ios/swiftui/adaptive-inline-banner.md
  - https://ads.yandex.com/helpcenter/ru/dev/ios/swiftui/adaptive-inline-banner.md
  - https://ads.yandex.com/helpcenter/zh/dev/ios/swiftui/adaptive-inline-banner.md
  - href: ru/dev/ios/swiftui/adaptive-inline-banner.md
    type: text/markdown
    title: Markdown version
  - href: ../llms.txt
    type: text/markdown
    title: llms.txt
---
> **Documentation Index:** Fetch the complete configuration index at https://ads.yandex.com/helpcenter/ru/llms.txt

[//]: # (Эта страница переводится также на бразильский португальский — pt-BR)

<!--
Используется в Boost: boost/ru/ad-monetization/dev/ios
-->

# Адаптивный inline-баннер (SwiftUI)

<!-- source: ru/dev/_includes/adaptive-inline-banner.md -->
Адаптивный inline-баннер — гибкий формат баннерной рекламы, обеспечивающий максимальную эффективность за счет оптимизации размера рекламы для каждого устройства.
<!-- endsource: ru/dev/_includes/adaptive-inline-banner.md -->

<!-- source: ru/dev/_includes/adaptive-inline-banner.md -->
Данный тип рекламы позволяет разработчикам указывать максимально допустимые ширину и высоту объявления, при этом оптимальный размер рекламы определяется автоматически. Чтобы выбрать лучший размер объявления, встроенные адаптивные баннеры используют максимальную, а не фиксированную высоту. Это позволяет повысить производительность.
<!-- endsource: ru/dev/_includes/adaptive-inline-banner.md -->

Такой формат используется в приложениях-лентах или там, где допустимо сфокусироваться на рекламе.

{% cut "Внешний вид" %}

<img src="https://yastatic.net/s3/doc-binary/src/docs/support/mobile-ads/ru/monetization/_images/banner-inline-ru-ex.png" width="200">

{% endcut %}

Это руководство покажет, как интегрировать адаптивный inline-баннер в iOS-приложение на SwiftUI. В дополнение к примерам кода и инструкции оно содержит рекомендации и ссылки на дополнительные ресурсы.

## Пререквизит {#pre}

<!-- source: ru/dev/_includes/pre-ios.md -->
1. Выполните шаги по интеграции SDK, описанные в [Быстром старте](https://ads.yandex.com/helpcenter/ru/dev/ios/quick-start.md).
2. Заранее [проинициализируйте](https://ads.yandex.com/helpcenter/ru/dev/ios/quick-start.md#init) рекламный SDK.
3. Убедитесь, что используете [последнюю версию Yandex Mobile Ads SDK](https://ads.yandex.com/helpcenter/ru/dev/platforms.md), а в случае использования медиации — актуальную [версию единой сборки](https://ads.yandex.com/helpcenter/ru/dev/platforms.md).
<!-- endsource: ru/dev/_includes/pre-ios.md -->

## Имплементация {#implement}

Основные шаги по интеграции адаптивного inline-баннера в SwiftUI:

1. Создать `BannerState` с размером `BannerSize.inline(width:maxHeight:)` и запросом `AdRequest` с идентификатором рекламного места.
1. Добавить в иерархию `View` `Banner(state:)`, передав этот `BannerState`.
1. Подписаться на события через модификаторы `.onAdLoad`, `.onAdFailure` и при необходимости `.onAdClick`, `.onAdImpression`.
1. Передать [дополнительные настройки](https://ads.yandex.com/helpcenter/ru/dev/ios/target-adfox.md), если вы работаете через систему Adfox (через параметры `AdRequest` внутри `BannerState`).
1. Отобразить рекламу. Загрузка начинается при появлении `Banner` на экране с заданным `BannerState`. После успешной загрузки обновляется высота объявления.

## Особенности подключения адаптивного inline-баннера {#features}

1. Если вы получили ошибку в коллбэке `.onAdFailure`, не пытайтесь загрузить новое объявление снова. Если это необходимо сделать, ограничьте число повторных попыток загрузки рекламы, чтобы избежать неудачных запросов и проблем с подключением.

2. Чтобы адаптивные inline-баннеры работали правильно, задавайте размер через SwiftUI. Используйте `BannerSize.inline(width:maxHeight:)` и ограничения родительского контейнера (ширина, отступы). Фиксация только внешнего `frame` без учета адаптивной высоты может привести к некорректному отображению рекламы.

3. Адаптивные inline-баннеры работают лучше при использовании всей доступной ширины. В большинстве случаев это будет полная ширина экрана используемого устройства. Учитывайте применимые в приложении отступы (padding) и безопасные зоны (safe area) дисплея.

4. Адаптивный inline-баннер предназначен для размещения в прокручиваемом контенте. Баннер может быть такой же высоты, как экран устройства, или ограничен максимальной высотой, в зависимости от API.

5. В SwiftUI для inline-баннера используйте `Banner(state:)` с `BannerState(size: .inline(width:maxHeight:), request:)`. Параметр `width` — доступная ширина контейнера, `maxHeight` — максимально допустимая высота объявления (аналог расчета через `BannerAdSize.inline(withWidth:maxHeight:)` в UIKit).

6. Для одного и того же устройства и переданных параметров размера итоговая область объявления стабильна. После загрузки высота отражается во внутренней верстке `Banner`.

## Создание и отображение баннера

Для отображения баннерной рекламы добавьте в SwiftUI-иерархию `Banner(state:)` и передайте `BannerState` с размером `.inline(width:maxHeight:)` и `AdRequest` с рекламным идентификатором.

Задавайте `width` по ширине экрана или родительского контейнера с учетом отступов и безопасных зон.

Также потребуется идентификатор рекламного места (adUnitId), полученный в интерфейсе Рекламной сети Яндекса.

Пример экрана на SwiftUI:

```swift
import SwiftUI
import YandexMobileAds

struct InlineBannerView: View {
    @State private var bannerState: BannerState?

    var body: some View {
        VStack {
            if let bannerState {
                Banner(state: bannerState)
                    .onAdLoad { _ in
                        // Объявление успешно загружено
                    }
                    .onAdFailure { error in
                        // Ошибка загрузки
                    }
            }

            Button("Загрузить баннер") {
                bannerState = BannerState(
                    size: .inline(width: 320, maxHeight: 320),
                    request: AdRequest(adUnitID: "R-M-XXXXX-YY")
                )
            }
        }
    }
}
```

## Загрузка рекламы

Загрузка начинается, когда `Banner` с заданным `BannerState` появляется в иерархии и при подстановке нового экземпляра `BannerState`: каждый вызов инициализатора `BannerState(size:request:)` создает новое состояние и запускает загрузку.

Для уведомления об успешной или неудачной загрузке, а также для отслеживания кликов и показов, используйте модификаторы:
* `onAdLoad`
* `onAdFailure`
* `onAdClick`
* `onAdImpression`

Расширить параметры запроса за рекламой можно через `AdRequest`. Для этого передайте в запросе данные об интересах пользователя, контекстные данные страницы, локацию или другие дополнительные данные. Контекстные данные могут значительно улучшить качество рекламы. Подробнее читайте в разделе [Таргетирование рекламы](https://ads.yandex.com/helpcenter/ru/dev/ios/target.md).

### Пример

Задать новый `BannerState` для загрузки (после успешной загрузки вызывается `.onAdLoad`):

```swift
struct InlineBannerView: View {
    @State private var bannerState: BannerState?

    func loadAd() {
        bannerState = BannerState(
            size: .inline(width: 320, maxHeight: 320),
            request: AdRequest(adUnitID: "R-M-XXXXX-YY")
        )
    }

    var body: some View {
        VStack {
            if let bannerState {
                Banner(state: bannerState)
                    .onAdLoad { _ in }
                    .onAdFailure { _ in }
            }
            Button("Загрузить", action: loadAd)
        }
    }
}
```

## Отображение рекламы

После успешной загрузки объявление отображается внутри `Banner`. Размер обновляется после получения креатива. Разместите `Banner` в нужном месте ленты или стека, например в `ScrollView` + `VStack` с необходимыми отступами.

```swift
struct InlineBannerView: View {
    @State private var bannerState: BannerState?

    var body: some View {
        ScrollView {
            VStack {
                // Контент ленты
                Text("Контент")

                if let bannerState {
                    Banner(state: bannerState)
                        .onAdLoad { _ in }
                        .onAdFailure { _ in }
                }
            }
            .padding()
        }
    }
}
```

## Тестирование интеграции адаптивного inline-баннера {#test}

### Использование демоблоков для тестирования рекламы

<!-- source: ru/dev/_includes/test-ios-inline-banner.md -->
Для проверки корректной интеграции рекламы и тестирования приложения используйте тестовую рекламу. Для гарантированного возврата тестовых объявлений на каждый запрос за рекламой вы можете использовать специальный демонстрационный идентификатор рекламного места.

Демонстрационный adUnitId: `demo-banner-yandex`.

{% note warning %}

Убедитесь, что перед выкладыванием приложения в магазин вы заменили демонстрационный идентификатор рекламного места на настоящий, полученный в интерфейсе Рекламной сети Яндекса.

{% endnote %}

Список всех доступных демонстрационных идентификаторов рекламного места доступен в разделе [Демоблоки для тестирования](https://ads.yandex.com/helpcenter/ru/dev/ios/demo-blocks.md).
<!-- endsource: ru/dev/_includes/test-ios-inline-banner.md -->

### Проверка корректной интеграции рекламы

<!-- source: ru/dev/_includes/test-integration-ios.md -->
Проверить корректность интеграции рекламы можно через нативный инструмент Console.

Чтобы получить возможность просматривать расширенные логи, необходимо вызвать метод `enableLogging` класса `YandexAds`.

```swift
YandexAds.enableLogging()
```

Для просмотра логов SDK в инструменте Console установите `Subsystem = com.mobile.ads.ads.sdk`. Вы можете фильтровать логи по категории и уровню ошибки.

В случае обнаружения проблем при интеграции рекламы вы увидите подробный отчет о проблемах и рекомендации по их устранению.

<img src= "https://yastatic.net/s3/doc-binary/src/dev/mobile-ads/common/integration-ios-2.png">
<!-- endsource: ru/dev/_includes/test-integration-ios.md -->

## Дополнительные ресурсы {#resources}

* <!-- source: ru/dev/_includes/github-pubdev-links.md -->
  Ссылка на [github](https://github.com/yandexmobile/yandex-ads-sdk-ios/blob/master/Examples/YandexMobileAdsExample/YandexMobileAdsExample/Yandex/Banner/InlineBannerViewController.swift).
  <!-- endsource: ru/dev/_includes/github-pubdev-links.md -->
