---
metadata:
  - name: generator
    content: Diplodoc Platform v5.52.0
alternate:
  - https://ads.yandex.com/helpcenter/en/dev/ios/adaptive-sticky-banner.md
  - https://ads.yandex.com/helpcenter/ru/dev/ios/adaptive-sticky-banner.md
  - https://ads.yandex.com/helpcenter/zh/dev/ios/adaptive-sticky-banner.md
  - href: ru/dev/ios/adaptive-sticky-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

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

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

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

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


## Пререквизит {#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}

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

- Создать экземпляр класса BannerAdView.
- Реализовать необходимые методы делегата.
- Загрузить рекламу.
- Передать [дополнительные настройки](https://ads.yandex.com/helpcenter/ru/dev/ios/target-adfox.md), если вы работаете через систему Adfox.
- Отобразить рекламу, получив рекламное объявление в методе делегата.

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

1. Все вызовы методов Yandex Mobile Ads SDK необходимо выполнять из главного потока.

2. Попытка загрузить новое объявление при получении ошибки в методе делегата `func bannerAdViewDidFailLoading(_ bannerAdView: BannerAdView, error: Error)`  настоятельно не рекомендуется. Если вам необходимо загрузить объявление из `func bannerAdViewDidFailLoading(_ bannerAdView: BannerAdView, error: Error)`, ограничьте повторные попытки загрузки рекламы, чтобы избежать постоянных неудачных запросов за рекламой в случае ограничений подключения к сети.

3. Чтобы адаптивные sticky-баннеры работали правильно, используйте [Auto Layout](https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/AnatomyofaConstraint.html). Установление размеров вью с помощью фиксированных размеров frame может привести к некорректному отображению рекламы.

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

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

6. Для получения размера рекламного объявления, воспользуйтесь методом `BannerAdSize.sticky(containerWidth: CGFloat)`, принимающим в качестве аргумента доступную ширину рекламного контейнера.

7. Объект `BannerAdSize`, рассчитанный с помощью метода `BannerAdSize.sticky(containerWidth: CGFloat)` содержит постоянные значения ширины и высоты рекламы для одного и того же устройства. Протестировав макет своего приложения на конкретном устройстве, вы можете быть уверены, что размер объявления не изменится.

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

## Создание экземпляра класса BannerAdView

Для отображения баннерной рекламы необходимо создать экземпляр класса `BannerAdView`, передав в него размер рекламы. Также необходимо определить delegate для `BannerAdView`, реализовав протокол `BannerAdViewDelegate` для вашего класса.

Расчет рекламы для устройства происходит при помощи метода SDK `BannerAdSize.sticky(containerWidth:)`. В качестве аргумента необходимо передать максимально допустимую ширину рекламного контейнера. Рекомендуем использовать всю ширину экрана устройства или ширину родительского контейнера. Обязательно учитывайте применимые в приложении отступы (padding) и безопасные зоны (safe area) дисплея.

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

Пример создания экземпляра `BannerAdView` во View Controller:

```swift
final class StickyBannerViewController: UIViewController {
        private lazy var bannerAdView: BannerAdView = {
        let width = view.safeAreaLayoutGuide.layoutFrame.width
        let adSize = BannerAdSize.sticky(containerWidth: width)

        let bannerAdView = BannerAdView(adSize: adSize)
        bannerAdView.delegate = self
        bannerAdView.translatesAutoresizingMaskIntoConstraints = false
        return bannerAdView
    }()
}

extension StickyBannerViewController: BannerAdViewDelegate {
    func bannerAdViewDidLoad(_ bannerAdView: BannerAdView) {
        // Объявление успешно загружено
    }

    func bannerAdViewDidFailLoading(_ bannerAdView: BannerAdView, error: Error) {
        // Ошибка загрузки
    }
}
```

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

После создания `BannerAdView`, рекламу необходимо загрузить.

Для уведомления об успешной или неудачной загрузке рекламы, а также для отслеживания событий жизненного цикла адаптивного sticky-баннера, объекту класса `BannerAdView` необходимо установить свойства делегата и реализовать протокол `BannerAdViewDelegate`.

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

В следующем примере показано, как загрузить адаптивный sticky-баннер. После успешной загрузки, вызовется метод `func bannerAdViewDidLoad(_ bannerAdView: BannerAdView)` делегата `BannerAdViewDelegate`:

```swift
final class StickyBannerViewController: UIViewController {
    private lazy var bannerAdView: BannerAdView = {
        let width = view.safeAreaLayoutGuide.layoutFrame.width
        let adSize = BannerAdSize.sticky(containerWidth: width)

        let bannerAdView = BannerAdView(adSize: adSize)
        bannerAdView.delegate = self
        bannerAdView.translatesAutoresizingMaskIntoConstraints = false
        return bannerAdView
    }()

    func loadAd() {
        let request = AdRequest(adUnitID: "R-M-XXXXX-YY")
        bannerAdView.loadAd(with: request)
    }
}
```

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

После успешной загрузки рекламы необходимо ее отобразить. Сделать это можно двумя способами:

{% list tabs %}

- С помощью autolayout constraints

  Добавьте adView, полученный в методе делегата в ваш контейнер. Затем добавьте autolayout constraints, чтобы баннер отображался в нужном месте.

  ```swift
  final class StickyBannerViewController: UIViewController {
    private lazy var bannerAdView: BannerAdView = {
        let width = view.safeAreaLayoutGuide.layoutFrame.width
        let adSize = BannerAdSize.sticky(containerWidth: width)

        let bannerAdView = BannerAdView(adSize: adSize)
        bannerAdView.delegate = self
        bannerAdView.translatesAutoresizingMaskIntoConstraints = false
        return bannerAdView
    }()

    func showAd() {
        view.addSubview(adView)
        NSLayoutConstraint.activate([
            adView.topAnchor.constraint(equalTo: loadButton.bottomAnchor, constant: 100),
            adView.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
    }
  }
  ```

- С помощью методов SDK displayAtTop(in:) и displayAtBottom(in:)

  Баннеры будут добавлены поверх всех вью контроллера, центрироваться по горизонтали и располагаться вверху контроллера, или внизу, соответственно.

  ```swift
  final class StickyBannerViewController: UIViewController {
    private lazy var bannerAdView: BannerAdView = {
        let width = view.safeAreaLayoutGuide.layoutFrame.width
        let adSize = BannerAdSize.sticky(containerWidth: width)

        let bannerAdView = BannerAdView(adSize: adSize)
        bannerAdView.delegate = self
        bannerAdView.translatesAutoresizingMaskIntoConstraints = false
        return bannerAdView
    }()

    func showAd() {
        bannerAdView.displayAdBottom(in: view)
    }
  }
  ```

{% endlist %}

## Тестирование интеграции адаптивного sticky-баннера {#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/StickyBannerViewController.swift).
  <!-- endsource: ru/dev/_includes/github-pubdev-links.md -->
