Рекламные форматы iOS


Баннеры

Инициализация

Для показа баннеров адаптивного размера или форматов 320x50, 300x250, 728x90 в своем приложении необходимо создать экземпляр класса MTRGAdView.

MTRGAdView - визуальный компонент, наследник UIView, который должен быть добавлен на экран приложения.
Для создания экземпляра MTRGAdView необходимо указать ваш slotId. Устанавливать размер (frame.size) баннера вручную не нужно.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGAdView *_adView;
}
 
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
     
    // Создаем экземпляр MTRGAdView
    _adView = [MTRGAdView adViewWithSlotId:YOUR_SLOT_ID];
  
    //  Формат 300x250
    // _adView.adSize = [MTRGAdSize adSize300x250];
}
По умолчанию устанавливается формат MTRGAdSizeTypeAdaptive. При этом баннер автоматически растягивается по ширине экрана с сохранением пропорций, а высота будет не менее 50 пикселей, но не более 15% от высоты экрана.

Есть возможность переустановить свойство adSize. В этом случае SDK перестанет отслеживать изменения ориентации устройства и менять размеры адаптивного баннера. Тогда при использовании баннеров адаптивного размера необходимо самостоятельно отслеживать изменения:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    _adView.adSize = [MTRGAdSize adSizeForCurrentOrientation];
}
Если метод load() уже был вызван, то сменить формат на 300x250 уже нельзя (также как и установить другой формат если до этого был 300x250).
MTRGAdSize

MTRGAdSize - класс, который позволяет задать размер для MTRGAdView. Доступны следующие размеры: MTRGAdSizeType320x50, MTRGAdSizeType300x250, MTRGAdSizeType728x90, MTRGAdSizeTypeAdaptive.

+ (instancetype)adSize320x50;
+ (instancetype)adSize300x250;
+ (instancetype)adSize728x90;
+ (instancetype)adSizeForCurrentOrientation; // Адаптивный размер
+ (instancetype)adSizeForCurrentOrientationForWidth:(CGFloat)width; // Адаптивный размер с ограничением максимальной ширины

Загрузка и показ рекламных объявлений

Созданный и настроенный экземпляр MTRGAdView необходимо добавить на экран приложения. Для обработки кликов необходимо установить созданному экземпляру MTRGAdView текущий ViewController. Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки, клик по рекламному объявлению) необходимо установить созданному экземпляру MTRGAdView делегат, реализующий протокол MTRGAdViewDelegate, после чего можно запустить загрузку данных. После успешной загрузки данных можно запустить показ рекламных объявлений.

@interface YourViewController : UIViewController <MTRGAdViewDelegate>
@end
 
@implementation YourViewController
{
  MTRGAdView *_adView;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGAdView
    _adView = [MTRGAdView adViewWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем делегат
    _adView.delegate = self;
  
    // Устанавливаем контроллер
    _adView.viewController = self;
 
    // Добавляем на экран
    [self.view addSubview:_adView];
     
    // Запускаем загрузку данных
    [_adView load];
}
  
- (void)onLoadWithAdView:(MTRGAdView *)adView
{
}
 
- (void)onNoAdWithReason:(NSString *)reason adView:(MTRGAdView *)adView
{
}
 
- (void)onAdShowWithAdView:(MTRGAdView *)adView
{
}
 
- (void)onAdClickWithAdView:(MTRGAdView *)adView
{
}
 
- (void)onShowModalWithAdView:(MTRGAdView *)adView
{
}
  
- (void)onDismissModalWithAdView:(MTRGAdView *)adView
{
}
  
- (void)onLeaveApplicationWithAdView:(MTRGAdView *)adView
{
}
Ротация

Рекламные объявления ротируются каждые 60 секунд. Вы можете отключить автоматическую ротацию объявлений при инициализации экземпляра MTRGAdView, указав дополнительный параметр shouldRefreshAd. Ротируются все баннеры кроме формата 300х250.

// Выключение автоматической ротации баннеров
_adView = [MTRGAdView adViewWithSlotId:YOUR_SLOT_ID shouldRefreshAd:NO];
Баннер 320x50

Полноэкранная реклама

Инициализация

Для показа полноэкранных рекламных объявлений в своем приложении необходимо создать экземпляр класса MTRGInterstitialAd. Для создания экземпляра необходимо указать ваш slotId.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGInterstitialAd *_ad;
}
 
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
     
    // Создаем экземпляр MTRGInterstitialAd
    _ad = [MTRGInterstitialAd interstitialAdWithSlotId:YOUR_SLOT_ID];
}
Загрузка рекламных объявлений

Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки, клик по рекламному объявлению) необходимо установить созданному экземпляру MTRGInterstitialAd делегат, реализующий протокол MTRGInterstitialAdDelegate, после чего можно запустить загрузку данных.

@interface YourViewController : UIViewController <MTRGInterstitialAdDelegate>
@end
 
@implementation YourViewController
{
  MTRGInterstitialAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGInterstitialAd
    _ad = [MTRGInterstitialAd interstitialAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем делегат
    _ad.delegate = self;
     
    // Запускаем загрузку данных
    [_ad load];
}
  
- (void)onLoadWithInterstitialAd:(MTRGInterstitialAd *)interstitialAd
{
}
  
- (void)onNoAdWithReason:(NSString *)reason interstitialAd:(MTRGInterstitialAd *)interstitialAd
{
}
  
- (void)onDisplayWithInterstitialAd:(MTRGInterstitialAd *)interstitialAd
{
}
 
- (void)onClickWithInterstitialAd:(MTRGInterstitialAd *)interstitialAd
{
}
 
- (void)onCloseWithInterstitialAd:(MTRGInterstitialAd *)interstitialAd
{
}
 
- (void)onLeaveApplicationWithInterstitialAd:(MTRGInterstitialAd *)interstitialAd
{
}
Показ рекламных объявлений

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

- (void)onLoadWithInterstitialAd:(MTRGInterstitialAd *)interstitialAd
{
    [_ad showWithController:self];
}
Пример полноэкранного баннера

Полноэкранная реклама с вознаграждением (Rewarded видео)

Инициализация

Для показа полноэкранных рекламных объявлений в своем приложении необходимо создать экземпляр класса MTRGRewardedAd. Для создания экземпляра необходимо указать ваш slotId.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGRewardedAd *_ad;
}
 
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
     
    // Создаем экземпляр MTRGRewardedAd
    _ad = [MTRGRewardedAd rewardedAdWithSlotId:YOUR_SLOT_ID];
}
Загрузка рекламных объявлений

Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки, получение награды, клик по рекламному объявлению и т.д.) необходимо установить созданному экземпляру MTRGRewardedAd делегат, реализующий протокол MTRGRewardedAdDelegate, после чего можно запустить загрузку данных.

@interface YourViewController : UIViewController <MTRGRewardedAdDelegate>
@end
 
@implementation YourViewController
{
  MTRGRewardedAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGRewardedAd
    _ad = [MTRGRewardedAd rewardedAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем делегат
    _ad.delegate = self;
     
    // Запускаем загрузку данных
    [_ad load];
}
  
- (void)onLoadWithRewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
 
- (void)onNoAdWithReason:(NSString *)reason rewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
 
- (void)onReward:(MTRGReward *)reward rewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
 
- (void)onClickWithRewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
 
- (void)onCloseWithRewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
 
- (void)onDisplayWithRewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
 
- (void)onLeaveApplicationWithRewardedAd:(MTRGRewardedAd *)rewardedAd
{
}
Показ рекламных объявлений

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

- (void)onLoadWithRewardedAd:(MTRGRewardedAd *)rewardedAd
{
    [_ad showWithController:self];
}
MTRGReward

При получении награды за просмотр полноэкранной рекламы в метод onReward:rewardedAd: делегата передаётся объект MTRGReward, содержащий поле type


@property(nonatomic, readonly) NSString *type;

Нативная реклама

myTarget SDK предоставляет возможность показывать рекламу в своем приложении, используя собственные визуальные компоненты. SDK загружает данные и предоставляет приложению модель рекламного объявления с определенными свойствами для заполнения визуального компонента, а также методы для подсчета показов и обработки кликов. SDK также предоставляет готовый настраиваемый визуальный компонент, который вы можете использовать в вашем приложении вместо создания собственных.
Инициализация

Для показа нативных рекламных объявлений в вашем приложении необходимо создать экземпляр класса MTRGNativeAd. Для создания экземпляра MTRGNativeAd необходимо указать ваш slotId.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGNativeAd *_ad;
}
 
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
     
    // Создаем экземпляр MTRGNativeAd
    _ad = [MTRGNativeAd nativeAdWithSlotId:YOUR_SLOT_ID];
}
Загрузка рекламных объявлений

Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки, клик по рекламному объявлению) необходимо установить созданному экземпляру MTRGNativeAd делегат, реализующий протокол MTRGNativeAdDelegate, после чего можно запустить загрузку данных.

@interface YourViewController : UIViewController <MTRGNativeAdDelegate>
@end
 
@implementation YourViewController
{
  MTRGNativePromoAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGNativeAd
    _ad = [MTRGNativeAd nativeAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем делегат
    _ad.delegate = self;
     
    // Запускаем загрузку данных
    [_ad load];
}
  
- (void)onLoadWithNativePromoBanner:(MTRGNativePromoBanner *)promoBanner nativeAd:(MTRGNativeAd *)nativeAd
{
}
  
- (void)onNoAdWithReason:(NSString *)reason nativeAd:(MTRGNativeAd *)nativeAd
{
}
  
- (void)onAdClickWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
  
- (void)onShowModalWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
  
- (void)onDismissModalWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
  
- (void)onLeaveApplicationWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
 
- (void)onVideoPlayWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
 
- (void)onVideoPauseWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
 
- (void)onVideoCompleteWithNativeAd:(MTRGNativeAd *)nativeAd
{
}
Политика загрузки медиа файлов

Политика загрузки задает поведение SDK, если ему не удалось загрузить медиа файлы для рекламы. Политика устанавливается в свойстве bannerMediaRecovery у экземпляров классов MTRGNativeAd и MTRGNativeAdLoader. Допустимые значения: skip (по умолчанию) и retry.

Если MTRGNativeAd не удалось загрузить медиа файлы при автозагрузке, то при:

  • skip, SDK закончит загрузку всей рекламы и вызовет метод делегата onLoadFailedWithError:nativeAd:
  • retry, SDK будет повторять загрузку медиа указанное количество раз. Если медиа файлы все-таки не удастся загрузить, то в делегате вызовется onLoadFailedWithError:nativeAd:.
Если MTRGNativeAdLoader не удалось загрузить медиа файлы в баннере при автозагрузке, то при:
- skip, SDK пропустит этот баннер. Причем на загрузку остальных баннеров лоадере это не повлияет.
- retry, SDK будет повторять загрузку медиа для этого баннера указанное количество раз. Если ему все-таки не удастся их загрузить, то SDK пропустит такой баннер.

Политика также учитывается и при выключенной автозагрузке, когда медиа файлы загружаются асинхронно в момент вызова метода registerView.

При выключенной автозагрузке, если MTRGNativeAd не удалось загрузить медиа файлы в registerView, то при:

  • skip, SDK отменит загрузку медиа файлов, которые еще не загрузились, и вызовет метод onMediaLoadFailedWithNativeAd: у mediaDelegate.
  • retry, SDK будет повторять загрузку медиа файлов указанное количество раз. Если ему все-таки не удастся их загрузить, то в mediaDelegate вызовется метод onMediaLoadFailedWithNativeAd:.
Помимо политики загрузки, есть возможность задать таймаут для загрузки медиа файлов. Устанавливается он в свойство bannerMediaTimeout и действует на медиа файлы в рамках баннера.

Автозагрузка изображений и видео

По умолчанию загружаются и кэшируются все медиа-объекты (изображения, видео) рекламного баннера. Вы можете выключить автоматическую загрузку изображений и/или видео, но необходимо учитывать, что на их загрузку потребуется дополнительное время, что создаст дополнительную задержку показа рекламы в вашем приложении.

_ad.cachePolicy = MTRGCachePolicyNone;
[_ad load];
Допустимые значения: MTRGCachePolicyAll (по умолчанию), MTRGCachePolicyImages, MTRGCachePolicyVideo, MTRGCachePolicyNone.

Если предзагрузка включена, то соответствующие медиа-файлы (изображения и/или видео) будут загружены и сохранены в кэш параллельно с загрузкой основных данных рекламного баннера.

Если предзагрузка изображений выключена, то они будут асинхронно загружены автоматически в момент вызова метода registerView. Дополнительных действий не требуется.
Уведомления о загрузке медиа файлов

Для того чтобы получать уведомления о загрузке медиа файлов (в случае не автоматической загрузки) необходимо реализовать протокол MTRGNativeAdMediaDelegate и установить свойство mediaDelegate у объекта MTRGNativeAd.


@protocol MTRGNativeAdMediaDelegate <NSObject>
 
- (void)onIconLoadWithNativeAd:(MTRGNativeAd *)nativeAd;
 
- (void)onImageLoadWithNativeAd:(MTRGNativeAd *)nativeAd;
 
- (void)onAdChoicesIconLoadWithNativeAd:(MTRGNativeAd *)nativeAd;
 
- (void)onMediaLoadFailedWithNativeAd:(MTRGNativeAd *)nativeAd;
 
@end
Уведомления о закрытии рекламы и управление закрытием рекламы

Для того чтобы получать уведомления о закрытии рекламы и управлять закрытием рекламы необходимо в свойство adChoicesOptionDelegate установить делегат, реализующий протокол MTRGNativeAdChoicesOptionDelegate. Протокол содержит несколько методов.
  • shouldCloseAutomatically — говорит SDK о том, стоит ли автоматически закрывать рекламу. Если метод возвращает YES, то SDK автоматически скроет рекламу. Если NO, то возможность скрыть предоставляется разработчику. Метод опциональный и по умолчанию возвращает YES.
  • onCloseAutomatically — уведомляет разработчика, что реклама была скрыта автоматически, средствами SDK. Таким образом, этот метод вызовется, только если shouldCloseAutomatically вернет YES.
  • closeIfAutomaticallyDisabled — уведомляет разработчика, что ему нужно скрыть рекламу самостоятельно. Таким образом, этот метод вызовется, только если shouldCloseAutomatically вернет NO.
Показ рекламных объявлений

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

Для показа иконки следует использовать MTRGIconAdView, а для показа главной картинки, карусели и проигрывания видео вы должны использовать компонент MTRGMediaAdView, предоставляемые SDK.

При отображении рекламного креатива, myTargetSDK определяет наличие в нём объекта MTRGMediaAdView и добавляет в него горизонтальный слайдер карточек (если они есть в баннере) или видео (если нет карточек и есть видео). Если в баннере нет ни карточек ни видео, то будет отображена картинка (preview).

После заполнения визуального компонента вы должны зарегистрировать его в экземпляре MTRGNativeAd, используя метод registerView. Если вы собираетесь использовать этот же визуальный компонент для показа других рекламных объявлений, вам необходимо предварительно вызвать метод unregisterView у текущего экземпляра MTRGNativeAd до вызова registerView у другого экземпляра. Обработка показов и кликов осуществляется автоматически, при этом приложение не должно блокировать или перехватывать пользовательские события на этом визуальном компоненте. Ниже описаны доступные свойства и приведены примеры заполнения визуальных компонентов для различных типов рекламируемых объектов.

Визуальные компоненты (как стандартные, так и собственные) следует положить внутрь контейнера MTRGNativeAdContainer.
При этом в метод registerView можно передавать как сам компонент, так и контейнер.
При создании контейнера, визуальный компонент adView будет добавлен как subview в контейнер и растянут по размерам контейнера.
Чтобы получить высоту визуального компонента в зависимости от его ширины (требуется для встраивания в TableView/CollectionView), необходимо вызвать метод sizeThatFits у контейнера (вызов метода проксируется в adView).
После создания контейнера нужно установить соответствие между доступными свойствами визуального компонента и свойствами контейнера.

- (void)onLoadWithNativePromoBanner:(MTRGNativePromoBanner *)promoBanner nativeAd:(MTRGNativeAd *)nativeAd
{
    // Заголовок рекламного объявления
    NSString *title = promoBanner.title;
    // Основной текст
    NSString *descriptionText = promoBanner.descriptionText;
    // Возрастное ограничение. Может быть nil
    NSString *ageRestrictions = promoBanner.ageRestrictions;
    // Дисклеймер. Может быть nil
    NSString *disclaimer = promoBanner.disclaimer;
    // Текст метки "Реклама"
    NSString *advertisingLabel = promoBanner.advertisingLabel;
    // Иконка
    MTRGImageData *icon = promoBanner.icon;
    // Текст действия для кнопки
    NSString *ctaText = promoBanner.ctaText;
    // Свойства, доступные только для объявлений, рекламирующих приложения
    if (promoBanner.navigationType == MTRGNavigationTypeStore))
    {
        // Рейтинг приложения (0-5)
        NSNumber *rating = promoBanner.rating;
        // Количество оценок
        NSUInteger votes = promoBanner.votes;
        // Категория приложения
        NSString *category = promoBanner.category;
        // Подкатегория приложения
        NSString *subcategory = promoBanner.subcategory;
    }
    // Свойства, доступные только для объявлений, рекламирующих сайты
    else if (promoBanner.navigationType == MTRGNavigationTypeWeb)
    {
        // Домен сайта
        NSString *domain = promoBanner.domain;
    }
     
    // Пример заполнения визуального компонента
    UIView *adView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 10, 200, 20)];
    titleLabel.text = title;
    UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 50, 200, 40)];
    descLabel.text = descriptionText;
    UIButton *ctaButton = [[UIButton alloc] initWithFrame:CGRectMake(210, 260, 80, 30)];
    [ctaButton setTitle:ctaText forState:UIControlStateNormal];
  
    // Создаем MTRGMediaAdView
    MTRGMediaAdView *mediaView = [MTRGNativeViewsFactory createMediaAdView];
    mediaView.frame = CGRectMake(10, 100, 280, 150);
    MTRGIconAdView *iconAdView = [MTRGNativeViewsFactory createIconAdView];
    iconAdView.frame = CGRectMake(10, 10, 50, 50);
     
    [adView addSubview:titleLabel];
    [adView addSubview:descLabel];
    [adView addSubview:iconAdView];
    [adView addSubview:mediaView];
    [adView addSubview:ctaButton];
 
    MTRGNativeAdContainer *containerView = [MTRGNativeAdContainer createWithAdView:adView];
    containerView.titleView = titleLabel;
    containerView.descriptionView = descLabel;
    containerView.iconView = iconAdView;
    containerView.mediaView = mediaView;
    containerView.ctaView = ctaButton;
     
    // Регистрируем визуальный компонент
    [nativeAd registerView:containerView withController:self];
  
    // Добавляем на экран
    [self.view addSubview:containerView];
}
Установка размеров MediaAdView

Соотношение сторон загруженной картинки может отличаться от размеров mediaView и необходимо скорректировать размеры с учётом нового значения mediaAdView.aspectRatio

Уведомление об изменении размеров можно получить подписавшись на делегат onImageSizeChanged: объекта mediaAdView

mediaAdView.delegate = self;
 
- (void)onImageSizeChanged:(MTRGMediaAdView *)mediaAdView
{
    CGFloat currentAspect = mediaView.frame.size.width / mediaView.frame.size.height;
    NSLog(@"current aspect of media view: %f", currentAspect);
   
    CGFloat actualAspect = mediaView.aspectRatio;
    NSLog(@"actual aspect of media view: %f", actualAspect);
}
Иконка AdChoices

myTarget SDK автоматически добавляет иконку AdChoices в каждый визуальный компонент. По умолчанию иконка добавляется в правый верхний угол визуального компонента, но вы вы можете выбрать предпочитаемый угол с помощью свойства adChoicesPlacement:

...
_ad.adChoicesPlacement = MTRGAdChoicesPlacementTopRight;
[_ad load];
Ручное позиционирование иконки AdChoices

Для ручного позиционирования иконки нужно выставить свойство adChoicesPlacement в значение MTRGAdChoicesPlacementManual. После чего при настройке визуального компонента нужно создать MTRGAdChoicesView и добавить его на рекламный компонент. Так вы сможете управлять позицией и размером иконки AdChoices, а также установить свою картинку.

Если картинка не была установлена, то SDK поставит свою иконку AdChoices в MTRGAdChoicesView после того, как вы зарегистрируете визуальный компонент в объекте рекламы.

- (void)setupAdChoicesView
{
     _ad.adChoicesPlacement = MTRGAdChoicesPlacementManual;
 
    MTRGAdChoicesView *adChoicesView = MTRGNativeViewsFactory.createAdChoicesView;
 
    // Устанавливаем свою картинку
    adChoicesView.imageView.image = [UIImage imageNamed:@"AdChoices"];
 
    [_adView addSubview:adChoicesView];
 
    // Можно использовать Autolayout или фреймы для расположения и указания размеров adChoicesView
}
Ручная отрисовка иконки AdChoices

Чтобы полностью управлять компонентом отображения AdChoices, нужно свойство adChoicesPlacement выставить в значение MTRGAdChoicesPlacementDrawingManual. Тогда создание, отображение контента, размещение иконки и обработка нажатия полностью отдается разработчикам.

Однако SDK предоставляет иконку AdChoices, которую вы можете использовать в своем компоненте (пункты «Автозагрузка изображение и видео» и «Уведомление об успешной загрузке ассетов»).

Получить информацию о наличии AdChoices (свойство hasAdChoices) и о иконке (свойство adChoicesIcon) можно у MTRGNativePromoBanner.

Чтобы уведомить SDK о том, что иконка AdChoices была нажата, у объекта рекламы нужно вызвать метод handleAdChoicesClickWithController:sourceView:.


- (void)setupAdChoicesView
{
    _ad.adChoicesPlacement = MTRGAdChoicesPlacementDrawingManual;
 
    _adChoicesButton = UIButton.new;
    [_adChoicesButton setImage:_ad.banner.adChoicesIcon.image forState:UIControlStateNormal];
    [_adChoicesButton addTarget:self action:@selector(adChoicesClick) forControlEvents:UIControlEventTouchUpInside];
    [_adView addSubview:_adChoicesButton];
 
    // Можно использовать Autolayout или фреймы для расположения и указания размеров adChoicesImageView
}
 
// Уведомляем SDK о том, что компонент AdChoices был нажат
- (void)adChoicesClick
{
    [_ad handleAdChoicesClickWithController:self sourceView:_adChoicesButton];
}
Настройка кликабельной области

В приведенном выше примере визуальный компонент регистрируется с помощью метода registerView:withController. В этом случае вся область визуального компонента является кликабельной. MyTarget SDK предоставляет возможность указать конкретные визуальные компоненты, клики на которые будут отслеживаться. Для этого воспользуйтесь методом registerView:withController:withClickableViews:

- (void)onLoadWithNativePromoBanner:(MTRGNativePromoBanner *)promoBanner nativeAd:(MTRGNativeAd *)nativeAd
{
    ...
    ...
    ...
     
    // Регистрируем визуальный компонент, с кликабельными заголовком и кнопкой призыва к действию
    [nativeAd registerView:adView withController:self withClickableViews:@[titleLabel, ctaButton]];
  
    // Добавляем на экран
    [self.view addSubview:adView];
}
Управление отображением меню AdChoices

Чтобы управлять отображением опций AdChoices нужно в соответствующий инициализатор передать объект, реализующий протокол MTRGMenuFactory. Протокол требует реализовать метод для создания меню. Меню же должно реализовывать протокол MTRGMenu. По умолчанию SDK использует UIAlertController со стилем actionSheet.

// Пример реализации меню
 
// Добавляем модель MTRGMenuAction в _items. Массив объектов, которые нужно будет показать в меню
- (void)addMenuAction:(nonnull MTRGMenuAction *)action
{
    [_items addObject:action];
}
 
// На основе _items создаем UIAlertController и отображаем его
- (void)presentInViewController:(nonnull UIViewController *)viewController sourceView:(nullable UIView *)sourceView
{
    UIAlertControllerStyle style = UIAlertControllerStyleAlert;
    MTRGAlertController *alert = [MTRGAlertController alertControllerWithTitle:nil message:nil preferredStyle:style];
 
    for (MTRGMenuAction *item in _items.copy)
    {
 
        UIAlertActionStyle actionStyle = (item.style == MTRGMenuActionStyleDefault) ? UIAlertActionStyleDefault : UIAlertActionStyleCancel;
 
        UIAlertAction *action = [UIAlertAction actionWithTitle:item.title
                                                         style:actionStyle
                                                       handler:^(UIAlertAction * _Nonnull action)
                                 {
            [item handleClick];
        }];
        [alert addAction:action];
    }
 
    [viewController presentViewController:alert animated:YES completion:nil];
}
Использование готового визуального компонента

MyTarget SDK предоставляет готовый настраиваемый визуальный компонент, внешний вид которого вы можете настраивать под дизайн своего приложения.

Ниже приведены примеры и описаны доступные для настройки свойства.
MTRGNativeAdView

- (void)onLoadWithNativePromoBanner:(MTRGNativePromoBanner *)promoBanner nativeAd:(MTRGNativeAd *)nativeAd
{
    // Создаем визуальный компонент
    MTRGNativeAdView *adView = [MTRGNativeViewsFactory createNativeAdView];
    adView.banner = promoBanner;
  
    // Доступные для настройки внутренние визуальные компоненты
    UILabel *titleLabel = adView.titleLabel;
    UILabel *descriptionLabel = adView.descriptionLabel;
    MTRGIconAdView *iconAdView = adView.iconAdView;
    MTRGMediaAdView *mediaView = adView.mediaAdView;
    UILabel *domainLabel = adView.domainLabel;
    UILabel *categoryLabel = adView.categoryLabel;
    UILabel *disclaimerLabel = adView.disclaimerLabel;
    MTRGStarsRatingView *ratingStarsView = adView.ratingStarsView;
    UILabel *votesLabel = adView.votesLabel;
    UIView *buttonView = adView.buttonView;
    UILabel *buttonToLabel = adView.buttonToLabel;
    UILabel *ageRestrictionsLabel = adView.ageRestrictionsLabel;
    UILabel *adLabel = adView.adLabel;
  
    // Отступы
    UIEdgeInsets titleMargins = adView.titleMargins;
    UIEdgeInsets domainMargins = adView.domainMargins;
    UIEdgeInsets categoryMargins = adView.categoryMargins;
    UIEdgeInsets descriptionMargins = adView.descriptionMargins;
    UIEdgeInsets disclaimerMargins = adView.disclaimerMargins;
    UIEdgeInsets imageMargins = adView.imageMargins;
    UIEdgeInsets iconMargins = adView.iconMargins;
    UIEdgeInsets ratingStarsMargins = adView.ratingStarsMargins;
    UIEdgeInsets votesMargins = adView.votesMargins;
    UIEdgeInsets buttonMargins = adView.buttonMargins;
    UIEdgeInsets buttonCaptionMargins = adView.buttonCaptionMargins;
    UIEdgeInsets adLabelMargins = adView.adLabelMargins;
    UIEdgeInsets ageRestrictionsMargins = adView.ageRestrictionsMargins;   
  
    // Регистрируем визуальный компонент
    [nativeAd registerView:adView withController:self];
     
    // Добавляем на экран
    [self.view addSubview:adView];
}
Загрузка нескольких баннеров

MyTarget SDK предоставляет класс MTRGNativeAdLoader, который даёт возможность загрузить от 1 до 20 баннеров одним запросом. Для MTRGNativeAdLoader вы можете настроить все те же параметры, которые доступны для настройки в MTRGNativeAd (например, параметры пола и возраста пользователя, автозагрузку изображений и видео). myTarget SDK не гарантирует, что будет загружено количество баннеров, указанное в параметре COUNT - этот параметр указывает на максимальное количество баннеров, которое вы хотите получить.

// Включение режима отладки
// [MTRGManager setDebugMode:YES];
 
 
// Создаем MTRGNativeAdLoader
MTRGNativeAdLoader *nativeAdLoader = [MTRGNativeAdLoader loaderForCount:COUNT slotId:YOUR_SLOT_ID];
 
// Загружаем баннеры
[nativeAdLoader loadWithCompletionBlock:^(NSArray<MTRGNativeAd *> * _Nonnull nativeAds)
{
    for (MTRGNativeAd *nativeAd in nativeAds)
    {
        // Устанавливаем делегат
        nativeAd.delegate = self;
         
        MTRGNativePromoBanner *promoBanner = nativeAd.banner;
        // Код, аналогичный методу onLoadWithNativePromoBanner протокола MTRGNativeAdDelegate
    }
}];
Полученный массив будет содержать от 0 до COUNT объектов MTRGNativeAd - каждый из них содержит уже загруженный MTRGNativePromoBanner и с каждым из них надо работать так же, как описано в этой документации выше, начиная с вызова метода onLoadWithNativePromoBanner.
Медиация с другими рекламными SDK

Для нативной рекламы поддерживается медиация с Admob SDK и Mopub SDK.

Медиация Admob

myTarget является сертифицированным партнером Google Mediation.

Требования:
  • Xcode 11 или выше
  • iOS Deployment target of 9.0 или выше
  • Google Mobile Ads SDK 7.57.0 или выше

Краткая инструкция для медиации myTarget через Admob:
  • Настроить группу медиации в настройках рекламного блока Admob
  • Импортировать myTarget SDK и адаптер (при установке адаптера с помощью менеджера зависимостей CocoaPods, автоматически будет установлены myTarget SDK и Google Mobile Ads SDK)
  • Протестировать интеграцию

Пожалуйста, ознакомьтесь с полной версией инструкции: https://developers.google.com/admob/ios/mediation/mytarget#step_2_configure_mediation_settings_for_your_ad_unit

Медиация Mopub
Необходимо подключить к проекту файлы из директории mediation Github репозитория https://github.com/myTargetSDK/mytarget-ios/tree/master/mediation

Настройка медиации осуществляется на сайте http://www.mopub.com/

Для создания сети медиации зайдите в раздел Networks и добавить Custom Native Network, где задать следующие поля:

Нативные баннеры

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

Нативный баннер не поддерживает MTRGMediaAdView и поэтому не может отображать медиа-контент (видео, карточки, большую картинку).

Инициализация

Для показа нативных баннеров в вашем приложении необходимо создать экземпляр класса MTRGNativeBannerAd. Для создания экземпляра MTRGNativeBannerAd необходимо указать ваш slotId.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGNativeBannerAd *_ad;
}
 
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
     
    // Создаем экземпляр MTRGNativeAd
    _ad = [MTRGNativeBannerAd nativeBannerAdWithSlotId:YOUR_SLOT_ID];
}
Загрузка рекламных объявлений

Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки, клик по рекламному объявлению) необходимо установить созданному экземпляру MTRGNativeBannerAd делегат, реализующий протокол MTRGNativeBannerAdDelegate, после чего можно запустить загрузку данных.

@interface YourViewController : UIViewController <MTRGNativeBannerAdDelegate>
@end
 
@implementation YourViewController
{
  MTRGNativePromoAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGNativeAd
    _ad = [MTRGNativeBannerAd nativeBannerAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем делегат
    _ad.delegate = self;
     
    // Запускаем загрузку данных
    [_ad load];
}
  
- (void)onLoadWithNativeBanner:(MTRGNativeBanner *)banner nativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
 
- (void)onNoAdWithReason:(NSString *)reason nativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
 
- (void)onAdShowWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
 
- (void)onAdClickWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
 
- (void)onShowModalWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
 
- (void)onDismissModalWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
 
- (void)onLeaveApplicationWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
}
Политика загрузки медиа файлов

Политика загрузки задает поведение SDK, если ему не удалось загрузить медиа файлы для рекламы. Политика устанавливается в свойстве bannerMediaRecovery у экземпляров классов MTRGNativeBannerAd и MTRGNativeBannerAdLoader. Допустимые значения: skip (по умолчанию) и retry.

Если MTRGNativeBannerAd не удалось загрузить медиа файлы при автозагрузке, то при:

  • skip, SDK закончит загрузку всей рекламы и вызовет метод делегата onLoadFailedWithError:nativeBannerAd:
  • retry, SDK будет повторять загрузку медиа указанное количество раз. Если медиа файлы все-таки не удастся загрузить, то в делегате вызовется onLoadFailedWithError:nativeBannerAd:.

Если MTRGNativeBannerAdLoader не удалось загрузить медиа файлы в баннере при автозагрузке, то при:
  • skip, SDK пропустит этот баннер. Причем на загрузку остальных баннеров лоадере это не повлияет.
  • retry, SDK будет повторять загрузку медиа для этого баннера указанное количество раз. Если ему все-таки не удастся их загрузить, то SDK пропустит такой баннер.

Политика также учитывается и при выключенной автозагрузке, когда медиа файлы загружаются асинхронно в момент вызова метода registerView.

При выключенной автозагрузке, если MTRGNativeBannerAd не удалось загрузить медиа файлы в registerView, то при:

  • skip, SDK отменит загрузку медиа файлов, которые еще не загрузились, и вызовет метод onMediaLoadFailedWithNativeBannerAd: у mediaDelegate.
  • retry, SDK будет повторять загрузку медиа файлов указанное количество раз. Если ему все-таки не удастся их загрузить, то в mediaDelegate вызовется метод onMediaLoadFailedWithNativeBannerAd:.
Помимо политики загрузки, есть возможность задать таймаут для загрузки медиа файлов. Устанавливается он в свойство bannerMediaTimeout и действует на медиа файлы в рамках баннера.
Автозагрузка изображений и видео

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

_ad.cachePolicy = MTRGCachePolicyNone;
[_ad load];
Допустимые значения: MTRGCachePolicyAll (по умолчанию), MTRGCachePolicyImages, MTRGCachePolicyNone.

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

Если предзагрузка изображений выключена, то они будут асинхронно и автоматически загружены в момент вызова метода registerView. Дополнительных действий не требуется.

Уведомления о загрузке медиа файлов

Для того чтобы получать уведомления о загрузке медиа файлов (в случае не автоматической загрузки) необходимо реализовать протокол MTRGNativeBannerAdMediaDelegate и установить свойство mediaDelegate у объекта MTRGNativeBannerAd.


@protocol MTRGNativeBannerAdMediaDelegate <NSObject>
 
- (void)onIconLoadWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd;
 
- (void)onAdChoicesIconLoadWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd;
 
- (void)onMediaLoadFailedWithNativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd;
 
@end
Уведомления о закрытии рекламы и управление закрытием рекламы

Для того чтобы получать уведомления о закрытии рекламы и управлять закрытием рекламы необходимо в свойство adChoicesOptionDelegate установить делегат, реализующий протокол MTRGNativeBannerAdChoicesOptionDelegate. Протокол содержит несколько методов.

  • shouldCloseAutomatically — говорит SDK о том, стоит ли автоматически закрывать рекламу. Если метод возвращает YES, то SDK автоматически скроет рекламу. Если NO, то возможность скрыть предоставляется разработчику. Метод опциональный и по умолчанию возвращает YES.
  • onCloseAutomatically — уведомляет разработчика, что реклама была скрыта автоматически, средствами SDK. Таким образом, этот метод вызовется, только если shouldCloseAutomatically вернет YES.
  • closeIfAutomaticallyDisabled — уведомляет разработчика, что ему нужно скрыть рекламу самостоятельно. Таким образом, этот метод вызовется, только если shouldCloseAutomatically вернет NO.
Показ рекламных объявлений

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

Для показа иконки следует использовать MTRGIconAdView, предоставляемый SDK.

После заполнения визуального компонента вы должны зарегистрировать его в экземпляре MTRGNativeBannerAd, используя метод registerView. Если вы собираетесь использовать этот же визуальный компонент для показа других рекламных объявлений, вам необходимо предварительно вызвать метод unregisterView у текущего экземпляра MTRGNativeBannerAd до вызова registerView у другого экземпляра. Обработка показов и кликов осуществляется автоматически, при этом приложение не должно блокировать или перехватывать пользовательские события на этом визуальном компоненте. Ниже описаны доступные свойства и приведены примеры заполнения визуальных компонентов для различных типов рекламируемых объектов.

Визуальные компоненты (как стандартные, так и собственные) следует положить внутрь контейнера MTRGNativeAdContainer.
При этом в метод registerView можно передавать как сам компонент, так и контейнер.
При создании контейнера, визуальный компонент adView будет добавлен как subview в контейнер и растянут по размерам контейнера.
Чтобы получить высоту визуального компонента в зависимости от его ширины (требуется для встраивания в TableView/CollectionView), необходимо вызвать метод sizeThatFits у контейнера (вызов метода проксируется в adView).
После создания контейнера нужно установить соответствие между доступными свойствами визуального компонента и свойствами контейнера.

- (void)onLoadWithNativeBanner:(MTRGNativeBanner *)banner nativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
    // Заголовок рекламного объявления
    NSString *title = banner.title;
    // Возрастное ограничение. Может быть nil
    NSString *ageRestrictions = banner.ageRestrictions;
    // Дисклеймер. Может быть nil
    NSString *disclaimer = banner.disclaimer;
    // Текст метки "Реклама"
    NSString *advertisingLabel = banner.advertisingLabel;
    // Иконка
    MTRGImageData *icon = banner.icon;
    // Текст действия для кнопки
    NSString *ctaText = banner.ctaText;
    // Свойства, доступные только для объявлений, рекламирующих приложения
    if (banner.navigationType == MTRGNavigationTypeStore))
    {
        // Рейтинг приложения (0-5)
        NSNumber *rating = banner.rating;
        // Количество оценок
        NSUInteger votes = banner.votes;
    }
    // Свойства, доступные только для объявлений, рекламирующих сайты
    else if (banner.navigationType == MTRGNavigationTypeWeb)
    {
        // Домен сайта
        NSString *domain = banner.domain;
    }
     
    // Пример заполнения визуального компонента
    UIView *adView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 50)];
 
    MTRGIconAdView *iconAdView = [MTRGNativeViewsFactory createIconAdView];
    iconAdView.frame = CGRectMake(0, 0, 50, 50);
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 15, 140, 20)];
    titleLabel.text = title;
    UIButton *ctaButton = [[UIButton alloc] initWithFrame:CGRectMake(210, 10, 80, 30)];
    [ctaButton setTitle:ctaText forState:UIControlStateNormal];
  
    [adView addSubview:titleLabel];
    [adView addSubview:iconAdView];
    [adView addSubview:ctaButton];
 
    MTRGNativeAdContainer *containerView = [MTRGNativeAdContainer createWithAdView:adView];
    containerView.titleView = titleLabel;
    containerView.iconView = iconAdView;
    containerView.ctaView = ctaButton;
     
    // Регистрируем визуальный компонент
    [nativeBannerAd registerView:containerView withController:self];
  
    // Добавляем на экран
    [self.view addSubview:containerView];
}
Иконка AdChoices

myTarget SDK автоматически добавляет иконку AdChoices в каждый визуальный компонент. По умолчанию иконка добавляется в правый верхний угол визуального компонента, но вы вы можете выбрать предпочитаемый угол с помощью свойства adChoicesPlacement:

...
_ad.adChoicesPlacement = MTRGAdChoicesPlacementTopRight;
[_ad load]; 
Ручное позиционирование иконки AdChoices

Для ручного позиционирования иконки нужно выставить свойство adChoicesPlacement в значение MTRGAdChoicesPlacementManual. После чего при настройке визуального компонента нужно создать MTRGAdChoicesView и добавить его на рекламный компонент. Так вы сможете управлять позицией и размером иконки AdChoices, а также установить свою картинку. Если картинка не была установлена, то SDK поставить свою иконку AdChoices в MTRGAdChoicesView после того, как вы зарегистрируете визуальный компонент в объекте рекламы.

- (void)setupAdChoicesView
{
     _ad.adChoicesPlacement = MTRGAdChoicesPlacementManual;
 
    MTRGAdChoicesView *adChoicesView = MTRGNativeViewsFactory.createAdChoicesView;
 
    // Устанавливаем свою картинку
    adChoicesView.imageView.image = [UIImage imageNamed:@"AdChoices"];
 
    [_adView addSubview:adChoicesView];
 
    // Можно использовать Autolayout или фреймы для расположения и указания размеров adChoicesView
}
Ручная отрисовка иконки AdChoices

Чтобы полностью управлять компонентом отображения AdChoices, нужно свойство adChoicesPlacement выставить в значение MTRGAdChoicesPlacementDrawingManual. Тогда создание, отображение контента, размещение иконки и обработка нажатия полностью отдается разработчикам. Однако SDK предоставляет иконку AdChoices, которую вы можете использовать в своем компоненте (пункты «Автозагрузка изображение и видео» и «Уведомление об успешной загрузке ассетов»). Получить информацию о наличии AdChoices (свойство hasAdChoices) и о иконке (свойство adChoicesIcon) можно у MTRGNativeBanner. Чтобы уведомить SDK о том, что иконка AdChoices была нажата, у объекта рекламы нужно вызвать метод handleAdChoicesClickWithController:sourceView:.


- (void)setupAdChoicesView
{
    _ad.adChoicesPlacement = MTRGAdChoicesPlacementDrawingManual;
 
    _adChoicesButton = UIButton.new;
    [_adChoicesButton setImage:_ad.banner.adChoicesIcon.image forState:UIControlStateNormal];
    [_adChoicesButton addTarget:self action:@selector(adChoicesClick) forControlEvents:UIControlEventTouchUpInside];
    [_adView addSubview:_adChoicesButton];
 
    // Можно использовать Autolayout или фреймы для расположения и указания размеров adChoicesImageView
}
 
// Уведомляем SDK о том, что компонент AdChoices был нажат
- (void)adChoicesClick
{
    [_ad handleAdChoicesClickWithController:self sourceView:_adChoicesButton];
}
Настройка кликабельной области

В приведенном выше примере визуальный компонент регистрируется с помощью метода registerView:withController. В этом случае вся область визуального компонента является кликабельной. MyTarget SDK предоставляет возможность указать конкретные визуальные компоненты, клики на которые будут отслеживаться. Для этого воспользуйтесь методом registerView:withController:withClickableViews:

- (void)onLoadWithNativeBanner:(MTRGNativeBanner *)banner nativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
    ...
    ...
    ...
     
    // Регистрируем визуальный компонент, с кликабельными заголовком и кнопкой призыва к действию
    [nativeBannerAd registerView:adView withController:self withClickableViews:@[titleLabel, ctaButton]];
  
    // Добавляем на экран
    [self.view addSubview:adView];
}
Управление отображением меню AdChoices

Чтобы управлять отображением опций AdChoices нужно в соответствующий инициализатор передать объект, реализующий протокол MTRGMenuFactory. Протокол требует реализовать метод для создания меню. Меню же должно реализовывать протокол MTRGMenu. По умолчанию SDK использует UIAlertController со стилем actionSheet.


// Пример реализации меню
 
// Добавляем модель MTRGMenuAction в _items. Массив объектов, которые нужно будет показать в меню
- (void)addMenuAction:(nonnull MTRGMenuAction *)action
{
    [_items addObject:action];
}
 
// На основе _items создаем UIAlertController и отображаем его
- (void)presentInViewController:(nonnull UIViewController *)viewController sourceView:(nullable UIView *)sourceView
{
    UIAlertControllerStyle style = UIAlertControllerStyleAlert;
    MTRGAlertController *alert = [MTRGAlertController alertControllerWithTitle:nil message:nil preferredStyle:style];
 
    for (MTRGMenuAction *item in _items.copy)
    {
 
        UIAlertActionStyle actionStyle = (item.style == MTRGMenuActionStyleDefault) ? UIAlertActionStyleDefault : UIAlertActionStyleCancel;
 
        UIAlertAction *action = [UIAlertAction actionWithTitle:item.title
                                                         style:actionStyle
                                                       handler:^(UIAlertAction * _Nonnull action)
                                 {
            [item handleClick];
        }];
        [alert addAction:action];
    }
 
    [viewController presentViewController:alert animated:YES completion:nil];
}
Использование готового визуального компонента

MyTarget SDK предоставляет готовый настраиваемый визуальный компонент, внешний вид которого вы можете настраивать под дизайн своего приложения.

Ниже приведены примеры и описаны доступные для настройки свойства.
MTRGNativeBannerAdView

- (void)onLoadWithNativeBanner:(MTRGNativeBanner *)banner nativeBannerAd:(MTRGNativeBannerAd *)nativeBannerAd
{
    // Создаем визуальный компонент
    MTRGNativeBannerAdView *adView = [MTRGNativeViewsFactory createNativeBannerAdView];
    adView.banner = banner;
  
    // Доступные для настройки внутренние визуальные компоненты
    UILabel *titleLabel = adView.titleLabel;
    MTRGIconAdView *iconAdView = adView.iconAdView;
    UILabel *domainLabel = adView.domainLabel;
    UILabel *disclaimerLabel = adView.disclaimerLabel;
    MTRGStarsRatingView *ratingStarsView = adView.ratingStarsView;
    UILabel *votesLabel = adView.votesLabel;
    UIView *buttonView = adView.buttonView;
    UILabel *buttonToLabel = adView.buttonToLabel;
    UILabel *ageRestrictionsLabel = adView.ageRestrictionsLabel;
    UILabel *adLabel = adView.adLabel;
  
    // Отступы
    UIEdgeInsets titleMargins = adView.titleMargins;
    UIEdgeInsets domainMargins = adView.domainMargins;
    UIEdgeInsets disclaimerMargins = adView.disclaimerMargins;
    UIEdgeInsets iconMargins = adView.iconMargins;
    UIEdgeInsets ratingStarsMargins = adView.ratingStarsMargins;
    UIEdgeInsets votesMargins = adView.votesMargins;
    UIEdgeInsets buttonMargins = adView.buttonMargins;
    UIEdgeInsets buttonCaptionMargins = adView.buttonCaptionMargins;
    UIEdgeInsets adLabelMargins = adView.adLabelMargins;
    UIEdgeInsets ageRestrictionsMargins = adView.ageRestrictionsMargins;  
  
    // Регистрируем визуальный компонент
    [nativeBannerAd registerView:adView withController:self];
     
    // Добавляем на экран
    [self.view addSubview:adView];
}
Загрузка нескольких баннеров

MyTarget SDK предоставляет класс MTRGNativeBannerAdLoader, который даёт возможность загрузить от 1 до 20 баннеров одним запросом. Для MTRGNativeBannerAdLoader вы можете настроить все те же параметры, которые доступны для настройки в MTRGNativeBannerAd (например, параметры пола и возраста пользователя, автозагрузку изображений и видео). myTarget SDK не гарантирует, что будет загружено количество баннеров, указанное в параметре COUNT - этот параметр указывает на максимальное количество баннеров, которое вы хотите получить.

// Включение режима отладки
// [MTRGManager setDebugMode:YES];
 
 
// Создаем MTRGNativeBannerAdLoader
MTRGNativeBannerAdLoader *nativeBannerAdLoader = [MTRGNativeBannerAdLoader loaderForCount:COUNT slotId:YOUR_SLOT_ID];
 
// Загружаем баннеры
[nativeBannerAdLoader loadWithCompletionBlock:^(NSArray<MTRGNativeBannerAd *> * _Nonnull nativeBannerAds)
{
    for (MTRGNativeBannerAd *nativeBannerAd in nativeBannerAds)
    {
        // Устанавливаем делегат
        nativeBannerAd.delegate = self;
         
        MTRGNativeBanner *banner = nativeBannerAd.banner;
        // Код, аналогичный методу onLoadWithNativeBanner протокола MTRGNativeBannerAdDelegate
    }
}];
Полученный массив будет содержать от 0 до COUNT объектов MTRGNativeBannerAd - каждый из них содержит уже загруженный MTRGNativeBanner и с каждым из них надо работать так же, как описано в этой документации выше, начиная с вызова метода onLoadWithNativeBanner.

In-stream видео

myTarget SDK предоставляет возможность показывать in-stream видео-рекламу в своем приложении, во время просмотра видео. Реклама может быть показана перед началом показа видео (preroll), во время показа (midroll) и после показа (postroll).

SDK загружает данные и предоставляет приложению возможность показывать рекламу как в своем видео-плеере, так и в плеере приложения.
Инициализация

Для показа рекламного видео в вашем приложении необходимо создать экземпляр класса MTRGInstreamAd. Для создания экземпляра MTRGInstreamAd необходимо указать ваш slotId. Для каждого видео в приложении требуется создавать свой экземпляр класса MTRGInstreamAd.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGInstreamAd *_ad;
}
 
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
    // Создаем экземпляр MTRGInstreamAd
    _ad = [MTRGInstreamAd instreamAdWithSlotId:YOUR_SLOT_ID];
}
Использование плеера приложения

Для проигрывания рекламы в плеере приложения, он должен реализовывать протокол MTRGInstreamAdPlayer и уведомлять установленный ему делегат MTRGInstreamAdPlayerDelegate.

Для использования своего плеера надо установить его свойству player созданного экземпляра MTRGInstreamAd.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGInstreamAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAd
    _ad = [MTRGInstreamAd instreamAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем плеер
    _ad.player = YOUR_PLAYER;
}
Протокол MTRGInstreamAdPlayer

Методы протокола MTRGInstreamAdPlayer вызываются экземпляром MTRGInstreamAd. Вызывать их самостоятельно не требуется.

@property(nonatomic, readonly) NSTimeInterval adVideoDuration;

Длительность рекламного видео.

@property(nonatomic, readonly) NSTimeInterval adVideoTimeElapsed;

Текущая позиция рекламного видео. Метод вызывается многократно во время воспроизведения рекламного видео и должен отдавать актуальное значение в секундах.

@property(nonatomic, weak) id <MTRGInstreamAdPlayerDelegate> adPlayerDelegate;

Устанавливает делегат плеера.

@property(nonatomic, readonly) UIView *adPlayerView;
Визуальное представление плеера, обычно self.

@property(nonatomic) float volume;

Устанавливает громкость от 0 до 1.

- (void)playAdVideoWithUrl:(NSURL *)url;

Запускает воспроизведение рекламного видео.

url — путь к видео

- (void)pauseAdVideo;
Приостанавливает проигрывание рекламного видео.

- (void)resumeAdVideo;

Возобновляет проигрывание рекламного видео.

- (void)stopAdVideo;

Останавливает проигрывание рекламного видео.
Протокол MTRGInstreamAdPlayerDelegate

Методы обратного вызова протокола MTRGInstreamAdPlayerDelegate для установленного делегата должны быть вызваны плеером в ответ на вызовы методов протокола MTRGInstreamAdPlayer при наступлении определенных событий.

- (void)onAdVideoStart;

Метод должен быть вызван после успешного начала воспроизведения рекламного видео, как ответ на вызов метода playAdVideo.

- (void)onAdVideoPause;

Метод должен быть вызван после приостановки проигрывания рекламного видео, как ответ на вызов метода pauseAdVideo.

- (void)onAdVideoResume;

Метод должен быть вызван после возобновления проигрывания рекламного видео, как ответ на вызов метода resumeAdVideo.

- (void)onAdVideoStop;

Метод должен быть вызван после остановки проигрывания рекламного видео, как ответ на вызов метода stopAdVideo.

- (void)onAdVideoErrorWithReason:(NSString *)reason;

Метод должен быть вызван при возникновении какой-либо ошибки при проигрывании рекламного видео.

- (void)onAdVideoComplete;

Метод должен быть вызван при завершении проигрывания рекламного видео.
Использование плеера SDK

myTarget SDK предоставляет готовый плеер для проигрывания рекламы. Для использования плеера SDK достаточно вызвать метод useDefaultPlayer у созданного экземпляра MTRGInstreamAd и добавить плеер на экран приложения.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGInstreamAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAd
    _ad = [MTRGInstreamAd instreamAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем плеер SDK
    [_ad useDefaultPlayer];
    // Добавляем плеер на экран
    [self.view addSubview:_ad.player.adPlayerView];
}
Загрузка рекламных объявлений

Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки, показ рекламного объявления) необходимо установить созданному экземпляру MTRGInstreamAd делегат, реализующий протокол MTRGInstreamAdDelegate, после чего можно запустить загрузку данных.


@interface YourViewController : UIViewController <MTRGInstreamAdDelegate>
@end
 
@implementation YourViewController
{
  MTRGInstreamAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAd
    _ad = [MTRGInstreamAd instreamAdWithSlotId:YOUR_SLOT_ID];
     
    // Устанавливаем делегат
    _ad.delegate = self;
 
    // Запускаем загрузку данных
    [_ad load];
}
 
- (void)onLoadWithInstreamAd:(MTRGInstreamAd *)instreamAd
{
   // Данные успешно загружены
}
 
- (void)onNoAdWithReason:(NSString *)reason instreamAd:(MTRGInstreamAd *)instreamAd
{
   // Данные не получены
}
 
- (void)onErrorWithReason:(NSString *)reason instreamAd:(MTRGInstreamAd *)instreamAd
{
   // При проигрывании рекламного видео произошла ошибка
}
 
- (void)onBannerStart:(MTRGInstreamAdBanner *)banner instreamAd:(MTRGInstreamAd *)instreamAd
{
   // Началось проигрывание рекламного видео
}
 
- (void)onBannerComplete:(MTRGInstreamAdBanner *)banner instreamAd:(MTRGInstreamAd *)instreamAd
{
   // Проигрывание рекламного видео завершено
}
 
- (void)onBannerTimeLeftChange:(NSTimeInterval)timeLeft duration:(NSTimeInterval)duration instreamAd:(MTRGInstreamAd *)instreamAd
{
   // Вызывается многократно во время воспроизведения рекламного видео, используется для обновления таймера до окончания показа рекламного видео
}
 
- (void)onCompleteWithSection:(NSString *)section instreamAd:(MTRGInstreamAd *)instreamAd
{
   // Проигрывание всех рекламных видео в рекламной секции завершено
}
 
- (void)onShowModalWithInstreamAd:(MTRGInstreamAd *)instreamAd
{
}
 
- (void)onDismissModalWithInstreamAd:(MTRGInstreamAd *)instreamAd
{
}
 
- (void)onLeaveApplicationWithInstreamAd:(MTRGInstreamAd *)instreamAd
{
}
Показ рекламных объявлений

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

Каждая секция секция может содержать несколько рекламных видео, после начала проигрывания каждого будет вызван метод onBannerStart в установленном делегате MTRGInstreamAdDelegate, после завершения проигрывания каждого видео будет вызван метод onBannerComplete.

После завершения проигрывания всех рекламных видео в запущенной секции будет вызван метод onComplete — именно его вы должны использовать для дальнейших действий, он будет вызван даже если в процессе проигрывания произошла ошибка и был вызван метод onError.
Показ preroll и postroll секций

Для показа preroll секции необходимо перед началом показа видео вызвать метод startPreroll у экземпляра InstreamAd.

Для показа postroll секции необходимо после окончания показа видео вызвать метод startPostroll.

// Перед началом показа основного видео
[_ad startPreroll];
 
// После показа основного видео
[_ad startPostroll];
Показ midroll секции

Для показа midroll секции в какой-то позиции видео, необходимо после создания экземпляра MTRGInstreamAd задать массив позиций, на которых планируется показ midroll секции.

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

Если позиции не были заданы приложением, они будут установлены сервером.

Если массив позиций после загрузки оказался пустой, значит данных для показа midroll секции нет.

@interface YourViewController : UIViewController <MTRGInstreamAdDelegate>
@end
 
@implementation YourViewController
{
    MTRGInstreamAd *_ad;
    NSArray <NSNumber *> *_adPositions;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAd
    _ad = [MTRGInstreamAd instreamAdWithSlotId:YOUR_SLOT_ID];
 
    // Устанавливаем позиции на первой и пятой секунде видео
    [_ad configureMidpoints:@[@1, @5] forVideoDuration:_videoDuration];
    // или в процентах, на 10% и 50% видео
    // [_ad configureMidpointsP:@[@10, @50] forVideoDuration:_videoDuration];
     
    // Устанавливаем делегат
    _ad.delegate = self;
  
    // Запускаем загрузку данных
    [_ad load];
}
  
- (void)onLoadWithInstreamAd:(MTRGInstreamAd *)instreamAd
{
    // Данные успешно загружены
    // Массив позиций (в секундах), доступных для показа midroll секции
    _adPositions = _ad.midpoints;
}
При достижении основным видео одной из позиций для midroll секции, необходимо вызвать метод startMidroll и передать в него в качестве параметра эту позицию.

// Видео доигралось до 5й секунды и для неё есть позиция в массиве adPositions
[_ad startMidrollWithPoint:_adPositions[1]];
Доступные свойства рекламного видео

В методы onBannerStart и onBannerComplete делегата MTRGInstreamAdDelegate передается экземпляр MTRGInstreamAdBanner, содержащий информацию о текущем рекламном видео, которая может быть использована приложением.

@property(nonatomic) NSTimeInterval duration;

Длительность текущего рекламного видео в секундах.

@property(nonatomic) BOOL allowClose;

Разрешено ли закрывать рекламное видео во время проигрывания. Используется для управления показом кнопки «Закрыть» или «Пропустить».

@property(nonatomic) NSTimeInterval allowCloseDelay;
Время в секундах, через которое рекламное видео может быть закрыто. Используется для управления показом кнопки «Закрыть» или «Пропустить».

@property(nonatomic) CGSize size;

Ширина и высота рекламного видео.

@property(nonatomic, copy) NSString *ctaText;
Текст для call-to-action кнопки.
Обработка кликов

Приложение должно самостоятельно отслеживать клики по рекламному видео (как правило, по cta кнопке) и вызывать метод handleClickWithController в экземпляре MTRGInstreamAd для обработки клика и перехода на рекламируемый сайт или приложение.

- (void)onAdClick
{
    [_ad handleClickWithController:self];
}
Обработка кликов AdChoices

Приложение должно самостоятельно добавить компонент отображения AdChoices. MTRGInstreamAdBanner предоставляет информацию о наличии AdChoices (свойство hasAdChoices), его иконку (свойство adChoiecsImage) и рекламный текст (свойство advertisingLabel).

Чтобы уведомить SDK о нажатии на компонент отображения AdChoices нужно вызвать метод handleAdChoicesWithController:sourceView:. После чего SDK отобразит меню AdChoices.

Если в меню пользователь выбрал опцию с закрытием рекламы, то SDK уведомит об этом разработчика в методе делегата onBannerShouldClose:instreamAd:.

// вручную добавляем компонент отображения AdChoices
- (void)setupAdChoicesView
{
    _adChoicesButton = UIButton.new;
    [_adChoicesButton addTarget:self action:@selector(adChoicesClick) forControlEvents:UIControlEventTouchUpInside];
    [_adChoicesButton setHidden:YES];
    [_playerView addSubview:_adChoicesButton];
}
 
// сообщаем SDK, что AdChoices был нажат
- (void)adChoicesClick
{
    [_ad handleAdChoicesClickWithController:self sourceView:_adChoicesButton];
}
 
// Отображаем компонент AdChoices, когда баннер начинает проигрываться
- (void)onBannerStart:(MTRGInstreamAdBanner *)banner instreamAd:(MTRGInstreamAd *)instreamAd
{
    BOOL hasAdChocies = banner.adChoicesImage != nil && banner.hasAdChoices;
    [_adChoicesButton setImage:banner.adChoicesImage forState:UIControlStateNormal];
    _adChoicesButton.hidden = !hasAdChocies;
}
 
// Если пользователь выбрал опцию закрытия рекламы, то пропускаем рекламу
- (void)onBannerShouldClose:(MTRGInstreamAdBanner *)banner instreamAd:(MTRGInstreamAd *)instreamAd
{
    [_ad skipBanner];
}
Управление отображением меню AdChoices

Чтобы управлять отображением опций AdChoices нужно в соответствующий инициализатор передать объект, реализующий протокол MTRGMenuFactory. Протокол требует реализовать метод для создания меню. Меню же должно реализовывать протокол MTRGMenu. По умолчанию SDK использует UIAlertController со стилем actionSheet.

// Пример реализации меню
 
// Добавляем модель MTRGMenuAction в _items. Массив объектов, которые нужно будет показать в меню
- (void)addMenuAction:(nonnull MTRGMenuAction *)action
{
    [_items addObject:action];
}
 
// На основе _items создаем UIAlertController и отображаем его
- (void)presentInViewController:(nonnull UIViewController *)viewController sourceView:(nullable UIView *)sourceView
{
    UIAlertControllerStyle style = UIAlertControllerStyleAlert;
    MTRGAlertController *alert = [MTRGAlertController alertControllerWithTitle:nil message:nil preferredStyle:style];
 
    for (MTRGMenuAction *item in _items.copy)
    {
 
        UIAlertActionStyle actionStyle = (item.style == MTRGMenuActionStyleDefault) ? UIAlertActionStyleDefault : UIAlertActionStyleCancel;
 
        UIAlertAction *action = [UIAlertAction actionWithTitle:item.title
                                                         style:actionStyle
                                                       handler:^(UIAlertAction * _Nonnull action)
                                 {
            [item handleClick];
        }];
        [alert addAction:action];
    }
 
    [viewController presentViewController:alert animated:YES completion:nil];
}
Управление состоянием

У экземпляра MTRGInstreamAd доступны следующие методы управления.

- (void)pause;

Приостанавливает проигрывание рекламного видео.

- (void)resume;

Возобновляет проигрывание рекламного видео.

- (void)stop;

Останавливает показ рекламной секции.

- (void)skip;

Останавливает показ рекламной секции, если это было сделано пользователем (нажатие на кнопку «Пропустить» или «Закрыть»).

- (void)skipBanner;

Останавливает текущее рекламное видео и переходит к следующему, если это было сделано пользователем (нажатие на кнопку «Пропустить» или «Закрыть»).

@property(nonatomic) float volume;
Устанавливает громкость от 0 до 1.

@property(nonatomic) NSUInteger loadingTimeout;

Устанавливает таймаут на загрузку рекламы в секундах. В случае если по истечению указанного интервала не удалось получить баннеры, будет вызван коллбек onNoAd. Значение по умолчанию — 10 секунд, минимальное значение — 5 секунд.
Пользовательские данные

Для лучшего подбора рекламных объявлений, вы можете дополнительно задать пол и возраст пользователя. Если ваше приложение использует собственную модель локализации, вы также можете указать язык выбранной локализации в формате ISO 639-1 ("ru", "en", "fr" и т.д.).

Для задания пользовательских данных вам нужно воспользоваться свойством customParams.

@interface YourViewController : UIViewController
@end
 
@implementation YourViewController
{
  MTRGInstreamAd *_ad;
}
 
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAd
    _ad = [MTRGInstreamAd instreamAdWithSlotId:YOUR_SLOT_ID];
  
    // Задаем возраст
    _ad.customParams.age = [NSNumber numberWithInt:25];
    // Задаем пол
    _ad.customParams.gender = MTRGGenderMale;
}
Примеры

Примеры интеграции доступны в нашем демоприложении на Github.

In-stream аудио

myTarget SDK предоставляет возможность проигрывать in-stream аудио-рекламу в своем приложении во время прослушивания аудио.

Реклама может быть запущена перед началом проигрывания аудио (preroll), во время проигрывания (midroll) и после проигрывания (postroll). SDK загружает данные и предоставляет приложению возможность проигрывать рекламу в плеере приложения.
Инициализация

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

Для создания экземпляра MTRGInstreamAudioAd необходимо указать ваш slotId. Для каждого аудио в приложении требуется создавать свой экземпляр класса MTRGInstreamAudioAd.

@interface YourViewController : UIViewController
@end
  
@implementation YourViewController
{
  MTRGInstreamAudioAd *_ad;
}
  
- (void)initAd
{
    // Включение режима отладки
    // [MTRGManager setDebugMode:YES];
    // Создаем экземпляр MTRGInstreamAudioAd
    _ad = [MTRGInstreamAudioAd instreamAudioAdWithSlotId:YOUR_SLOT_ID];
}
Использование плеера приложения

Для проигрывания рекламы в плеере приложения, он должен реализовывать протокол MTRGInstreamAudioAdPlayer и уведомлять установленный ему делегат MTRGInstreamAudioAdPlayerDelegate.

Для использования своего плеера надо установить его в свойство player у созданного экземпляра MTRGInstreamAudioAd.

@interface YourViewController : UIViewController
@end
  
@implementation YourViewController
{
  MTRGInstreamAudioAd *_ad;
}
  
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAudioAd
    _ad = [MTRGInstreamAudioAd instreamAudioAdWithSlotId:YOUR_SLOT_ID];
      
    // Устанавливаем плеер
    _ad.player = YOUR_PLAYER;
}
Протокол MTRGInstreamAudioAdPlayer

Методы протокола MTRGInstreamAudioAdPlayer вызываются экземпляром MTRGInstreamAudioAd. Вызывать их самостоятельно не требуется.

@property(nonatomic, readonly) NSTimeInterval adAudioDuration;
Длительность рекламного аудио

@property(nonatomic, readonly) NSTimeInterval adAudioTimeElapsed;
Текущая позиция рекламного аудио. Метод вызывается многократно во время проигрывания рекламного аудио и должен отдавать актуальное значение в секундах.

@property(nonatomic, weak) id <MTRGInstreamAudioAdPlayerDelegate> adPlayerDelegate;
Устанавливает делегат плеера

@property(nonatomic) float volume;
Текущий контекст.

- (void)playAdAudioWithUrl:(NSURL *)url;
Запускает воспроизведение рекламного аудио.

uri — путь к аудио

- (void)pauseAdAudio;

Приостанавливает проигрывание рекламного аудио.

- (void)resumeAdAudio;
Возобновляет проигрывание рекламного аудио.

- (void)stopAdAudio;
Останавливает проигрывание рекламного аудио.
Протокол MTRGInstreamAudioAdPlayerDelegate

Методы обратного вызова протокола MTRGInstreamAudioAdPlayerDelegate для установленного делегата должны быть вызваны плеером в ответ на вызовы методов протокола MTRGInstreamAudioAdPlayer при наступлении определенных событий.

- (void)onAdAudioStart;

Метод должен быть вызван после успешного начала воспроизведения рекламного аудио, как ответ на вызов метода playAdAudioWithUrl..

- (void)onAdAudioPause;
Метод должен быть вызван после приостановки проигрывания рекламного аудио, как ответ на вызов метода pauseAdAudio.

- (void)onAdAudioResume;

Метод должен быть вызван после возобновления проигрывания рекламного аудио, как ответ на вызов метода resumeAdAudio.

- (void)onAdAudioStop;
Метод должен быть вызван после остановки проигрывания рекламного аудио, как ответ на вызов метода stopAdAudio.

- (void)onAdAudioErrorWithReason:(NSString *)reason;

Метод должен быть вызван при возникновении какой-либо ошибки при проигрывании рекламного аудио.

- (void)onAdAudioComplete;

Метод должен быть вызван при завершении проигрывания рекламного аудио.
Загрузка рекламных объявлений

Для получения уведомлений (таких как успешная загрузка данных или ошибка загрузки) необходимо установить созданному экземпляру MTRGInstreamAudioAd делегат, реализующий протокол MTRGInstreamAudioAdDelegate, после чего можно запустить загрузку данных.

interface YourViewController : UIViewController <MTRGInstreamAudioAdDelegate>
@end
  
@implementation YourViewController
{
  MTRGInstreamAudioAd *_ad;
}
  
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAudioAd
    _ad = [MTRGInstreamAudioAd instreamAudioAdWithSlotId:YOUR_SLOT_ID];
      
    // Устанавливаем делегат
    _ad.delegate = self;
  
    // Запускаем загрузку данных
    [_ad load];
}
  
- (void)onLoadWithInstreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // Данные успешно загружены
}
  
- (void)onNoAdWithReason:(NSString *)reason instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // Данные не получены
}
  
- (void)onErrorWithReason:(NSString *)reason instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // При проигрывании рекламного видео произошла ошибка
}
  
- (void)onBannerStart:(MTRGInstreamAudioAdBanner *)banner instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // Началось проигрывание рекламного видео
}
  
- (void)onBannerComplete:(MTRGInstreamAudioAdBanner *)banner instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // Проигрывание рекламного видео завершено
}
  
- (void)onBannerTimeLeftChange:(NSTimeInterval)timeLeft duration:(NSTimeInterval)duration instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // Вызывается многократно во время воспроизведения рекламного видео, используется для обновления таймера до окончания показа рекламного видео
}
  
- (void)onCompleteWithSection:(NSString *)section instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
   // Проигрывание всех рекламных видео в рекламной секции завершено
}
  
- (void)onShowModalWithInstreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
}
  
- (void)onDismissModalWithInstreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
}
  
- (void)onLeaveApplicationWithInstreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
}
Проигрывание рекламных объявлений

После успешной загрузки данных вы можете запустить проигрывание рекламных секций. Каждая секция секция может содержать несколько рекламных аудио, после начала проигрывания каждого будет вызван метод onBannerStart в установленном делегате MTRGInstreamAudioAdDelegate, после завершения проигрывания каждого аудио будет вызван метод onBannerComplete.

После завершения проигрывания всех рекламных аудио в запущенной секции будет вызван метод onComplete — именно его вы должны использовать для дальнейших действий. Он будет вызван даже если в процессе проигрывания произошла ошибка и был вызван метод onError.
Для проигрывания preroll секции необходимо перед началом проигрывания аудио вызвать метод startPreroll у экземпляра MTRGInstreamAudioAd.

Для проигрывания postroll секции необходимо после окончания проигрывания аудио вызвать метод startPostroll.

// Перед началом показа основного видео
[_ad startPreroll];
  
// После показа основного видео
[_ad startPostroll];
Показ midroll секции

Для проигрывания midroll секции в какой-то позиции аудио необходимо после создания экземпляра MTRGInstreamAudioAd задать массив позиций, на которых планируется проигрывание midroll секции. Позиции можно задавать как в секундах, так и в процентах от длительности аудио.

После успешной загрузки данных станет доступен массив позиций, для которых есть рекламные аудио. То есть если были заданы позиции на первой и пятой секунде, а рекламные аудио в загруженных данных есть только для первой, то в доступном массиве будет только одна первая позиция. Если позиции не были заданы приложением, они будут установлены сервером.

Если массив позиций после загрузки оказался пустой, значит данных для проигрывания midroll секции нет.

@interface YourViewController : UIViewController <MTRGInstreamAudioAdDelegate>
@end
  
@implementation YourViewController
{
    MTRGInstreamAudioAd *_ad;
    NSArray <NSNumber *> *_adPositions;
}
  
- (void)initAd
{
    // Создаем экземпляр MTRGInstreamAudioAd
    _ad = [MTRGInstreamAudioAd instreamAudioAdWithSlotId:YOUR_SLOT_ID];
  
    // Устанавливаем позиции на первой и пятой секунде аудио
    [_ad configureMidpoints:@[@1, @5] forVideoDuration:_videoDuration];
    // или в процентах, на 10% и 50% аудио
    // [_ad configureMidpointsP:@[@10, @50] forVideoDuration:_videoDuration];
      
    // Устанавливаем делегат
    _ad.delegate = self;
   
    // Запускаем загрузку данных
    [_ad load];
}
   
- (void)onLoadWithInstreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
    // Данные успешно загружены
    // Массив позиций (в секундах), доступных для показа midroll секции
    _adPositions = _ad.midpoints;
}
При достижении основным аудио одной из позиций для midroll секции, необходимо вызвать метод startMidroll и передать в него в качестве параметра эту позицию.

// Аудио доигралось до 5-й секунды и для неё есть позиция в массиве adPositions
[_ad startMidrollWithPoint:_adPositions[1]];
Доступные свойства рекламного аудио

В методы onBannerStart и onBannerComplete делегата MTRGInstreamAudioAdDelegate передается экземпляр MTRGInstreamAudioAdBanner, содержащий информацию о текущем рекламном аудио, которая может быть использована приложением.

@property(nonatomic) NSTimeInterval duration;

Длительность текущего рекламного аудио в секундах.

@property(nonatomic) BOOL allowSeek;

Разрешено ли прокручивать рекламное аудио.

@property(nonatomic) BOOL allowSkip;

Разрешено ли пропускать рекламное аудио.

@property(nonatomic) BOOL allowTrackChange;

Разрешено ли переходить к следующему треку.

@property(nonatomic) NSArray<MTRGInstreamAdCompanionBanner *> *companionBanners;

Список баннеров-компаньонов.

@property(nonatomic, copy) NSString *adText;

Рекламный текст.
Работа с баннерами-компаньонами

Приложение должно самостоятельно отслеживать показы и клики по баннерам-компаньонам и вызывать методы handleCompanionShow и handleCompanionClick в экземпляре MTRGInstreamAudioAd для обработки показа и клика и перехода на рекламируемый сайт или приложение.

- (void)onCompanionAdShow:(MTRGInstreamAdCompanionBanner *)companionBanner
{
    [_ad handleCompanionShow:companionBanner];
}
 
- (void)onCompanionAdClick:(MTRGInstreamAdCompanionBanner *)companionBanner
{
    [_ad handleCompanionClick:companionBanner withController:self];
}
Управление состоянием

У экземпляра MTRGInstreamAudioAd доступны следующие методы управления.

- (void)pause;
Приостанавливает проигрывание рекламного аудио.

- (void)resume;
Возобновляет проигрывание рекламного аудио.

- (void)stop;

Останавливает показ рекламной секции.

- (void)skip;

Останавливает показ рекламной секции, если это было сделано пользователем (нажатие на кнопку «Пропустить» или «Закрыть»).

- (void)skipBanner;
Останавливает текущее рекламное аудио и переходит к следующему, если это было сделано пользователем (нажатие на кнопку «Пропустить» или «Закрыть»).

@property(nonatomic) float volume;
Устанавливает громкость от 0 до 1.

@property(nonatomic) NSUInteger loadingTimeout;
Устанавливает таймаут на загрузку рекламы в секундах. В случае если по истечению указанного интервала не удалось получить баннеры, будет вызван коллбек onNoAd. Значение по умолчанию — 10 секунд, минимальное значение — 5 секунд.
AdChoices

Разработчик должен сам отрисовать кнопку AdChoices и уведомлять SDK о ее нажатии. По умолчанию для InstreamAudioAd кнопка AdChoices не отображается.

Отображение и обработка кликов AdChoices

Для отображения AdChoices MTRGInstreamAudioAdBanner предоставляет информацию о его наличии (свойство hasAdChoices), иконке (свойство adChoiecsImage) и рекламном тексте (свойство advertisingLabel). Чтобы уведомить SDK о нажатии на AdChoices, нужно вызвать метод handleAdChoicesClickWithController:sourceView:. После чего SDK отобразит меню AdChoices. Если в меню пользователь выбрал опцию с закрытием рекламы, то SDK уведомит об этом разработчика в методе делегата onBannerShouldClose:instreamAudioAd:.

// Добавление компонента AdChoices
- (void)setupAdChoicesView
{
    _adChoicesButton = UIButton.new;
    [_adChoicesButton addTarget:self action:@selector(adChoicesClick) forControlEvents:UIControlEventTouchUpInside];
    [_adChoicesButton setHidden:YES];
    [_playerView addSubview:_adChoicesButton];
}
  
// Обработка нажатия
- (void)adChoicesClick
{
    [_ad handleAdChoicesClickWithController:self sourceView:_adChoicesButton];
}
  
// Отображение компонента AdChoices при проигрывании баннера
- (void)onBannerStart:(MTRGInstreamAudioAdBanner *)banner instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
    BOOL hasAdChocies = banner.adChoicesImage != nil && banner.hasAdChoices;
    [_adChoicesButton setImage:banner.adChoicesImage forState:UIControlStateNormal];
    _adChoicesButton.hidden = !hasAdChocies;
}
  
// Закрытие рекламы
- (void)onBannerShouldClose:(MTRGInstreamAudioAdBanner *)banner instreamAudioAd:(MTRGInstreamAudioAd *)instreamAudioAd
{
    [_ad skipBanner];
}
Управление отображением меню AdChoices
Чтобы управлять отображением опций AdChoices нужно в соответствующий инициализатор передать объект, реализующий протокол MTRGMenuFactory. Протокол требует реализовать метод для создания меню. Меню же должно реализовывать протокол MTRGMenu. По умолчанию SDK использует UIAlertController со стилем actionSheet.

// Пример реализации меню
  
// Добавляем модель MTRGMenuAction в _items (массив объектов, которые нужно будет показать в меню)
- (void)addMenuAction:(nonnull MTRGMenuAction *)action
{
    [_items addObject:action];
}
  
// На основе _items создаем UIAlertController и отображаем его
- (void)presentInViewController:(nonnull UIViewController *)viewController sourceView:(nullable UIView *)sourceView
{
    UIAlertControllerStyle style = UIAlertControllerStyleAlert;
    MTRGAlertController *alert = [MTRGAlertController alertControllerWithTitle:nil message:nil preferredStyle:style];
  
    for (MTRGMenuAction *item in _items.copy)
    {
  
        UIAlertActionStyle actionStyle = (item.style == MTRGMenuActionStyleDefault) ? UIAlertActionStyleDefault : UIAlertActionStyleCancel;
  
        UIAlertAction *action = [UIAlertAction actionWithTitle:item.title
                                                         style:actionStyle
                                                       handler:^(UIAlertAction * _Nonnull action)
                                 {
            [item handleClick];
        }];
        [alert addAction:action];
    }
  
    [viewController presentViewController:alert animated:YES completion:nil];
}

Карусель в нативной рекламе

Загруженный баннер, вместо одной главной картинки, может содержать набор карточек, которые могут быть показаны в виде карусели.

Каждая карточка содержит свою картинку, имя, описание и кнопку.

Для показа карусели, вместо использования компонента MTRGMediaAdView для главной картинки, можно использовать компонент MTRGPromoCardCollectionView.

Либо создать свой собственный компонент для отображения коллекции (наследник UICollectionView), реализующий протокол

MTRGPromoCardSliderProtocol. При этом следует обратить внимание на свойство:

@property (nonatomic) id <MTRGPromoCardSliderStateProtocol> sliderState;
Объект, реализующий протокол MTRGPromoCardSliderStateProtocol, используется для сохранения/восстановления состояния карусели (текущей позиции карточек) при её переиспользовании.

В качестве компонента для отображения ячейки в метод registerClass:forCellWithReuseIdentifier: ему должен быть передан класс-наследник UICollectionViewCell, реализующий предоставляемый SDK протокол MTRGPromoCardViewProtocol.

Компонент MTRGPromoCardCollectionView автоматически заполняет предоставленный визуальный компонент данными карточек.

Класс MTRGPromoCardCollectionView можно создать при помощи фабрики MTRGNativeViewsFactory

+ (MTRGPromoCardCollectionView *)createPromoCardCollectionView;
+ (MTRGPromoCardCollectionView *)createPromoCardCollectionViewWithCardScaleFactor:(CGFloat)cardScaleFactor
                                                                      cardSpacing:(CGFloat)cardSpacing;
Второй конструктор позволяет дополнительно задать соотношение ширины карточки (по умолчанию 0.75) относительно ширины коллекции и расстояние между карточками (по умолчанию 10.0)

Ниже приведен пример реализации карусели с использованием MTRGPromoCardCollectionView.

-(void)onLoadWithNativePromoBanner:(MTRGNativePromoBanner *)promoBanner nativeAd:(MTRGNativeAd *)nativeAd
{
    // ...
    // ...
      
    // Список карточек
    NSArray<MTRGNativePromoCard *> *cards = promoBanner.cards;
   
    // Пример заполнения визуального компонента
   
    // ...
    // ...
      
    if(cards.count > 0)
    {
        // Создаем MTRGPromoCardCollectionView
        MTRGPromoCardCollectionView *cardCollectionView = [MTRGNativeViewsFactory createPromoCardCollectionView];
  
        // Устанавливаем класс для ячейки
        [_cardCollectionView registerClass:[CardView class] forCellWithReuseIdentifier:@"CardView"];
          
        // Устанавливаем карточки
        [_cardCollectionView setCards:cards];
   
        [adView addSubview:cardCollectionView];
    }
    else
    {
        // Создаем MTRGMediaAdView
        MTRGMediaAdView *mediaView = [MTRGNativeViewsFactory createMediaAdView];
        [adView addSubview:mediaView];
    }
      
    // Регистрируем визуальный компонент
    [nativeAd registerView:adView withController:self];
   
    // Добавляем на экран
    [self.view addSubview:adView];
}
   
...
...
...
// Пример класса для показа одной карточки
@interface CardView : UICollectionViewCell <MTRGPromoCardViewProtocol>
  
@property(nonatomic, readonly) UILabel *titleLabel;
@property(nonatomic, readonly) UILabel *descriptionLabel;
@property(nonatomic, readonly) UILabel *ctaButtonLabel;
@property(nonatomic, readonly) MTRGMediaAdView *mediaAdView;
  
- (CGFloat)heightWithCardWidth:(CGFloat)width;
@end
   
@implementation CardView
   
- (instancetype)init
{
   self = [super init];
   if (self)
   {
      [self setupView];
   }
   return self;
}
  
- (instancetype)initWithFrame:(CGRect)frame
{
   self = [super initWithFrame:frame];
   if (self)
   {
      [self setupView];
   }
   return self;
}
  
- (void)setupView
{
     
   _mediaAdView = [[MTRGMediaAdView alloc] init];
   _mediaAdView.clipsToBounds = YES;
   [self.contentView addSubview:_mediaAdView];
  
   _titleLabel = [[UILabel alloc] init];
   [self.contentView addSubview:_titleLabel];
  
   _descriptionLabel = [[UILabel alloc] init];
   [self.contentView addSubview:_descriptionLabel];
  
   _ctaButtonLabel = [[UILabel alloc] init];
   [self.contentView addSubview:_ctaButtonLabel];
}
  
- (CGFloat)heightWithCardWidth:(CGFloat)width
{
    ...
    ...
    return calculatedSize;
}
@end
Карусель
Вам помогла эта статья?