---
metadata:
  - name: generator
    content: Diplodoc Platform v5.57.4
alternate:
  - https://boost.yandex.com/doc/en/ad-monetization/dev/ios/swiftui/adaptive-sticky-banner.md
  - https://boost.yandex.com/doc/ru/ad-monetization/dev/ios/swiftui/adaptive-sticky-banner.md
  - href: https://boost.yandex.com/doc/ru/ad-monetization/dev/ios/swiftui/adaptive-sticky-banner.md
    type: text/markdown
    title: Markdown version
  - href: https://boost.yandex.com/doc/ru/ad-monetization/dev/ios/llms.txt
    rel: describedby
---
> **Documentation Index:** Fetch the complete configuration index at https://boost.yandex.com/doc/ru/llms.txt

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

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

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

<!-- source: ru/ad-monetization/dev/_includes/adaptive-sticky-banner.md -->
Адаптивный sticky-баннер — небольшое, автоматически обновляемое рекламное объявление. Оно располагается в нижней или верхней части экрана приложения. Баннер не перекрывает основной контент и часто используется в приложениях-играх.
<!-- endsource: ru/ad-monetization/dev/_includes/adaptive-sticky-banner.md -->

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

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

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

{% endcut %}

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

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

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

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

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

1. Создать `BannerState` с размером `BannerSize.sticky(width:)` (по умолчанию ширина берется из контейнера) и запросом `AdRequest` с идентификатором рекламного места.
1. Добавить в иерархию `View` `Banner(state:)`, передав этот `BannerState`.
1. Подписаться на события через модификаторы `.onAdLoad`, `.onAdFailure` и при необходимости `.onAdClick`, `.onAdImpression`.
1. Передать [дополнительные настройки](https://boost.yandex.com/doc/ru/ad-monetization/dev/ios/target-adfox.md), если вы работаете через систему Adfox (через параметры `AdRequest` внутри `BannerState`).
1. Разместить баннер в нужной области экрана средствами SwiftUI (например, внизу `VStack`, через `safeAreaInset`, `overlay`).

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

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

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

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

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

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

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

7. Высота адаптивного sticky-баннера не менее 50 dp, но не превышает 15% высоты экрана.

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

Для отображения баннерной рекламы добавьте `Banner(state:)` и передайте `BannerState` с размером `.sticky(...)` и `AdRequest`.

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

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

```swift
import SwiftUI
import YandexMobileAds

struct StickyBannerView: 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: .sticky(),
                    request: AdRequest(adUnitID: "R-M-XXXXX-YY")
                )
            }
        }
    }
}
```

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

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

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

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

### Пример иницииации загрузки адаптивного sticky-баннера

После успешной загрузки вызывается `.onAdLoad`:

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

    func loadAd() {
        bannerState = BannerState(
            size: .sticky(),
            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` в нужном месте интерфейса. Например:

- **Фиксированное положение в макете** — `VStack` с баннером внизу или вверху, с `Spacer()` для прижатия к краю.
- **Инструменты SwiftUI** — `safeAreaInset(edge: .bottom)`, `overlay(alignment:)`.

В UIKit для баннера доступны методы `displayAtTop(in:)` и `displayAtBottom(in:)` у нативного `View` В SwiftUI аналогичное поведение обеспечивается размещением `Banner` в иерархии (например, баннер внизу корневого `ZStack` или `VStack` поверх контента).

### Пример

Баннер внизу экрана поверх контента:

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

    var body: some View {
        ZStack(alignment: .bottom) {
            ScrollView {
                Text("Контент")
            }
            if let bannerState {
                Banner(state: bannerState)
                    .onAdLoad { _ in }
                    .onAdFailure { _ in }
            }
        }
    }
}
```

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

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

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

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

{% note warning %}

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

{% endnote %}

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

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

<!-- source: ru/ad-monetization/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/ad-monetization/dev/_includes/test-integration-ios.md -->

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

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