배너

circle-info
  • AdWhale SDK를 프로젝트에 추가 해야합니다.

  • Banner Ad용으로 발급받은 Ad Unit ID를 사용합니다.

  • 광고를 요청하기 전에 SDK 초기화를 진행합니다.

AdWhaleAdSize(Swift)

AdWhaleAdSize(ObjC)

Size (width * height)

.banner

AdWhaleAdSizeBanner

320 *50

.largeBanner

AdWhaleAdSizeLargeBanner

320 * 100

.mediumRectangle

AdWhaleAdSizeMediumRectangle

300 * 250

1. BannerAdView.m

#import <React/RCTViewManager.h>
#import <React/RCTBridge.h>
#import <React/RCTUIManager.h>
#import <AdWhaleSDK/AdWhaleSDK.h>

@interface BannerAdViewContainer : UIView <AdWhaleBannerDelegate>
@property (nonatomic, strong) AdWhaleBannerAd *bannerView;
@property (nonatomic, copy) RCTBubblingEventBlock onAdLoaded;
@property (nonatomic, copy) RCTBubblingEventBlock onAdLoadFailed;
@property (nonatomic, copy) RCTBubblingEventBlock onAdClicked;
@property (nonatomic, copy) NSString *adSize;
@property (nonatomic, copy) NSString *placementUid;
@property (nonatomic, assign) BOOL shouldLoadAd;
@end

@implementation BannerAdViewContainer

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        _adSize = @"BANNER320x50";
        _placementUid = @"";
        _shouldLoadAd = NO;
    }
    return self;
}

- (void)setAdSize:(NSString *)adSize {
    _adSize = adSize;
    [self updateAdSize];
}

- (void)setPlacementUid:(NSString *)placementUid {
    _placementUid = placementUid;
    [self.bannerView setAdUnitID:placementUid];
}

- (void)setShouldLoadAd:(BOOL)shouldLoadAd {
    _shouldLoadAd = shouldLoadAd;
    if (shouldLoadAd) {
        [self loadAd];
    }
}

- (void)updateAdSize {
    if (!self.bannerView) return;
    CGFloat width = 320;
    CGFloat height = 50;
    if ([_adSize isEqualToString:@"BANNER320x100"]) height = 100;
    else if ([_adSize isEqualToString:@"BANNER300x250"]) height = 250;
    CGRect frame = CGRectMake((UIScreen.mainScreen.bounds.size.width - width) / 2, 0, width, height);
    self.bannerView.frame = frame;
    if ([_adSize isEqualToString:@"BANNER320x50"]) [self.bannerView setAdSize:AdWhaleAdSizeBanner];
    else if ([_adSize isEqualToString:@"BANNER320x100"]) [self.bannerView setAdSize:AdWhaleAdSizeLargeBanner];
    else if ([_adSize isEqualToString:@"BANNER300x250"]) [self.bannerView setAdSize:AdWhaleAdSizeMediumRectangle];
}

- (void)loadAd {
    if (!self.bannerView) {
        CGFloat width = 320;
        CGFloat height = 50;
        if ([_adSize isEqualToString:@"BANNER320x100"]) height = 100;
        else if ([_adSize isEqualToString:@"BANNER300x250"]) height = 250;
        CGRect frame = CGRectMake((UIScreen.mainScreen.bounds.size.width - width) / 2, 0, width, height);
        self.bannerView = [[AdWhaleBannerAd alloc] initWithFrame:frame];
        [self addSubview:self.bannerView];
        [self updateAdSize];
        [self.bannerView setAdUnitID:self.placementUid ?: @""];
        [self.bannerView setRootViewController:RCTPresentedViewController()];
        [self.bannerView setDelegate:self];
    }
    [self.bannerView load];
}

// MARK: - AdWhaleBannerDelegate
- (void)bannerViewDidReceiveAd:(AdWhaleBannerAd *)bannerView {
    if (self.onAdLoaded) self.onAdLoaded(@{});
}
- (void)bannerView:(AdWhaleBannerAd *)bannerView didFailToReceiveAdWithError:(NSError *)error {
    if (self.onAdLoadFailed) self.onAdLoadFailed(@{@"statusCode": @0, @"message": error.localizedDescription ?: @""});
}
- (void)bannerViewDidRecordImpression:(AdWhaleBannerAd *)bannerView {}
- (void)bannerViewWillPresentScreen:(AdWhaleBannerAd *)bannerView {
    if (self.onAdClicked) self.onAdClicked(@{});
}
- (void)bannerViewWillDismissScreen:(AdWhaleBannerAd *)bannerView {}
- (void)bannerViewDidDismissScreen:(AdWhaleBannerAd *)bannerView {}

@end

@interface BannerAdView : RCTViewManager
@end

@implementation BannerAdView
RCT_EXPORT_MODULE()

RCT_EXPORT_VIEW_PROPERTY(onAdLoaded, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onAdLoadFailed, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(onAdClicked, RCTBubblingEventBlock)
RCT_EXPORT_VIEW_PROPERTY(adSize, NSString)
RCT_EXPORT_VIEW_PROPERTY(placementUid, NSString)
RCT_EXPORT_VIEW_PROPERTY(shouldLoadAd, BOOL)

- (UIView *)view {
    return [[BannerAdViewContainer alloc] init];
}
@end 

2. React Native 연동 코드

BannerAd.tsx

App.tsx

Last updated