Rewarded Ad

1. Basic requirements

  • Add ​ADX iOS SDK to your project.

  • Use the Ad Unit ID issued for Interstitial Ads.

  • Before requesting an ad, SDK initialization must be done first.

    • SDK initialization should be called only once when the app launches and ad requests should be made after SDK initialization is complete.

    • For iOS 14 and later, request ads only after obtaining ATT (App Tracking Transparency) permission.

2. Implementation

Loading Rewarded Ads may take some time, so it is recommended to preload them in advance before use.

  1. Instantiate an ADXRewardedAd using the initWithAdUnitId: method and register the ADXRewardedAdDelegate callbacks.

  2. Call loadAd to load the ad.

  3. Check whether an ad is available using isLoaded, and if so, display the ad with showAdFromRootViewController:.

  4. Once the user has fully watched the ad, the rewardedAdDidRewardUser:withReward: callback of ADXRewardedAdDelegate is invoked. Grant the reward only when this callback is triggered.

#import <ADXLibrary/ADXRewardedAd.h>

@interface RewardedAdViewController () <ADXRewardedAdDelegate>

@property (strong) ADXRewardedAd *rewardedAd;

@end

@implementation RewardedAdViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.rewardedAd = [[ADXRewardedAd alloc] 
        initWithAdUnitId:@"<ADX_REWARDED_AD_UNIT_ID>"];
    self.rewardedAd.delegate = self;
}

- (IBAction)loadAd:(id)sender {
    [self.rewardedAd loadAd];
}

- (IBAction)showAd:(id)sender {
    if (self.rewardedAd.isLoaded) {
        [self.rewardedAd showAdFromRootViewController:self];
    }
}

#pragma mark - ADXRewardedAdDelegate

- (void)rewardedAdDidLoad:(ADXRewardedAd *)rewardedAd {
    NSLog(@"rewardedAdDidLoad");
}

- (void)rewardedAd:(ADXRewardedAd *)rewardedAd didFailToLoadWithError:(NSError *)error {
    NSLog(@"rewardedAd:didFailToLoadWithError: %@", error);
}

- (void)rewardedAd:(ADXRewardedAd *)rewardedAd didFailToShowWithError:(NSError *)error {
    NSLog(@"rewardedAd:didFailToShowWithError: %@", error);
}
- (void)rewardedAdWillPresentScreen:(ADXRewardedAd *)rewardedAd {
    NSLog(@"rewardedAdWillPresentScreen");
}

- (void)rewardedAdDidClick:(ADXRewardedAd *)rewardedAd {
    NSLog(@"rewardedAdDidClick");
}

- (void)rewardedAdWillDismissScreen:(ADXRewardedAd *)rewardedAd {
    NSLog(@"rewardedAdWillDismissScreen");
}

- (void)rewardedAdDidDismissScreen:(ADXRewardedAd *)rewardedAd {
    NSLog(@"rewardedAdDidDismissScreen");
}

- (void)rewardedAdDidRewardUser:(ADXRewardedAd *)rewardedAd withReward:(ADXReward *)reward {
    NSLog(@"rewardedAdDidRewardUser");
}

3. Callback

You can receive rewarded ad events through the ADXRewardedAdDelegate.

- (void)rewardedAdDidLoad:(ADXRewardedAd *)rewardedAd;
- (void)rewardedAdWillPresentScreen:(ADXRewardedAd *)rewardedAd;
- (void)rewardedAdDidClick:(ADXRewardedAd *)rewardedAd;
- (void)rewardedAdWillDismissScreen:(ADXRewardedAd *)rewardedAd;
- (void)rewardedAdDidDismissScreen:(ADXRewardedAd *)rewardedAd;
- (void)rewardedAdDidRewardUser:(ADXRewardedAd *)rewardedAd 
    withReward:(ADXReward *)reward;
- (void)rewardedAd:(ADXRewardedAd *)rewardedAd 
    didFailToLoadWithError:(NSError *)error;
- (void)rewardedAd:(ADXRewardedAd *)rewardedAd 
    didFailToShowWithError:(NSError *)error;

4. Ad Revenue (paidEventHandler)

You can check the estimated ad revenue for ad impressions.

  • As shown in the example below, use paidEventHandler to check the estimated eCPM value.

  • Manually set values during mediation setup and actual values may be mixed, so it is recommended to treat this as an estimate.

  • The currency unit of eCPM is USD.

  • You can link ad revenue data with your MMP. For details, please refer to the SDK integration guides below:

#import <UIKit/UIKit.h>
#import <ADXLibrary/ADXInterstitialAd.h>
#import <FirebaseAnalytics/FirebaseAnalytics.h>
#import <AppsFlyerAdRevenue/AppsFlyerAdRevenue.h>

@interface RewardedViewController () <ADXRewardedAdDelegate>
@property (strong) ADXRewardedAd *rewardedAd;
@end

@implementation RewardedViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.rewardedAd = [[ADXRewardedAd alloc] 
        initWithAdUnitId:@"<ADX_REWARDED_AD_UNIT_ID>"];
                                
    self.rewardedAd.delegate = self;
    
    __weak typeof(self) weakSelf = self;
    self.rewardedAd.paidEventHandler = ^(double eCPM) {
        __strong typeof(self) strongSelf = weakSelf;
        if(!strongSelf) { return; }
        NSNumber * revenue = [NSNumber numberWithDouble:eCPM/1000];
        [strongSelf handleAdRevenue:revenue];
    };
}

- (void)handleAdRevenue:(NSNumber *)revenue {
    // 1) Firebase Analytics
    [FIRAnalytics logEventWithName:kFIREventAdImpression
                        parameters: @{
        kFIRParameterAdPlatform: @"AD(X)",
        kFIRParameterAdFormat: @"RewardedAd",
        kFIRParameterAdUnitName: @"ADX Rewarded Ad",
        kFIRParameterCurrency: @"USD",
        kFIRParameterValue: revenune
    }];
        
    // 2) AppsFlyer
    NSDictionary * adRevenueParams = @{
        @"AdUnitName" : @"ADX Rewarded Ad",
        @"AdType" : @"RewardedAd",
    };
    
    AppsFlyerAdRevenue * appsFlyerAdRevenue = [AppsFlyerAdRevenue shared];
    [appsFlyerAdRevenue 
        logAdRevenueWithMonetizationNetwork:@"AD(X)"
        mediationNetwork:AppsFlyerAdRevenueMediationNetworkTypeCustom
        eventRevenue:revenune
        revenueCurrency:@"USD"
        additionalParameters:adRevenueParams];
}

#pragma mark - ADXRewardedAdDelegate
- (void)rewardedAdDidLoad:(ADXRewardedAd *)rewardedAd {}
- (void)rewardedAd:(ADXRewardedAd *)rewardedAd didFailToLoadWithError:(NSError *)error {}
- (void)rewardedAd:(ADXRewardedAd *)rewardedAd didFailToShowWithError:(NSError *)error {}
- (void)rewardedAdWillPresentScreen:(ADXRewardedAd *)rewardedAd {}
- (void)rewardedAdDidClick:(ADXRewardedAd *)rewardedAd {}
- (void)rewardedAdWillDismissScreen:(ADXRewardedAd *)rewardedAd {}
- (void)rewardedAdDidDismissScreen:(ADXRewardedAd *)rewardedAd {}
- (void)rewardedAdDidRewardUser:(ADXRewardedAd *)rewardedAd withReward:(ADXReward *)reward {}

@end

5. SSV (Server-side verification) Settings

  • SSV settings are optional and can be configured only if needed.

  • SSV allows the reward event to trigger a server-to-server callback via the Callback URL.

  • The conditions for using SSV are as follows:

    • A Rewarded Video type with a registered Callback URL must be configured in the dashboard.

    • A reward event must occur after the user has fully watched the video.

    • If necessary, set the User ID or Custom Data information via the SDK before requesting an ad.

  • If the client sets the User ID and Custom Data, they will be included in the Callback URL request.

    • Example: https://callback_url?param=value&userid=<value>&customdata=<value>

    • SSV settings must be configured before the ad request to ensure the Callback URL includes the data.

  • Refer to the server-side SSV callback verification guide to verify the reward.


// SSV settings (optional)
[self.rewardedAd setSSVOptionWithUserId:@"<USER_ID>"];
[self.rewardedAd setSSVOptionWithCustomData:@"<CUSTOM_DATA>"];
// Ad request
[self.rewardedAd loadAd];

Last updated

Was this helpful?