Rewarded Video for iOS

Rewarded video ads are a full screen experience where users opt-in to view a video ad in exchange for something of value, such as virtual currency, in-app items, exclusive content, and more. The ad experience is 15-30 second non-skippable and contains an end card with a call to action. Upon completion of the full video, you will receive a callback to grant the suggested reward to the user.

Below are details on how to implement rewarded video ads from Audience Network on iOS.

Please note, Rewarded Video is only supported for iOS 8 and above.

Set up the SDK

The Audience Network Rewarded Video format is now included in the public SDK. Please note, that this feature is still in closed Beta.

Ensure you have completed the Audience Network Getting Started and iOS Getting Started guides before you proceed.

Implementation

Now, in your View Controller header file, import the SDK header, declare that you implement the FBRewardedVideoAdDelegate protocol and add an instance variable for the rewarded video ad unit:

#import <UIKit/UIKit.h>

@import FBAudienceNetwork;

@interface RewardedVideoViewController : UIViewController <FBRewardedVideoAdDelegate>

@end

Add a function in your View Controller that initializes the rewarded video object and caches the video creative ahead of the time you want to show it.

FBRewardedVideoAd *rewardedVideoAd;

- (void) viewDidLoad {
  [super viewDidLoad];
  
  [self loadRewardedVideoAd];
}

- (void) loadRewardedVideoAd
{
  rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID"];
  rewardedVideoAd.delegate = self;
  [rewardedVideoAd loadAd];
}

Use the Placement ID you obtained from step 3 on the Getting Started guide.

Now that you have added the code to load the ad, you can add functions which will handle various events.

For example:

  • rewardedVideoAdDidLoad ensures your app is aware when the ad is cached and ready to be displayed
  • rewardedVideoAdComplete lets you know when to deliver your reward to the user after a completed video view
- (void)rewardedVideoAd:(FBRewardedVideoAd *)rewardedVideoAd didFailWithError:(NSError *)error
{
  NSLog(@"Rewarded video ad failed to load");
}

- (void)rewardedVideoAdDidLoad:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Video ad is loaded and ready to be displayed");
}

- (void)rewardedVideoAdDidClick:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Video ad clicked");
}

- (void)rewardedVideoAdComplete:(FBRewardedVideoAd *)rewardedVideoAd;
{
 NSLog(@"Rewarded Video ad complete - 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)rewardedVideoAdDidClose:(FBRewardedVideoAd *)rewardedVideoAd
{
  NSLog(@"Rewarded Video ad closed - this can be triggered by closing 
  the application, or closing the video end card");
  }

Finally, when you are ready to show the rewarded video ad you can call the following code within your own reward function.

- (void) showRewardedVideoAd
{

[rewardedVideoAd showAdFromRootViewController:self];
}

The method to show a rewarded video ad includes an animated BOOLEAN flag which allows you to animate the presentation. By default it is set to YES, but this can be overridden with the following.

[rewardedVideoAd showAdFromRootViewController:self animated:NO];

When running on the simulator, test ads will be shown by default. To enable test ads on a device, add the following line of code before loading an ad: AdSettings.addTestDevice(HASHED ID). Use the hashed ID that is printed to the log cat when you first make a request to load an ad on a device.

Optionally, you can add the following additional functions to handle the cases where the rewarded video ad will close or when the 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");
}

Server Side Reward Validation

Overview

If you manage your user rewards server-side, then Facebook offers a solution for carrying this out securely by using a validation technique. Our server will communicate with a specified endpoint to validate each ad impression and validate whether a reward should be granted.

  1. Audience Network SDK requests a rewarded video ad with the following parameters:
    • Audience Network Placement ID
    • Unique User ID - an attribute you use to identify a unique user. For example, a numeric identifier
    • Reward Value - the value of the reward you would like to grant the user. For example, 100Coins specified end point, together with the App Secret.
  2. Upon receipt, the server validates the request and responds as follows:
    • 200 response: request is valid and the reward should be delivered
    • Non 200 response: request is not valid, and the reward should not be delivered.
  3. Once the video is complete, the end card is presented and one of the following events will fire.
    • onRewardServerSuccess - triggered only if a 200 response was received during step 3.
    • onRewardServerFailed - triggered if a non 200 response was received during step 3.

An example of the URL which will hit your publisher end point, from Facebook's server.

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

Please provide your publisher end point to your Facebook representative in order to enable this feature.

SDK Implementation

When initialising the rewarded video object, along with the Placement ID, you will need to also set a User ID, Currency Type and Reward value. User ID and Currency are both strings, whilst the Reward value is an integer. The Audience Network SDK combines the Currency and Amount into a single string before sending the request, so ensure that your end point is expecting this type of request. For example:

- (void) loadRewardedVideoAd
{

 rewardedVideoAd = [[FBRewardedVideoAd alloc] initWithPlacementID:@"YOUR_PLACEMENT_ID" 
 withUserID:@"USER_ID" 
 withCurrency:@"CURRENCY" 
 withAmount:1];

 rewardedVideoAd.delegate = self;
 [rewardedVideoAd loadAd];
}

In addition to the functions noted above in the FBRewardedVideoAdDelegate, the following events should be used to hande the granting of rewards in your app. The following can be used alongise the events monetioned above.

- (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");
  }

Please note - the server validation callbacks will only occur after the end card has been dismissed by a user. You should not deallocate the rewarded video object until after one of these callbacks.