Этот документ обновлен.
Перевод (Русский) еще не готов.
Последнее обновление (английский): 4 ноя 2021 г.

Добавление видеорекламы с бонусом в приложение iOS

Видеореклама с бонусом — это полноэкранная видеореклама, за просмотр которой пользователи получают вознаграждение: виртуальную валюту, игровые предметы, эксклюзивный контент и другие преимущества. Сама реклама представляет собой видео длительностью 15–30 секунд и содержит конечную карточку с призывом к действию. Пропустить такую рекламу нельзя. После воспроизведения видео до конца вы получаете обратный вызов, позволяющий отправить бонус пользователю.

Ниже вы найдете инструкции по интеграции видеорекламы с бонусом из Audience Network в приложения для iOS.

Обратите внимание: видео с бонусом поддерживается только в iOS 9 и более поздних версиях.

Настройка SDK

Формат видео с бонусом из Audience Network теперь входит в общедоступный SDK. В ближайшем будущем видео с бонусом можно будет добавлять во все игровые приложения. Если у вас установлена последняя версия SDK, но видео с бонусом в Monetization Manager отсутствует, запросите эту возможность.

Прежде чем продолжить, обязательно ознакомьтесь с руководствами по началу работы с Audience Network и iOS.

Реализация

Импортируйте FBAudienceNetwork в файл заголовка контроллера представления (или файл Swift, если вы используете Swift), объявите соответствие протоколу FBRewardedVideoAdDelegate и добавьте переменную экземпляра в рекламный блок видео с бонусом:

import UIKit
import FBAudienceNetwork

class ViewController: UIViewController, FBRewardedVideoAdDelegate {
  private var rewardedVideoAd: FBRewardedVideoAd?
}
#import <UIKit/UIKit.h>
@import FBAudienceNetwork;

@interface ViewController : UIViewController <FBRewardedVideoAdDelegate>

@property (nonatomic, strong) FBRewardedVideoAd *rewardedVideoAd;

@end

Добавьте в контроллер представления функцию, которая инициализирует объект видео с бонусом и выполняет предварительное кэширование видеоматериалов:

override func viewDidLoad() {
  super.viewDidLoad()
  
  // Instantiate an rewarded video object.
  // NOTE: the placement ID will eventually identify this as your app. You can ignore it while you are testing
  // and replace it later when you have signed up.
  // While you are using this temporary code you will only get test ads and if you release
  // your code like this to the App Store your users will not receive ads (you will get a 'No Fill' error).
  let rewardedVideoAd = FBRewardedVideoAd(placementID: "YOUR_PLACEMENT_ID")
  rewardedVideoAd.delegate = self
  
  // For auto play video ads, it's recommended to load the ad at least 30 seconds before it is shown
  rewardedVideoAd.load()
  
  self.rewardedVideoAd = rewardedVideoAd
}
- (void) viewDidLoad 
{
  [super viewDidLoad];
  // Instantiate a rewarded video ad object. 
  // NOTE: the placement ID will eventually identify this as your app. You can ignore it while 
  // you are testing and replace it later when you have signed up.
  // While you are using this temporary code you will only get test ads and if you release
  // your code like this to the App Store your users will not receive ads (you will get a 'No Fill' error).
  self.rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID"];
  self.rewardedVideoAd.delegate = self;

  // For auto play video ads, it's recommended to load the ad at least 30 seconds before it is shown
  [self.rewardedVideoAd loadAd];
}

В YOUR_PLACEMENT_ID, показан временный ID, который используется только для тестирования.

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

Инструкции по генерации рабочего ID места размещения см. в этой статье.

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

Например:

  • rewardedVideoAdDidLoad — информирует приложение о том, что кэширование рекламы завершено и она готова к показу;
  • rewardedVideoAdVideoComplete — сообщает о том, что просмотр видео завершен и пользователь должен получить бонус.
func rewardedVideoAdDidLoad(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Video ad is loaded and ready to be displayed")
}

func rewardedVideoAd(_ rewardedVideoAd: FBRewardedVideoAd, didFailWithError error: Error) {
  print("Rewarded video ad failed to load")
}

func rewardedVideoAdDidClick(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Video ad clicked")
}

func rewardedVideoAdDidClose(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded Video ad closed - this can be triggered by closing the application, or closing the video end card")
}

func rewardedVideoAdVideoComplete(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded Video ad video completed - this is called after a full video view, before the ad end card is shown. You can use this event to initialize your reward")
}
- (void)rewardedVideoAdDidLoad:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Video ad is loaded and ready to be displayed");
}
    
- (void)rewardedVideoAd:(FBRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error
{
  NSLog(@"Rewarded video ad failed to load");
}

- (void)rewardedVideoAdDidClick:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Video ad clicked");
}
    
- (void)rewardedVideoAdDidClose:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded Video ad closed - this can be triggered by closing the application, or closing the video end card");
}

- (void)rewardedVideoAdVideoComplete:(FBRewardedVideoAd *)rewardedVideoAd;
{
  NSLog(@"Rewarded Video ad video completed - this is called after a full video view, before the ad end card is shown. You can use this event to initialize your reward");
}

Когда вы будете готовы показывать видеорекламу с бонусом, используйте в собственной функции вознаграждения следующий код:

private func showRewardedVideoAd() {
  guard let rewardedVideoAd = rewardedVideoAd, rewardedVideoAd.isAdValid else {
    return
  }
  rewardedVideoAd.show(fromRootViewController: self)
}
- (void)showRewardedVideoAd
{
  if (self.rewardedVideoAd && self.rewardedVideoAd.isAdValid) {
    [self.rewardedVideoAd showAdFromRootViewController:self];
  }
}

Метод показа видеорекламы с бонусом содержит логический флаг animated, который позволяет анимировать представление. По умолчанию для него используется значение YES/true, но его можно изменить.

При запуске на эмуляторе по умолчанию будет отображаться тестовая реклама. Чтобы активировать тестовую рекламу на устройстве, добавьте перед загрузкой рекламы следующую строку кода: AdSettings.addTestDevice(HASHED ID). Когда вы впервые запрашиваете загрузку рекламы на устройство, используйте хэшированный ID, записанный в LogCat.

При необходимости можно добавить следующие дополнительные функции для обработки случаев закрытия видеорекламы с бонусом или записи ее показа:

func rewardedVideoAdWillClose(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("The user clicked on the close button, the ad is just about to close")
}

func rewardedVideoAdWillLogImpression(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded Video impression is being captured")
}
- (void)rewardedVideoAdWillClose:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"The user clicked on the close button, the ad is just about to close");
}

- (void)rewardedVideoAdWillLogImpression:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded Video impression is being captured");
}

Подтверждение бонуса на стороне сервера

Обзор

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

  1. SDK Audience Network запрашивает видеорекламу с бонусом, используя следующие параметры:
    • ID места размещения в Audience Network;
    • уникальный ID пользователя — атрибут, используемый для идентификации уникального пользователя (например, числовой идентификатор);
    • размер бонуса — размер бонуса, предоставляемого пользователю, например 100 монет (сервер передает эти значения на указанную конечную точку вместе с секретом приложения).
  2. Получив эти данные, сервер подтверждает запрос и отправляет следующий ответ:
    • ответ с кодом 200 — запрос действителен, пользователь должен получить бонус;
    • ответ с другим кодом — запрос недействителен, бонус не полагается.
  3. По окончании видео пользователь видит конечную карточку и происходит одно из следующих событий:
    • onRewardServerSuccess — только если на шаге 3 получен ответ с кодом 200;
    • onRewardServerFailed — если на шаге 3 получен ответ с другим кодом.

Пример URL, который будет отправлен на конечную точку вашего издателя сервером Facebook:

https://www.your_end_point.com/?token=APP_SECRET&puid=USER_ID&pc=REWARD_ID&ptid=UNIQUE_TRANSACTION_ID

Для использования этой функции предоставьте конечную точку своего издателя представителю Facebook.

Реализация SDK

Указывать данные бонуса (USER_ID и CURRENCY) можно как до, так и после вызова метода loadAd. Оба способа показаны во фрагменте кода ниже.

let rewardedVideoAd = FBRewardedVideoAd(placementID: "YOUR_PLACEMENT_ID")
rewardedVideoAd.delegate = self

// Set the rewarded ad data before or after `load` method is called
rewardedVideoAd.setRewardDataWithUserID("USER_ID", withCurrency: "CURRENCY")

// For auto play video ads, it's recommended to load the ad at least 30 seconds before it is shown
rewardedVideoAd.load()

self.rewardedVideoAd = rewardedVideoAd
self.rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID"];
self.rewardedVideoAd.delegate = self;

// Set the rewarded ad data before or after `loadAd` method is called
[self.rewardedVideoAd setRewardDataWithUserID:@"USER_ID" withCurrency:@"CURRENCY"];

[self.rewardedVideoAd loadAd];

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

func rewardedVideoAdServerRewardDidFail(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded video ad not validated, or no response from server")
}

func rewardedVideoAdServerRewardDidSucceed(_ rewardedVideoAd: FBRewardedVideoAd) {
  print("Rewarded video ad validated by server")
}
- (void)rewardedVideoAdServerRewardDidSucceed:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded video ad validated by server");
}

- (void)rewardedVideoAdServerRewardDidFail:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded video ad not validated, or no response from server");
}

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

Next Steps