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 9 and above.
Set up the SDK
The Audience Network Rewarded Video format is now included in the public SDK. Rewarded video will be available for all gaming apps soon. If you don’t see Rewarded Video in Monetization Manager and you're on the latest SDK, apply now.
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> @property (nonatomic, strong) FBRewardedVideoAd *rewardedVideoAd; @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 { // Instantiate a RewardedVideoAd object. // NOTE: the placement ID will eventually identify this as your App, you can ignore it for // now, 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; [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 displayedrewardedVideoAdVideoComplete
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)rewardedVideoAdVideoComplete:(FBRewardedVideoAd *)rewardedVideoAd; { NSLog(@"Rewarded Video ad video 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 { if (self.rewardedVideoAd && self.rewardedVideoAd.isAdValid) { [self.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.
[self.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 https endpoint to validate each ad impression and validate whether a reward should be granted.
- 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.
- 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.
- 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
It is possible to set the Reward Data (
USER_ID
and CURRENCY
) before, or after the loadAd
method. Both are demonstrated in the code snippet below.- (void) loadRewardedVideoAd { // Instantiate a RewardedVideoAd object. // NOTE: the placement ID will eventually identify this as your App, you can ignore it for // now, 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; //Set the rewarded ad data [self.rewardedVideoAd setRewardDataWithUserID:@"USER_ID" withCurrency:@"CURRENCY"]; [self.rewardedVideoAd loadAd]; // Alternateively, you can set the RewardData after the loadAd method // [self.rewardedVideoAd setRewardDataWithUserID:@"USER_ID" withCurrency:@"CURRENCY"]; }
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.
Rewarded Video for iOS
Reviewed by Code Labe
on
August 27, 2019
Rating: 5