Native Ad
1. Basic requirements
Add ADX iOS SDK to your project.
Use the Ad Unit ID issued for Native 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. Layout setup
For Native Ads, you must create the layout for the ad yourself. The required elements are as follows:
Title :
UILabel
Main Text :
UILabel
Call-To-Action :
UIButton
Icon Image :
UIImageView
Main Image :
UIImageView
Privacy Icon :
UIImageView
Ad Tag :
UIView (UILabel or UIImageView)
All of these elements must be included and properly configured, and no view should cover the ad content. Additionally, ensure that ad content is not modified or tampered with in any way, such as changing text, replacing images, or altering actions triggered by user interactions.
// NativeAdView.h
#import <ADXLibrary/ADXNativeAdRendering.h>
@interface NativeAdView : UIView <ADXNativeAdRendering>
@property (nonatomic, weak) IBOutlet UILabel *titleLabel;
@property (nonatomic, weak) IBOutlet UILabel *mainTextLabel;
@property (nonatomic, weak) IBOutlet UIButton *callToActionButton;
@property (nonatomic, weak) IBOutlet UIImageView *iconImageView;
@property (nonatomic, weak) IBOutlet UIImageView *mainImageView;
@property (nonatomic, weak) IBOutlet UIImageView *privacyInformationIconImageView;
@end
// NativeAdView.m
@implementation NativeAdView
- (void)layoutSubviews {
[super layoutSubviews];
}
- (UILabel *)nativeMainTextLabel {
return self.mainTextLabel;
}
- (UILabel *)nativeTitleTextLabel {
return self.titleLabel;
}
- (UIButton *)nativeCallToActionButton {
return self.callToActionButton;
}
- (UILabel *)nativeSponsoredByCompanyTextLabel {
return self.sponsoredByLabel;
}
- (UIImageView *)nativeIconImageView {
return self.iconImageView;
}
- (UIImageView *)nativeMainImageView {
return self.mainImageView;
}
- (UIImageView *)nativePrivacyInformationIconImageView {
return self.privacyInformationIconImageView;
}
@end
3. Implementation
Native Ads can be loaded using one of the following two methods:
Case 1: When using a single View
Configure the RenderingViewClass using the
setRenderingViewClass:renderingViewClass:
method ofADXNativeAdFactory
.Register the
ADXNativeAdFactoryDelegate
callbacks.Call loadAd on the
ADXNativeAdFactoryDelegate
to load the ad.Once the ad is loaded successfully, the
onSuccess:nativeAd:
callback ofADXNativeAdFactoryDelegate
will be invoked.
#import "NativeAdViewController"
#import "NativeAdView.h"
#import <ADXLibrary/ADXNativeAdFactory.h>
@interface NativeAdViewController () <ADXNativeAdFactoryDelegate, ADXNativeAdDelegate>
@property (strong) ADXNativeAd *nativeAd;
@end
@implementation NativeAdViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[ADXNativeAdFactory sharedInstance]
setRenderingViewClass:@"<ADX_NATIVE_AD_UNIT_ID>"
renderingViewClass:[NativeAdView class]];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[ADXNativeAdFactory sharedInstance] addDelegate:self];
[[ADXNativeAdFactory sharedInstance] loadAd:@"<ADX_NATIVE_AD_UNIT_ID>"];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[ADXNativeAdFactory sharedInstance] removeDelegate:self];
}
#pragma mark - ADXNativeAdFactoryDelegate
- (void)onSuccess:(NSString *)adUnitId nativeAd:(ADXNativeAd *)nativeAd {
NSLog(@"onSuccess : %@", adUnitId);
if([adUnitId isEqualToString:ADX_NATIVE_AD_UNIT_ID]) {
self.nativeAd = nativeAd;
self.nativeAd.delegate = self;
UIView *nativeAdView = [[ADXNativeAdFactory sharedInstance]
getNativeAdView:@"<ADX_NATIVE_AD_UNIT_ID>"];
nativeAdView.frame = CGRectMake(0.0,
100.0,
320.0,
300.0);
[self.view addSubview:nativeAdView];
}
}
- (void)onFailure:(NSString *)adUnitId {
NSLog(@"onFailure : %@", adUnitId);
}
#pragma mark - ADXNativeAdDelegate
- (UIViewController *)viewControllerForPresentingModalView {
return self;
}
@end
Case 2: Using AdPlacer with UITableView / UICollectionView
Configure the RenderingViewClass using the
setRenderingViewClass:renderingViewClass:
method ofADXNativeAdFactory
.Set the size of the ad to be loaded.
The ad size should be specified either in the XIB file or by setting the frame programmatically.
Use
ADXAdPositioning
to specify fixed and repeating ad positions:addFixedIndexPath:
– specify fixed ad positionsenableRepeatingPositionsWithInterval:
– specify repeating ad positions
Call
loadAdsForAdUnitID:
to load the ads.
#import "NativeAdPlacerViewController.h"
#import "NativeAdView.h"
#import <ADXLibrary/ADXNativeAdFactory.h>
@interface NativeAdPlacerViewController () <UICollectionViewDataSource, UICollectionViewDelegate, ADXCollectionViewAdPlacerDelegate>
@property (weak) IBOutlet UICollectionView *colltionView;
@property (strong) ADXCollectionViewAdPlacer *placer;
@end
@implementation NativeAdPlacerViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[ADXNativeAdFactory sharedInstance]
setRenderingViewClass:@"<ADX_NATIVE_AD_UNIT_ID>"
renderingViewClass:[NativeAdView class]];
ADXAdPositioning *adPositioning = [ADXAdPositioning positioning];
[adPositioning addFixedIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
[adPositioning enableRepeatingPositionsWithInterval:3];
self.placer = [[ADXNativeAdFactory sharedInstance]
getCollectionViewAdPlacer:@"<ADX_NATIVE_AD_UNIT_ID>"
collectionView:self.colltionView
viewController:self
adPositioning:adPositioning];
[self.placer loadAdsForAdUnitID:@"<ADX_NATIVE_AD_UNIT_ID>"];
}
4. Ad Revenue (paidEventHandler)
You can check the estimated ad revenue for ad impressions.
#import <UIKit/UIKit.h>
#import <ADXLibrary/ADXNativeAdFactory.h>
#import "NativeAdViewController.h"
#import "NativeAdView.h"
#import <FirebaseAnalytics/FirebaseAnalytics.h>
#import <AppsFlyerAdRevenue/AppsFlyerAdRevenue.h>
@interface NativeAdViewController () <ADXNativeAdFactoryDelegate, ADXNativeAdDelegate>
@property (nonatomic, strong) ADXNativeAd *nativeAd;
@end
@implementation NativeAdViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[ADXNativeAdFactory sharedInstance]
setRenderingViewClass:@"<ADX_NATIVE_AD_UNIT_ID>"
renderingViewClass:[NativeAdView class]];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[ADXNativeAdFactory sharedInstance] addDelegate:self];
[[ADXNativeAdFactory sharedInstance] loadAd:@"<ADX_NATIVE_AD_UNIT_ID>"];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[ADXNativeAdFactory sharedInstance] removeDelegate:self];
}
- (void)handleAdRevenue:(NSNumber *)revenue {
// 1) Firebase Analytics
[FIRAnalytics logEventWithName:kFIREventAdImpression
parameters: @{
kFIRParameterAdPlatform: @"AD(X)",
kFIRParameterAdFormat: @"NativeAd",
kFIRParameterAdUnitName: @"ADX Native Ad",
kFIRParameterCurrency: @"USD",
kFIRParameterValue: revenune
}];
// 2) AppsFlyer
NSDictionary * adRevenueParams = @{
@"AdUnitName" : @"ADX Native Ad",
@"AdType" : @"NativeAd",
};
AppsFlyerAdRevenue * appsFlyerAdRevenue = [AppsFlyerAdRevenue shared];
[appsFlyerAdRevenue
logAdRevenueWithMonetizationNetwork:@"AD(X)"
mediationNetwork:AppsFlyerAdRevenueMediationNetworkTypeCustom
eventRevenue:revenune
revenueCurrency:@"USD"
additionalParameters:adRevenueParams];
}
#pragma mark - ADXNativeAdFactoryDelegate
- (void)onSuccess:(NSString *)adUnitId nativeAd:(ADXNativeAd *)nativeAd {
NSLog(@"onSuccess : %@", adUnitId);
if([adUnitId isEqualToString:@"<ADX_NATIVE_AD_UNIT_ID>"]) {
self.nativeAd = nativeAd;
self.nativeAd.delegate = self;
__weak typeof(self) weakSelf = self;
self.nativeAd.paidEventHandler = ^(double eCPM) {
__strong typeof(self) strongSelf = weakSelf;
if(!strongSelf) { return; }
NSNumber * revenue = [NSNumber numberWithDouble:eCPM/1000];
[strongSelf handleAdRevenue:revenue];
};
UIView *nativeAdView = [[ADXNativeAdFactory sharedInstance]
getNativeAdView:@"<ADX_NATIVE_AD_UNIT_ID>"];
nativeAdView.frame = CGRectMake(0.0,
100.0,
320.0,
300.0);
[self.view addSubview:nativeAdView];
}
}
- (void)onFailure:(NSString *)adUnitId {
NSLog(@"onFailure : %@", adUnitId);
}
#pragma mark - ADXNativeAdDelegate
- (UIViewController *)viewControllerForPresentingModalView {
return self;
}
@end
Last updated
Was this helpful?