Интеграция InStream API
InStream API — расширенный API для настройки, управления загрузкой и воспроизведением InStream-рекламы. Позволяет поддержать проигрывание всех типов рекламных вставок, а также использовать свою реализацию плеера. InStream-реклама состоит из рекламных вставок, которые проигрываются автоматически и вручную.
Для автоматического проигрывания вставок с типом Pre-roll, Mid-roll, Post-roll используется InstreamAdBinder API. Для ручного запуска рекламных вставок используется InstreamAdBreak API.
Примечание
Доступно одновременное использование InstreamAdBinder API и InstreamAdBreak API при соблюдении определенных условий:
- Используйте разные инстансы рекламного плеера.
- Не запускайте InstreamAdBreak API для воспроизведения, если через InStreamAdBinder API было приостановлено основное видео.
- Из
InstreamAdдля InstreamAdBreak API используйте вставки типаInstreamAdBreakType.inrollилиInstreamAdBreakType.pauseroll— остальные типы InstreamAdBinder отрисует самостоятельно.
Требования к приложению
- Используйте Xcode 16.4 или выше.
Принципы работы
Загруженный объект InStream-рекламы содержит в себе расписание показа рекламных вставок. Каждая рекламная вставка описывается объектом InstreamAdBreak. Рекламная вставка может иметь один из следующих типов: Pre / Mid / Post / In / Pause-roll. Показать Pre / Mid / Post-Roll вставки можно через InstreamAdBinder API. Показать вставки вручную, в том числе Pause-roll и In-roll, можно через InstreamAdBreak API.
Для взаимодействия с основным видеоконтентом используется протокол VideoPlayer, а для воспроизведения рекламного видео внутри рекламной вставки — протокол InstreamAdPlayer.
InstreamAdBinder отслеживает ход воспроизведения основного видео и автоматически показывает рекламные вставки на основе расписания рекламных вставок из видеоресурса в интерфейсе Рекламной сети Яндекса.
InstreamAdBinder не управляет непосредственно отрисовкой рекламного видео в PlayerView. Воспроизводить рекламное видео необходимо со стороны приложения основываясь на сигналах от интерфейсов плееров, переданных в InstreamAdBinder. InstreamAdBinder сообщает о начале проигрывания рекламной вставки через вызов VideoPlayer.pauseVideo() и об окончании проигрывания рекламной вставки через вызов VideoPlayer.resumeVideo().
В момент вызова VideoPlayer.pauseVideo() со стороны приложения необходимо скрыть контролы управления основным видео, приостановить основное видео и начать воспроизведение рекламного видео. Со стороны рекламного SDK после вызова метода будут показаны рекламные контролы внутри контейнера InstreamAdView и будет вызван метод InstreamAdPlayer.playAd() для старта воспроизведения рекламного видео.
В момент вызова VideoPlayer.resumeVideo() со стороны приложения необходимо вернуть контролы управления основным видео и продолжить воспроизведение основного видео. Со стороны рекламного SDK до вызова метода будут убраны рекламные контролы внутри контейнера InstreamAdView.
InstreamAdBreak API не управляет непосредственно отрисовкой рекламного видео в PlayerView. Воспроизводить рекламное видео необходимо со стороны приложения основываясь на сигналах от интерфейсов плееров, переданных в InstreamAdBreak. InstreamAdBreak сообщает о начале проигрывания рекламной вставки через вызов InstreamAdBreakDelegate.instreamAdBreakDidStart() и об окончании проигрывания рекламной вставки через вызов InstreamAdBreakDelegate.instreamAdBreakDidComplete() или InstreamAdBreakDelegate.instreamAdBreakDidError().
В момент вызова InstreamAdBreakDelegate.instreamAdBreakDidStart() со стороны приложения необходимо скрыть контролы управления основным видео, приостановить основное видео. Со стороны рекламного SDK после вызова метода будут показаны рекламные контролы внутри контейнера InstreamAdView и будет вызван метод InstreamAdPlayer.playAd() для старта воспроизведения рекламного видео.
В момент вызова InstreamAdBreakDelegate.instreamAdBreakDidComplete() или InstreamAdBreakDelegate.instreamAdBreakDidError() со стороны приложения необходимо вернуть контролы управления основным видео и продолжить воспроизведение основного видео. Со стороны рекламного SDK до вызова методов будут убраны рекламные контролы из контейнера InstreamAdView.
Загрузка рекламных объявлений
-
Создайте экземпляр класса
InstreamAdLoaderдля получения InStream-рекламы. -
Создайте конфигурацию запроса с помощью класса
InstreamAdRequestConfiguration. В качестве параметров запроса передайте идентификатор страницы (Page ID) из интерфейса Рекламной сети Яндекса. -
Загрузите рекламу с помощью метода
loadInstreamAd(configuration:completion:).
Для тестирования корректности интеграции используйте демонстрационный Page ID: demo-instream-vmap-yandex.
let adLoader = InstreamAdLoader()
let configuration = InstreamAdRequestConfiguration(pageID: PAGE_ID)
do {
let ad = try await adLoader.loadInstreamAd(configuration: configuration)
// Используйте загруженный объект InstreamAd
} catch {
// Ошибка загрузки
}
let adLoader = InstreamAdLoader()
let configuration = InstreamAdRequestConfiguration(pageID: PAGE_ID)
adLoader.loadInstreamAd(configuration: configuration) { result in
switch result {
case .success(let ad):
// Используйте загруженный объект InstreamAd
break
case .failure(let info):
// Ошибка загрузки: info.reason
break
}
}
Показ рекламных объявлений
-
Реализуйте интерфейсы
InstreamAdPlayerиVideoPlayer.В справочнике приведена подробная информация по работе методов и их реализации. Дополнительно рекомендуется ориентироваться на тестовый пример реализации.
Совет
Для упрощения реализации, рекомендуется использовать разные инстансы плееров для воспроизведения рекламы и контентного видео.
-
Добавьте в иерархию View приложения InstreamAdView. InstreamAdView должна содержать в себе PlayerView, в которой будут проигрываться рекламные ролики.
Важно
Размер контейнера должен быть не меньше 300dp x 160dp.
-
Создайте объект InstreamAdBinder: передайте в конструктор объект загруженной рекламы
InstreamAdи реализации плееровInstreamAdPlayer,VideoPlayer.Настройте получение уведомлений о ходе воспроизведения рекламы (готовность к проигрыванию видеорекламы, завершение воспроизведения или ошибка в процессе воспроизведения): установите делегат, который удовлетворяет протоколу
InstreamAdBinderDelegate.adBinder = InstreamAdBinder(ad: ad, adPlayer: adPlayer, videoPlayer: contentPlayer) adBinder.delegate = self -
Для ускорения старта рекламной вставки с типом Pre-roll, заранее предзагрузите ее через вызов метода
InstreamAdBinder.prepareAd().func preparePrerollAd(adBinder: InstreamAdBinder) { adBinder.delegate = self adBinder.prepareAd() } extension InstreamViewController: InstreamAdBinderDelegate { func instreamAdBinder(_ binder: InstreamAdBinder, didPrepare instreamAd: InstreamAd) { addInstreamAdBinderToPreloadedAdQueue(binder) } //... } -
Вызовите метод
InstreamAdBinder.bind(with adView: InstreamAdView)у созданного объекта InstreamAdBinder. В качестве параметра передайтеInstreamAdView, ранее добавленную в иерархию. После этого InStream SDK начнет автоматически отслеживать прогресс воспроизведения основного видео и возьмет на себя управление проигрыванием рекламных роликов.adBinder.bind(with: instreamAdView) -
При реализации проигрывания InStream-рекламы в списке, необходимо использовать метод
InStreamBinder.unbind()при инвалидации ячейки с рекламой в списке. При реализации переиспользуемого пула плееров для скролла, необходимо вызыватьInstreamAdbinder.invalidateAdPlayer()при переиспользовании плеера рекламы привязанного к InstreamAdBinder, а при переиспользовании плеера основного контентаInstreamAdBinder.invalidateVideoPlayer(). -
При остановке использования InStreamAdBinder необходимо очищать состояние.
deinit { adBinder.unbind() adBinder.invalidateVideoPlayer() adBinder.invalidateAdPlayer() }
Примечание
Показ любой рекламной вставки настраивается по аналогии с In-roll. Для этого при фильтрации вставок замените InstreamAdBreakType.inroll на нужный тип, например InstreamAdBreakType.pauseroll.
-
Реализуйте интерфейс InstreamAdPlayer.
В справочнике приведена подробная информация по работе методов и их реализации. Дополнительно рекомендуется ориентироваться на тестовый пример реализации.
Совет
Для упрощения реализации, рекомендуется использовать разные инстансы плееров для воспроизведения рекламы и контентного видео.
-
Добавьте в иерархию View приложения InstreamAdView. InstreamAdView должна содержать в себе PlayerView, в которой будут проигрываться рекламные ролики.
Важно
Размер контейнера должен быть не меньше 300dp x 160dp.
-
Загрузите через InstreamAdLoader объект InstreamAd с помощью идентификатора страницы (
Page ID) из интерфейса Рекламной сети Яндекса. -
InstreamAd содержит в себе набор рекламных вставок разных типов в свойстве
adBreaks. Чтобы получить рекламные вставки In-roll, отфильтруйте массив по типуInstreamAdBreakType.inroll. Вставки возвращаются в порядке, предназначенном для показа.adLoader.loadInstreamAd(configuration: configuration) { result in if case .success(let ad) = result { inrollQueue = ad.adBreaks.filter { $0.adBreakData.type == InstreamAdBreakType.inroll } } } -
Чтобы запустить полученный объект In-roll, необходимо его подготовить. Без подготовки In-roll не запустится. Для отслеживания окончания подготовки установите делегат
InstreamAdBreakDelegate, вызовитеInstreamAdBreak.prepare(with: adPlayer), и передайте в него инстанс созданной реализации InstreamAdPlayer.private func prepareNextAd() { guard !inrollQueue.isEmpty else { return } currentAdBreak = inrollQueue.removeFirst() currentAdBreak?.delegate = self currentAdBreak?.prepare(with: adPlayer) } -
По окончанию подготовки In-roll будет вызван
InstreamAdBreakDelegate.instreamAdBreakDidPrepare(). Подготовленный In-roll готов к показу.Совет
Показывайте объявления в порядке их получения из
adBreaks. Показ вставок в другом порядке может снизить монетизацию вашего приложения. -
Чтобы показать подготовленную вставку, вызовите
InstreamAdBreak.play(with: adView)и передайте в качестве параметра InstreamAdView, ранее добавленный в иерархию view.func instreamAdBreakDidPrepare(_ adBreak: InstreamAdBreak) { currentAdBreak?.play(with: instreamAdView) } -
После начала проигрывания рекламной вставки, будет вызван метод
InstreamAdBreakDelegate.instreamAdBreakDidStart(). По вызову этого метода необходимо поставить на паузу проигрывание основного видео и скрыть контролы управления основного видео.func instreamAdBreakDidStart(_ adBreak: InstreamAdBreak) { contentVideoPlayer?.pauseVideo() } -
После проигрывания рекламной вставки необходимо продолжить воспроизведение основного видео. Проигрывание рекламной вставки может завершиться успешно или с ошибкой, эти две ситуации необходимо обрабатывать.
func instreamAdBreakDidComplete(_ adBreak: InstreamAdBreak) { handleAdBreakCompleted() } func instreamAdBreakDidError(_ adBreak: InstreamAdBreak) { handleAdBreakCompleted() } private func handleAdBreakCompleted() { currentAdBreak = nil contentVideoPlayer?.resumeVideo() } -
После завершения проигрывания текущей вставки подготовьте следующую из очереди.
private func prepareNextAd() { guard !inrollQueue.isEmpty else { return } currentAdBreak = inrollQueue.removeFirst() currentAdBreak?.delegate = self currentAdBreak?.prepare(with: adPlayer) } -
При остановке использования In-roll необходимо очищать его состояние.
deinit { currentAdBreak?.invalidate() }