Это SDK - удобный инструмент монетизации приложений, совмещающий в себе рекламные объявления из аукциона стандарта OpenRTB (SSP Buzzoola) и другие рекламные сети (Яндекс и ВК). С помощью этого SDK можно отразить в своем приложении несколько форматов рекламных объявлений, таких как:
- Баннерная реклама - небольшое рекламное объявление с заданными размерами с возможностью автообновления;
- Нативная реклама - формат рекламы, внешний вид которой задается на стороне приложения;
- Полноэкранная реклама - формат рекламы, отражающейся на весь экран с видео или с картинкой;
- Реклама с вознаграждением - полноэкранный формат, за просмотр которого пользователь получает вознаграждение;
- Instream реклама - формат видеорекламы, в котором рекламный ролик встраивается в видеопоток и проигрывается по заданному сценарию: перед основным видео, в середине или в конце.
- AppOpenAd реклама - формат всплывающей рекламы с видео или с картинкой, отражается только портретно. Используется при открытии приложения или межстранично.
Версия: 4.3.0
- iOS 13.0+
Сейчас есть возможность подключить SDK с помощью SPM и CocoaPods.
Варианты установки:
- Чтобы добавить библиотеку в проект c рекламой Buzzoola, ВК и Яндекс, добавьте в свой Podfile:
pod 'BuzzoolaAdsSDK', '4.3.0'
pod 'BuzzoolaAdsSDKYandex', '4.3.0'- Если вы хотите использовать рекламу Buzzoola и ВК:
pod 'BuzzoolaAdsSDK', '4.3.0'- Если вы хотите использовать только рекламу Buzzoola:
pod 'BuzzoolaAdsSDK/BuzzoolaAdsSDK', '4.3.0'Для корректной работы так же обязательно указать в Podfile:
install! 'cocoapods', :disable_input_output_paths => true # для отсутствия конфликтов с Assets
source 'https://github.com/Buzzoola/buzzoola-ads-sdk' # ссылка на спецификацию BuzzoolaAdsSDK
source 'https://github.com/CocoaPods/Specs.git' # ссылка на общие спецификацииВыберите File — Add Packages Dependencies. В поиск добавьте URL проекта, проверьте, что выбрана последняя версия 4.3.0 или задайте ее вручную, а после нажмите Add Package.
Ссылка на внешний репозиторий:
https://github.com/Buzzoola/buzzoola-ads-sdkSDK имеет в себе три подмодуля.
-
Если вы хотите использовать только рекламу Buzzoola: подключите в свой проект модуль BuzzoolaAdsSDK.
-
Если вы хотите использовать рекламу Buzzoola и ВК: подключите в свой проект модуль BuzzoolaAdsSDK и BuzzoolaAdsSDKMyTarget.
-
Если вы хотите использовать рекламу Buzzoola, ВК и Яндекс: подключите в свой проект модуль BuzzoolaAdsSDK, BuzzoolaAdsSDKMyTarget и BuzzoolaAdsSDKYandex.
Принцип работы зависит от выбранного формата рекламы.
- Баннерная реклама - необходимо создать вью нужного класса, разместить его в своей верстке, загрузить рекламу, и SDK наполнит это вью нужным содержимым;
- Нативная реклама - необходимо сверстать вью с множеством компонентов (текст, картинки, вью), связать компоненты, загрузить рекламу, и SDK наполнит это вью нужным содержимым;
- Полноэкранная реклама, реклама с вознаграждением и AppOpenAd реклама - размещается на отдельном вью контроллере модально на весь экран, необходимо лишь передать нужному методу свой вью контроллер, поверх которого отразится данная реклама;
- Instream реклама - необходимо сверстать плеер, на котором будет показано рекламное видео, связать компоненты, разместить поверх вашего плеера и регулировать видимость, следуя необходимой логике.
Перед использованием обязательно выполнить инициализацию SDK. В этот момент осуществляется запрос доступа к рекламному идентификатору и всплывает системное уведомление пользователю вашего приложения. В своем Info.plist не забудьте добавить ключ NSUserTrackingUsageDescription и описать для чего вы будете использовать отслеживание. Если вы подключаете Яндекс, то необходимо в Info.plist так же указать в массиве SKAdNetworkItems элемент SKAdNetworkIdentifier со значением zq492l623r.skadnetwork, это требование SDK Яндекса, более подробно - https://ads.yandex.com/helpcenter/ru/dev/ios/quick-start#skad.
Предпочтительно размещать инициализацию в AppDelegate, чтобы точно гарантировать работу SDK. Без инициализации вызов методов SDK не имеет смысла.
Ads().configure {
// SDK was initialized.
}Для проверки интеграции можно включить режим отладки. Для этого необходимо вызвать:
Ads().enableLogging(true)Логи успешной интеграции отображаются в консоли с указанием [Ads SDK]. В случае ошибки при интеграции - в логах появится сообщение.
Для показа рекламного объявления во всех форматах всегда изначально создается экземпляр класса AdsRequest - набор полей с вашим уникальным placementID и необходимыми параметрами для подбора удовлетворяющих запросу реклам.
class AdsRequest| Название поля | Тип поля | Обязательность | Описание |
|---|---|---|---|
| placementID | Int | Да | ваш уникальный placementID |
| width | Int(?) | Для формата баннер | максимально допустимая ширина баннера |
| height | Int(?) | Для формата баннер | максимально допустимая высота баннера |
| latitude | Double? | Нет | широта |
| longitude | Double? | Нет | долгота |
| gender | Gender? | Нет | пол male/female, влияет только на рекламу Яндекс или ВК |
| age | Int? | Нет | возраст, влияет только на рекламу Яндекс или ВК |
| extensions | [String : Any]? | Нет | словарь ключ-значение для любых дополнительных параметров |
| isDarkTheme | Bool? | Нет | тема рекламы, по умолчанию будет светлая |
Данный формат рекламы позволяет указывать максимально допустимые ширину и высоту рекламного объявления, которое вы желаете получить.
var bannerView = BannerAdView()let request = AdsRequest(placementID: placementID, width: width, height: height)Если подобранный баннер будет меньшего размера, то он расположится в центре родительской вью.
class ViewController: UIViewController {
...
var bannerView = BannerAdView() # вью рекламного объявления
...
func viewDidLoad {
let request = AdsRequest(placementID: placementID, width: width, height: height) # запрос для получение рекламы
bannerView.loadAd(request: request) # вызов метода загрузки рекламы
}
}extension ViewController: BannerAdEventProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — banner: BannerAdView — баннер, для которого произошло событие
func onAdLoaded(_ banner: BannerAdView) {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# — data: String? — дополнительная информация, присутствует для реклам Яндекса
# — banner: BannerAdView — баннер, для которого произошло событие
func onImpression(_ banner: BannerAdView, data: String?) {}
# Метод для обработки кликов по рекламному объявлению
# Параметры:
# — banner: BannerAdView — баннер, для которого произошло событие
func onAdClicked(_ banner: BannerAdView) {}
# Метод для обработки выходов из приложения
# Работает только для реклам Buzzoola и ВК!
# Параметры:
# — banner: BannerAdView — баннер, для которого произошло событие
func onLeftApplication(_ banner: BannerAdView) {}
# Метод для обработки возврата в приложение
# Работает только для реклам Buzzoola и ВК!
# Параметры:
# — banner: BannerAdView — баннер, для которого произошло событие
func onReturnedToApplication(_ banner: BannerAdView) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — banner: BannerAdView — баннер, для которого произошло событие
# — adError: AdError - ошибка получения рекламы
func onAdFailed(_ banner: BannerAdView, adError: AdError) {}
# Метод для обработки скрытия баннера (ВАЖНО: работает только для рекламы Buzzoola и Яндекс)
# Работает только для реклам Buzzoola!
# Параметры:
# — banner: BannerAdView — баннер, для которого произошло событие
func onCloseAd(_ banner: BannerAdView) {}
}Для повторной загрузки рекламы предварительно необходимо вызвать метод destroy() перед очередным loadAd. Метод очистит вью, верстку, обеспечит отсутствие утечек памяти и конфликтов констрейнтов для последующего отображения. Если вы вызовете loadAd, не вызвав предварительный destroy, или же когда выполнение предыдущего loadAd не было успешно завершено - вы получите ошибку в лог.
Есть возможность настроить автообновление баннеров, в этом случае нет необходимости в ручную всякий раз вызывать метод loadAd и destroy для следующей загрузки рекламного объявления. Баннеры будут меняться друг за другом автоматически по заданному таймеру. Для поддержки автообновления, вызовите метод setRefreshAd(_ time: Int) у BannerAdView. В параметрах можно указать время обновления баннера в диапазоне от 10 секунд до 1 минуты. По умолчанию время обновления составляет 30 секунд. Важно: устанавливать автообновление необходимо до функции loadAd.
class ViewController: UIViewController {
...
var bannerView = BannerAdView() # вью рекламного объявления
...
func viewDidLoad {
let request = AdsRequest(placementID: placementID, width: width, height: height) # запрос для получение рекламы
bannerView.setRefreshAd(10) # автообновение баннера каждые 10 секунд
bannerView.loadAd(request: request) # вызов метода загрузки рекламы
}
}Для реализации баннерной рекламы на проектах, использующих SwiftUI, необходимо делать обертку UIViewRepresentable. Пример:
struct BannerUIKitView: UIViewRepresentable {
func makeUIView(context: Context) -> UIView {
let view = BannerAdView()
view.delegate = context.coordinator
context.coordinator.bannerView = view
view.loadAd(
request: AdsRequest(
placementID: placementID,
width: width,
height: height)
)
return view
}
class Coordinator: NSObject, BannerAdEventProtocol {
// MARK: Properties
var bannerView: BannerAdView?
var parent: BannerUIKitView
init(_ parent: BannerUIKitView) {
self.parent = parent
}
// MARK: BannerAdEventProtocol
func onAdLoaded() {
print("onAdLoaded")
}
...
}Этот формат рекламы позволяет создать рекламное объявление с кастомной версткой.
Данную вью необходимо унаследовать от класса NativeAdView.
class NativeCustomAdView: NativeAdView {
private var title: UILabel?
private var domain: UILabel?
...
}Для отображения рекламы должны быть использованы следующие элементы:
| Элемент | Описание | Тип элемента | Обязательность |
|---|---|---|---|
| adTitle | Заголовок | UILabel | Да |
| adDomain | Домен | UILabel | Да |
| adAge | Возрастная метка | UILabel | Да |
| adBadge | Рекламная метка | UILabel | Да |
| adWarning | Предупреждение | UILabel | Да, для медиаций |
| adInfo | Значок меню | UIButton | Да |
| adActionBtn | Кнопка действия | UIButton | Да |
| adMedia | Медиа (картинка/видео) | NativeMediaView | Да |
| adIcon | Иконка | UIImageView | Да, для типа APP |
| adPrice | Цена | UILabel | Да, для типа APP |
| adDescription | Основной текст | UILabel | Нет |
| adFavicon | Значок веб-сайта | UIImageView | Нет |
| adReviews | Количество оценок | UILabel | Нет |
| adRating | Рейтинг | View implements Rating | Нет |
ВАЖНО! Необходимо в верстке размещать ваш наследник NativeAdView в пустой UIView. Эта обертка обеспечит корректную работу и отображение рекламных объявлений. Пример:
var container = UIView()
var nativeView = NativeCustomAdView()
...
yourLayout.addSubview(container)
container.addSubview(nativeView)
...
NSLayoutConstraint.activate([
nativeView.topAnchor.constraint(equalTo: container.topAnchor),
nativeView.leftAnchor.constraint(equalTo: container.leftAnchor),
nativeView.rightAnchor.constraint(equalTo: container.rightAnchor),
nativeView.bottomAnchor.constraint(equalTo: container.bottomAnchor)
])func bindAssets() {
adTitle = title
adDomain = domain
adWarning = warning
adBadge = sponsored
adInfo = feedback
adActionBtn = callToAction
adMedia = media
adPrice = price
adReviews = reviewCount
adRating = ratingView
adDescription = body
adIcon = iconImage
adAge = age
}Создайте экземпляр класса NativeAdLoader. Создавать загрузчиков можно несколько.
class ViewController: UIViewController {
private lazy var adLoader: NativeAdLoader = {
let adLoader = NativeAdLoader()
adLoader.delegate = self
return adLoader
}()
}Шаг 4: Подпишите NativeAdLoader на NativeAdLoaderProtocol, для получения уведомлений о загрузке и ошибке
Загрузка осуществляется асинхронно, при получении рекламы вызываются соответствующие методы делегата.
extension ViewController: NativeAdLoaderProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — ads: [NativeAd] - полученные рекламы
# — loader: NativeAdLoader - лоадер, который вызвал загрузку рекламы
func onAdsLoaded(loader: NativeAdLoader, ads: [NativeAd]) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — adError: AdError - ошибка получения рекламы
# — loader: NativeAdLoader - лоадер, который вызвал загрузку рекламы
func onAdsFailed(loader: NativeAdLoader, adError: AdError) {}
}let request = AdsRequest(placementID: placementID)class ViewController: UIViewController {
# Лоадер для загрузки реклам
private lazy var adLoader: NativeAdLoader = {
let adLoader = NativeAdLoader()
adLoader.delegate = self # подписка на делегат NativeAdLoaderDelegate
return adLoader
}()
func viewDidLoad {
let request = AdsRequest(placementID: placementID) # запрос для получение рекламы
adLoader.loadAd(request: request) # вызов метода загрузки реклам
}
}Шаг 7: Выберите NativeAd для отображения и подпишите на делегат NativeAdDelegate для отслеживания событий по рекламному объявлению
extension ViewController: NativeAdDelegate {
# Метод для обработки результата отображения рекламного объявления
# Параметры:
# - ad: NativeAd - текущая реклама
func onAdLoaded(_ ad: NativeAd) {}
# Метод для обработки ошибки отображения рекламного объявления
# Параметры:
# - ad: NativeAd - текущая реклама
# - adError: AdError - ошибка отображения рекламы
func onAdFailed(_ ad: NativeAd, adError: AdError) {}
# Метод для обработки закрытия рекламного объявления
# Работает только для реклам Buzzoola и ВК!
# Параметры:
# - ad: NativeAd - текущая реклама
func onCloseAd(_ ad: NativeAd) {}
# Метод для обработки кликов по рекламному объявлению
# Параметры:
# - ad: NativeAd - текущая реклама
func onAdClicked(_ ad: NativeAd) {}
# Метод для обработки выходов из приложения
# Работает только для реклам Buzzoola и ВК!
# Параметры:
# - ad: NativeAd - текущая реклама
func onLeftApplication(_ ad: NativeAd) {}
# Метод для обработки возврата в приложение
# Работает только для реклам Buzzoola и ВК!
# Параметры:
# - ad: NativeAd - текущая реклама
func onReturnedToApplication(_ ad: NativeAd) {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# - ad: NativeAd - текущая реклама
# — data: String? — дополнительная информация, присутствует для реклам Яндекса
func onImpression(_ ad: NativeAd, _ data: String?) {}
}Шаг 8: Подпишите выбранный NativeAd на делегат ImageLoadingDelegate для отслеживания загрузки картинок
extension ViewController: ImageLoadingDelegate {
# Метод для обработки загрузки картинки
# Параметры:
# - ad: NativeAd - реклама, у которой получена картинка
# - color: UIColor? - приоритетный цвет полученной картинки
func onImageLoaded(ad: NativeAd, color: UIColor?) {}
# Метод для обработки ошибки загрузки картинки
func onImageLoadFailed(ad: NativeAd) {}
}Шаг 9: Свяжите выбранный NativeAd с вашей кастомной вью методом bindAd для наполнения вашей вью рекламным контентом
extension ViewController: NativeAdLoaderProtocol {
func onAdsLoaded(ads: [NativeAd]) {
let ad = ads.first # выбор первой рекламы для отображения
ad?.delegate = self # подписка на делегат NativeAdDelegate
ad?.imageDelegate = self # подписка на делегат ImageLoadingDelegate
ad?.bindAd(yourCustomView) # связка рекламного объявления с кастомной вью для отображения
}
}Для отображения следующей рекламы предварительно необходимо вызвать метод destroy() перед очередным bindAd. Метод очистит вью, верстку, обеспечит отсутствие утечек памяти и конфликтов констрейнтов для последующего отображения.
У рекламы NativeAd можно получить доступ к полям: type: NativeAdType - тип полученной рекламы (app или content, значение app принимает только в случае с особой рекламой Яндекса); meta: [String: Any?]? - дополнительные параметры в виде словаря ключ-значение; adAssets: NativeAdAssets - ресурсы рекламы.
struct NativeAdAssets| Название поля | Тип поля | Описание |
|---|---|---|
| title | String? | заголовок |
| domain | String? | домен |
| age | String? | возраст |
| description | String? | описание |
| actionTitle | String? | кнопка |
| warning | String? | предупреждение - для медиаций |
| sponsored | String? | маркер рекламы |
| price | String? | цена |
| rating | NSNumber? | рейтинг |
| reviewCount | String? | количество просмотров |
| media | String? | ссылка на видео |
| image | UIImage? | картинка |
| icon | UIImage? | иконка |
| favicon | UIImage? | специфика Яндекса |
| extras | [String: Any?]? | дополнительные ассеты в виде словаря ключ-значение |
Для реализации нативной рекламы на проектах, использующих SwiftUI, необходимо делать обертку UIViewRepresentable с реализацией вашей кастомной вью на UIKit. Пример:
struct NativeUIKitView: UIViewRepresentable {
@Binding var isLoading: Bool
func makeUIView(context: Context) -> UIView {
let nativeAdView = NativeCustomAdView()
context.coordinator.nativeView = nativeAdView
context.coordinator.adLoader = NativeAdLoader()
context.coordinator.adLoader?.delegate = context.coordinator
context.coordinator.adLoader?.loadAd(request: AdsRequest(placementID: placementID))
return nativeAdView
}
class Coordinator: NSObject, NativeAdLoaderProtocol, NativeAdDelegate, ImageLoadingDelegate {
// MARK: Properties
var nativeView: NativeCustomAdView?
var adLoader: NativeAdLoader?
var parent: NativeUIKitView
private var ads = [NativeAd]()
init(_ parent: NativeUIKitView) {
self.parent = parent
}
// MARK: NativeAdLoaderProtocol
func onAdsLoaded(ads: [any BuzzoolaAdsSDK.NativeAd]) {
...
let ad = ads.first
ad?.delegate = self
ad?.imageDelegate = self
ad?.bindAd(nativeView!)
}
func onAdsFailed(adError: BuzzoolaAdsSDK.AdError) {
print("onAdsFailed", adError.errorDescription)
}
// MARK: NativeAdDelegate
func onAdLoaded(_ ad: any BuzzoolaAdsSDK.NativeAd) {
print("onAdLoaded")
}
...
}Этот формат рекламы - частный случай нативной рекламы. Позволяет создать рекламное объявление с кастомной версткой и автосменой объявлений с анимацией по заданному таймеру. Подготовка кастомной вью и связка с полями происходит аналогично нативному формату.
Создайте экземпляр класса NativeWaterfallAdLoader.
class ViewController: UIViewController {
private lazy var adLoader: NativeWaterfallAdLoader = {
let adLoader = NativeWaterfallAdLoader()
adLoader.delegate = self
return adLoader
}()
}Шаг 2: Подпишите NativeWaterfallAdLoader на NativeWaterfallAdLoaderProtocol, для получения уведомлений о загрузке и ошибке
Загрузка осуществляется асинхронно, при получении рекламы вызываются соответствующие методы делегата.
extension ViewController: NativeWaterfallAdLoaderProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — ad: NativeWaterfallAd - полученная реклама
# — loader: NativeWaterfallAdLoader - лоадер, который вызвал загрузку рекламы
func onAdLoaded(loader: NativeWaterfallAdLoader, ad: NativeWaterfallAd) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — adError: AdError - ошибка получения рекламы
# — loader: NativeWaterfallAdLoader - лоадер, который вызвал загрузку рекламы
func onAdFailed(loader: NativeWaterfallAdLoader, adError: AdError) {}
}let request = AdsRequest(placementID: placementID)class ViewController: UIViewController {
# Лоадер для загрузки рекламы
private lazy var adLoader: NativeWaterfallAdLoader = {
let adLoader = NativeWaterfallAdLoader()
adLoader.delegate = self # подписка на делегат NativeWaterfallAdLoaderDelegate
return adLoader
}()
func viewDidLoad {
let request = AdsRequest(placementID: placementID) # запрос для получение рекламы
adLoader.loadAd(request: request) # вызов метода загрузки рекламы
}
}Шаг 5: Полученный NativeWaterfallAd подпишите на делегат NativeWaterfallAdDelegate для отслеживания событий по рекламному объявлению
extension ViewController: NativeWaterfallAdDelegate {
# Метод для обработки результата отображения рекламного объявления
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
func onAdLoaded(_ adInfo: NativeWaterfallAdInfo) {}
# Метод для обработки ошибки отображения рекламного объявления
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
# - adError: AdError - ошибка отображения рекламы
func onAdFailed(_ adInfo: NativeWaterfallAdInfo, adError: AdError) {}
# Метод для обработки закрытия рекламного объявления
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
func onCloseAd(_ adInfo: NativeWaterfallAdInfo) {}
# Метод для обработки кликов по рекламному объявлению
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
func onAdClicked(_ adInfo: NativeWaterfallAdInfo) {}
# Метод для обработки выходов из приложения
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
func onLeftApplication(_ adInfo: NativeWaterfallAdInfo) {}
# Метод для обработки возврата в приложение
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
func onReturnedToApplication(_ adInfo: NativeWaterfallAdInfo) {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# - adInfo: NativeWaterfallAdInfo - текущая реклама
# — data: String? — дополнительная информация, присутствует для реклам Яндекса
func onImpression(_ adInfo: NativeWaterfallAdInfo, _ data: String?) {}
}Шаг 6: Полученному NativeWaterfallAd задайте интервал для автосмены объявлений методом setUpdateInterval(_ interval: Int) и свяжите NativeWaterfallAd с вашей кастомной вью методом bindAd для наполнения вашей вью рекламным контентом
Вызов setUpdateInterval должен быть перед bindAd, иначе будет применено стандартное время автосмены равное 10 секунд. Значение интервала может быть задано в диапазоне от 10 до 30. При указании невалидного значения, вы получите ошибку в лог.
...
private var adNativeWaterfall: NativeWaterfallAd?
...
extension ViewController: NativeWaterfallAdLoaderProtocol {
func onAdLoaded(loader: NativeWaterfallAdLoader, ad: NativeWaterfallAd) {
adNativeWaterfall = ad
adNativeWaterfall?.delegate = self # подписка на делегат NativeWaterfallAdDelegate
adNativeWaterfall?.setUpdateInterval(15) # задание значения в 15 секунд для автосмены реклам
adNativeWaterfall?.bindAd(adView) # связка рекламного объявления с кастомной вью для отображения
}
}Перед новой загрузкой или перед выходом с экрана необходимо вызвать метод destroy(). Метод очистит вью, верстку, таймеры, обеспечит отсутствие утечек памяти и конфликтов констрейнтов для последующего отображения.
У NativeWaterfallAdInfo можно получить доступ к полям: meta: [String: Any?]? - дополнительные параметры в виде словаря ключ-значение; adAssets: NativeAdAssets - ресурсы рекламы.
В зону отвественности пользователя для данного формата входит кастомизация плеера и логика скрытия и появления данной рекламы поверх своего видео.
Данную вью необходимо унаследовать от класса InstreamPlayerView.
Для отображения рекламы на этом вью должны присутствовать следующие элементы:
| Id элемента | Описание | Тип элемента |
|---|---|---|
| adBadge | Рекламная метка | UILabel |
| adInfo | Значок меню | UIButton |
| adActionBtn | Кнопка действия | UIButton |
| adMedia | Медиа (видео) | NativeMediaView |
Важное замечание: adInfo может быть скрыт на стороне SDK, если от сервера не пришел ЕРИД.
Вы можете кастомизировать InstreamPlayerView с помощью следующих методов:
# Метод для задания фона видео
# Параметры:
# — color: UIColor - цвет для фона видео
func setBackground(_ color: UIColor)
# Метод для задания видимости линии прогресса
# Параметры:
# — show: Bool - по дефолту true - видима
func showProgressBar(_ show: Bool)
# Метод для задания цвет линии прогресса
# Параметры:
# — color: UIColor - цвет линии прогресса
func setProgressBarColor(_ color: UIColor)
# Метод для задания цвета и фона лоадера
# Параметры:
# — color: UIColor - цвет лоадера
# — background: UIColor? - цвет подложки лоадера, по дефолту hex: 333333 с непрозрачностью 0,64
func setLoader(color: UIColor, background: UIColor?)func bindAssets() {
adBadge = badgeLabel
adInfo = infoButton
adActionBtn = actionButton
adMedia = media
}Создайте экземпляр класса InstreamAdLoader.
class ViewController: UIViewController {
private lazy var adLoader: InstreamAdLoader = {
let adLoader = InstreamAdLoader()
adLoader.delegate = self
return adLoader
}()
}Шаг 4: Подпишите InstreamAdLoader на InstreamAdLoaderProtocol, для получения уведомлений о загрузке и ошибке
Загрузка осуществляется асинхронно, при получении рекламы вызываются соответствующие методы делегата.
extension ViewController: InstreamAdLoaderProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — ad: InstreamAd - полученная видео-реклама
func onAdLoaded(ad: InstreamAd) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — adError: AdError - ошибка получения рекламы
func onAdFailed(adError: AdError) {}
}let request = AdsRequest(placementID: placementID)class ViewController: UIViewController {
# Лоадер для загрузки реклам
private lazy var adLoader: InstreamAdLoader = {
let adLoader = InstreamAdLoader()
adLoader.delegate = self # подписка на делегат InstreamAdLoaderDelegate
return adLoader
}()
func viewDidLoad {
let request = AdsRequest(placementID: placementID) # запрос для получение рекламы
adLoader.loadAd(request: request) # вызов метода загрузки реклам
}
}Шаг 7: Подпишите полученный InstreamAd на делегат InstreamAdPlaybackDelegate для отслеживания событий по рекламному объявлению
extension ViewController: InstreamAdPlaybackDelegate {
# Метод для обработки результата завершения воспроизведения рекламных видео
# Здесь можно запустить заново основное видео
func onComplete() {}
# Метод для обработки ошибки отображения рекламного объявления
# Параметры:
# - adError: AdError - ошибка отображения/воспроизведения рекламы
func onFailed(adError: AdError) {}
# Метод для обработки начала воспроизведение всех рекламных видео
# InstreamPlayerView должен стать видимым, если был скрыт
func onStarted() {}
# Метод для обработки начала воспроизведения рекламного видео
# Параметры:
# - video: VideoAd - воспроизводимое видео
func onVideoAdStarted(video: VideoAd) {}
# Метод срабатывает каждую секунду, уведомляя сколько осталось времени до конца воспроизведения видео.
# Здесь можно настроить таймер и кнопку "Пропустить"
# Параметры:
# - video: VideoAd - воспроизводимое видео
# - timeLeft: Float - прошло времени
func onVideoAdTimeLeftChange(video: VideoAd, timeLeft: Float) {}
# Метод для обработки завершения воспроизведения рекламного видео
# Параметры:
# - video: VideoAd - воспроизводимое видео
func onVideoAdCompleted(video: VideoAd) {}
# Метод для обработки паузы воспроизведения рекламного видео
# Параметры:
# - video: VideoAd - воспроизводимое видео
func onVideoAdPaused(video: VideoAd) {}
# Метод для обработки возобновления воспроизведения рекламного видео после паузы
# Параметры:
# - video: VideoAd - воспроизводимое видео
func onVideoAdResumed(video: VideoAd) {}
# Метод для обработки ошибки воспроизведения рекламного видео
# Параметры:
# - video: VideoAd - воспроизводимое видео
# - error: String - причина ошибки
func onVideoAdError(video: VideoAd, error: String) {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# - video: VideoAd - воспроизводимое видео
func onVideoAdImpression(video: VideoAd) {}
# Метод для обработки кликов по рекламному видео
# Параметры:
# - video: VideoAd - воспроизводимое видео
func onVideoAdClicked(video: VideoAd) {}
}Шаг 8: Свяжите InstreamAd с вашим кастомным плеером методом attachPlayerView для наполнения рекламным контентом и начните воспроизведение реклам
extension ViewController: NativeAdLoaderProtocol {
func onAdLoaded(ad: InstreamAd) {
ad.playbackDelegate = self # подписка на делегат InstreamAdPlaybackDelegate
ad.attachPlayerView(yourCustomPlayer) # связка рекламного объявления с кастомным плеером для отображения
ad.start() # старт воспроизведения видео-реклам
}
}В одном объекте InstreamAd в рамках одного рекламного блока может прийти несколько видео. Они будут автоматически запущены друг за другом. Их количество можно увидеть в поле InstreamAd.videoCount. Если во время воспроизведения видео произойдет ошибка, следующее видео будет запущено автоматически или выполнено завершение показа рекламы, если ошибочное видео было последним.
Описание дополнительных методов:
# Метод, позволяющий пропустить текущее рекламное видео
func skip()
# Метод, позволяющий остановить показ всего рекламного блока
func stop()
# Метод, позволяющий обработать клик по рекламе (при необходимости его дополнительного вызова)
func handleClick()
# Метод, позволяющий изменить звук видео. Значения от 0.0 до 1.0.
# По дефолту видео запускается с выключенным звуком
func setVolume(volume: Float)Объект VideoAd содержит в себе поля duration и skipOffset, длина видео и время, через которое будет разрешен пропуск видео (в секундах). Обратите внимание, что skipOffset может быть равен duration, в таком случае пропуск по сути невозможен.
Создайте экземпляр класса InterstitialAdLoader.
private lazy var adLoader: InterstitialAdLoader = {
let adLoader = InterstitialAdLoader()
adLoader.delegate = self
return adLoader
}()Шаг 2: Подпишите InterstitialAdLoader на InterstitialAdLoaderProtocol, для получения уведомлений о загрузке и ошибке
Загрузка осуществляется асинхронно, при получении рекламы вызываются соответствующие методы делегата.
extension ViewController: InterstitialAdLoaderProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — ad: InterstitialAd - полученная реклама
func onAdLoaded(ad: InterstitialAd) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — adError: AdError - ошибка получения рекламы
func onAdFailedToLoad(adError: AdError) {}
}let request = AdsRequest(placementID: placementID)class ViewController: UIViewController {
# Лоадер для загрузки рекламы
private lazy var adLoader: InterstitialAdLoader = {
let adLoader = InterstitialAdLoader()
adLoader.delegate = self # подписка на делегат InterstitialAdLoaderDelegate
return adLoader
}()
func viewDidLoad {
let request = AdsRequest(placementID: placementID) # запрос для получение рекламы
adLoader.loadAd(request: request) # вызов метода загрузки рекламы
}
}Шаг 5: Подпишите полученный InterstitialAd на делегат InterstitialAdDelegate для отслеживания событий по рекламному объявлению
extension ViewController: InterstitialAdDelegate {
# Метод для обработки результата отображения рекламного объявления
func onAdShown() {}
# Метод для обработки ошибки отображения рекламного объявления
# Параметры:
# - adError: AdError - ошибка отображения рекламы
func onAdFailed(adError: AdError) {}
# Метод для обработки кликов по рекламному объявлению
func onAdClicked() {}
# Метод для обработки закрытия рекламного объявления
func onAdDismissed() {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# — data: String? — дополнительная информация, присутствует для реклам Яндекса
func onImpression(_ data: String?) {}
}Необходимо передать ваш активный вью контроллер в качестве параметра методу show. Рекламный объект может быть показан только один раз, при попытке повторного отображения вы получите ошибку в лог.
extension ViewController: InterstitialAdLoaderProtocol {
func onAdLoaded(ad: InterstitialAd) {
...
ad.delegate = self # подписка на делегат InterstitialAdDelegate
ad.show(from: self) # отображение рекламного объявления
...
}
}Для реализации полноэкранной рекламы на проектах, использующих SwiftUI, необходимо делать обертку UIViewControllerRepresentable. Пример:
struct InterstitialView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let controller = UIViewController()
context.coordinator.viewController = controller
context.coordinator.adLoader = InterstitialAdLoader()
context.coordinator.adLoader?.delegate = context.coordinator
context.coordinator.adLoader?.loadAd(request: AdsRequest(placementID: placementID))
...
return controller
}
}Создайте экземпляр класса RewardedAdLoader.
private lazy var adLoader: RewardedAdLoader = {
let adLoader = RewardedAdLoader()
adLoader.delegate = self
return adLoader
}()Шаг 2: Подпишите RewardedAdLoader на RewardedAdLoaderProtocol, для получения уведомлений о загрузке и ошибке
Загрузка осуществляется асинхронно, при получении рекламы вызываются соответствующие методы делегата.
extension ViewController: RewardedAdLoaderProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — ad: RewardedAd - полученная реклама
func onAdLoaded(ad: RewardedAd) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — adError: AdError - ошибка получения рекламы
func onAdFailedToLoad(adError: AdError) {}
}let request = AdsRequest(placementID: placementID)class ViewController: UIViewController {
# Лоадер для загрузки рекламы
private lazy var adLoader: RewardedAdLoader = {
let adLoader = RewardedAdLoader()
adLoader.delegate = self # подписка на делегат RewardedAdLoaderDelegate
return adLoader
}()
func viewDidLoad {
let request = AdsRequest(placementID: placementID) # запрос для получение рекламы
adLoader.loadAd(request: request) # вызов метода загрузки рекламы
}
}Шаг 5: Подпишите полученный RewardedAd на делегат RewardedAdDelegate для отслеживания событий по рекламному объявлению
extension RewardedView: RewardedAdDelegate {
# Метод для обработки результата отображения рекламного объявления
func onAdShown() {}
# Метод для обработки ошибки отображения рекламного объявления
# Параметры:
# - adError: AdError - ошибка отображения рекламы
func onAdFailed(adError: AdError) {}
# Метод для обработки кликов по рекламному объявлению
func onAdClicked() {}
# Метод для обработки закрытия рекламного объявления
func onAdDismissed() {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# — data: String? — дополнительная информация, присутствует для реклам Яндекса
func onImpression(_ data: String?) {}
# Метод для обработки получения вознаграждения.
# Срабатывает по истечению 15 секунд для реклам с картинкой и после просмотра видео для видео-реклам
# Параметры:
# — reward: Reward - структура с полями type: String (тип) и amount: Int? (стоимость)
func onReward(reward: Reward) {}
}Необходимо передать ваш активный вью контроллер в качестве параметра методу show. Рекламный объект может быть показан только один раз, при попытке повторного отображения вы получите ошибку в лог.
extension ViewController: RewardedAdLoaderProtocol {
func onAdLoaded(ad: RewardedAd) {
...
ad.delegate = self
ad.show(from: self)
...
}
}Для реализации полноэкранной рекламы с вознаграждением на проектах, использующих SwiftUI, необходимо делать обертку UIViewControllerRepresentable. Пример:
struct RewardedView: UIViewControllerRepresentable {
func makeUIViewController(context: Context) -> UIViewController {
let controller = UIViewController()
context.coordinator.viewController = controller
context.coordinator.adLoader = RewardedAdLoader()
context.coordinator.adLoader?.delegate = context.coordinator
context.coordinator.adLoader?.loadAd(request: AdsRequest(placementID: placementID))
return controller
}
}Данный формат рекламы отражается только портретно. При попытке отобразить рекламу, когда устройство находится в альбомном режиме, вы получите ошибку в лог.
Создайте экземпляр класса AppOpenAdLoader.
private lazy var adLoader: AppOpenAdLoader = {
let adLoader = AppOpenAdLoader()
adLoader.delegate = self
return adLoader
}()Шаг 2: Подпишите AppOpenAdLoader на AppOpenAdLoaderProtocol, для получения уведомлений о загрузке и ошибке
Загрузка осуществляется асинхронно, при получении рекламы вызываются соответствующие методы делегата.
extension ViewController: AppOpenAdLoaderProtocol {
# Метод для обработки результата загрузки
# Параметры:
# — ad: AppOpenAd - полученная реклама
func onAdLoaded(ad: AppOpenAd) {}
# Метод для обработки ошибки загрузки
# Параметры:
# — adError: AdError - ошибка получения рекламы
func onAdFailedToLoad(adError: AdError) {}
}let request = AdsRequest(placementID: placementID)class ViewController: UIViewController {
# Лоадер для загрузки рекламы
private lazy var adLoader: AppOpenAdLoader = {
let adLoader = AppOpenAdLoader()
adLoader.delegate = self # подписка на делегат AppOpenAdLoaderDelegate
return adLoader
}()
func viewDidLoad {
let request = AdsRequest(placementID: placementID) # запрос для получение рекламы
adLoader.loadAd(request: request) # вызов метода загрузки рекламы
}
}Шаг 5: Подпишите полученный AppOpenAd на делегат AppOpenAdDelegate для отслеживания событий по рекламному объявлению
extension AppOpenAdView: AppOpenAdDelegate {
# Метод для обработки результата отображения рекламного объявления
func appOpenAdDidShow() {}
# Метод для обработки ошибки отображения рекламного объявления
# Параметры:
# - adError: AdError - ошибка отображения рекламы
func appOpenAd(didFailToShowWithError error: AdError) {}
# Метод для обработки кликов по рекламному объявлению
func appOpenAdDidClick() {}
# Метод для обработки закрытия рекламного объявления
func appOpenAdDidDismiss() {}
# Метод для обработки impression - события, когда реклама засчитана
# Параметры:
# — impressionData: String? — дополнительная информация, присутствует для реклам Яндекса
func appOpenAd(didTrackImpressionWith impressionData: String?) {}
}Необходимо передать ваш активный вью контроллер в качестве параметра методу show. Рекламный объект может быть показан только один раз, при попытке повторного отображения вы получите ошибку в лог.
extension ViewController: AppOpenAdLoaderProtocol {
func onAdLoaded(ad: AppOpenAd) {
...
ad.delegate = self
ad.show(from: self)
...
}
}