TAMedia Wiki

SDK 8 Mopub Mediation

Mopub SDK v5.5.0+ 都需要實做 adaptor configuration 考參考官網教學 連結
直接將 TAMediaAdapterConfiguratioin .h.m 加入專案內

回MoPub教學

 

#import <Foundation/Foundation.h>

#import <MoPub/MoPub.h>



NS_ASSUME_NONNULL_BEGIN



@interface TAMediaAdapterConfiguration : MPBaseAdapterConfiguration



+ (void)updateInitializationParameters:(NSDictionary *)parameters;

- (void)initializeNetworkWithConfiguration:(NSDictionary<NSString *, id> * _Nullable)configuration complete:(void(^ _Nullable)(NSError * _Nullable))complete;



@end



NS_ASSUME_NONNULL_END
 

#import "TAMediaAdapterConfiguration.h"

#import <TAMediaAdsFramework/TAMediaAdsFramework.h>

#import <MoPub/MoPub.h>



static NSString *tamediaAdapterVersion = @"1.0.0";



@implementation TAMediaAdapterConfiguration



+ (void)updateInitializationParameters:(NSDictionary *)parameters {

}



- (NSString *)adapterVersion {

    return tamediaAdapterVersion;

}



- (NSString *)biddingToken {

    return nil;

}



- (NSString *)moPubNetworkName {

    return @"tamedia";

}



- (NSString *)networkSdkVersion {

    return [TADMobileAds getSDKVersion];

}



- (void)initializeNetworkWithConfiguration:(NSDictionary<NSString *, id> * _Nullable)configuration complete:(void(^ _Nullable)(NSError * _Nullable))complete {

    [TADMobileAds config];

    MPLogInfo(@"TAmedia SDK init version:%@",[TADMobileAds getSDKVersion]);

    complete(nil);

}



@end

依照 Mopub設定教學 設定後,開始實做 Adapter
官方教學:連結
#先建立一 class 繼承 MPInlineAdAdapter,class 名稱必須與 Mopub 後台設定內一樣
#加入 #import <TAMediaAdsFramework/TAMediaAdsFramework.h>
#複寫 - (void)requestAdWithSize:(CGSize) adapterInfo: adMarkup:以及在此 method 內用 TADBannerView 呼叫廣告
#:info 內的 key 值請依照 Mopub 內所設定的 key 值帶入

  1. 在 TADBannerView delegate 內呼叫 MPInlineAdAdapterDelegate 執行相對應的 method

可參考以下代碼,或直接下載 adapter 檔直接加入專案中

回MoPub教學

TAMediaInlineAdAdaptor

 #import <MoPub/MoPub.h>
 #import <TAMediaAdsFramework/TAMediaAdsFramework.h>
 @interface TAMediaInlineAdAdaptor : MPInlineAdAdapter<MPThirdPartyInlineAdAdapter, TADBannerViewDelegate>
 @property (nonatomic, strong) TADBannerView *bannerView;
 @end

 

 #import "TAMediaInlineAdAdapter.h"



@implementation TAMediaInlineAdAdapter



- (void)requestAdWithSize:(CGSize)size adapterInfo:(NSDictionary *)info adMarkup:(NSString *)adMarkup {

    TADRequest *request = [TADRequest request];

    request.testing = NO;

    request.gender = kTADGenderUnknown;

    CGFloat adRatio = floor((size.width/size.height)*100)/100;

    CGFloat ta1200x627AdRatio = floor((1200.0/627)*100)/100;

    NSString *bannerId = @"";

    

    ///根據 ad size 回傳不同 size 的 TAmedia Banner

    if (size.width == 300 && size.height == 250) {

        self.bannerView = [[TADBannerView alloc] initWithAdSize:kTADAdSizeMediumRectangle];

        bannerId = info[@"banner300x250"];

    } else if (size.width == 320 && size.height == 50) {

        self.bannerView = [[TADBannerView alloc] initWithAdSize:kTADAdSizeBanner];

        bannerId = info[@"banner320x50"];

    } else if (adRatio == ta1200x627AdRatio) {

        self.bannerView = [[TADBannerView alloc] initWithAdSize:TADAdSize1200x627RatioBannerWithWidth(size.width)];

        bannerId = info[@"banner1200x627"];

    } else {

        NSError *mopubError = [NSError errorWithCode:MOPUBErrorAdapterInvalid localizedDescription:@"TAmedia banner failed to load due to invalid ad size."];

        MPLogAdEvent([MPLogEvent adLoadFailedForAdapter:NSStringFromClass(self.class) error:mopubError], [self getAdUnitId]);

        [self.delegate inlineAdAdapter:self didFailToLoadAdWithError:mopubError];

            

        return;

    }

    

    self.bannerView.delegate = self;

    self.bannerView.turnOnMicrophone = NO;

    self.bannerView.adUnitID = bannerId;

    self.bannerView.rootViewController = [self.delegate inlineAdAdapterViewControllerForPresentingModalView:self];

    MPLogAdEvent([MPLogEvent adLoadAttemptForAdapter:NSStringFromClass(self.class) dspCreativeId:nil dspName:nil], [self getAdUnitId]);



    [self.bannerView loadRequest:request];

}



#pragma mark - [Tamedia Banner delegate]



- (void)adViewDidReceiveAd:(TADBannerView *)view {

    MPLogAdEvent([MPLogEvent adLoadSuccessForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    MPLogAdEvent([MPLogEvent adShowAttemptForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);



    if ([self.delegate respondsToSelector:@selector(inlineAdAdapter:didLoadAdWithAdView:)]) {

        [self.delegate inlineAdAdapter:self didLoadAdWithAdView:view];

    }

}

- (void)adView:(TADBannerView *)view didFailToReceiveAdWithError:(TADRequestError *)error {

    NSString *failureReason = [NSString stringWithFormat: @"TAmedia Banner failed to load with error: %@", [error localizedDescription]];

      NSError *mopubError = [NSError errorWithCode:MOPUBErrorAdapterInvalid localizedDescription:failureReason];

    MPLogAdEvent([MPLogEvent adLoadFailedForAdapter:NSStringFromClass(self.class) error:mopubError], [self getAdUnitId]);



    if ([self.delegate respondsToSelector:@selector(inlineAdAdapter:didFailToLoadAdWithError:)]) {

        [self.delegate inlineAdAdapter:self didFailToLoadAdWithError:error];

    }

}



- (void)adViewWillPresentScreen:(TADBannerView *)adView {

    

}



- (void)adViewWillDismissScreen:(TADBannerView *)adView {

    

}



- (void)adViewDidDismissScreen:(TADBannerView *)adView {

    

}



- (void)adViewWillLeaveApplication:(TADBannerView *)adView {

    MPLogAdEvent([MPLogEvent adWillLeaveApplicationForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    if ([self.delegate respondsToSelector:@selector(inlineAdAdapterWillLeaveApplication:)]) {

        [self.delegate inlineAdAdapterWillLeaveApplication:self];

    }

}



- (NSString *)getAdUnitId {

    return self.bannerView.adUnitID ? self.bannerView.adUnitID : @"";

}



- (void)dealloc {

    if (self.bannerView != nil) {

        self.bannerView.delegate = nil;

        self.bannerView = nil;

    }

}



@end

依照Mopub設定教學設定後,開始實做 adaptor
官方教學:連結
#先建立一 class 繼承 MPFullscreenAdAdapter,class 名稱必須與 Mopub 後台設定內一樣
#加入#import <TAMediaAdsFramework/TAMediaAdsFramework.h>
#複寫-requestAdWithAdapterInfo:(NSDictionary *)info adMarkup:以及在此 method 內用 TADInterstitial 呼叫廣告
#:info 內的 key 值請依照 Mopub 內所設定的 key 值帶入

  1. 複寫-presentAdFromViewController:(UIViewController *)viewController以及在此 method 內用 TADInterstitial的方法 -presentFromRootViewController:顯示廣告
  2. TADInterstitial 的 delegate 內呼叫 MPFullscreenAdAdapterDelegate 執行對應的 method

可參考以下代碼

回MoPub教學

TAMediaInterstitialAdapter

#import <MoPub/MoPub.h>

#import <TAMediaAdsFramework/TAMediaAdsFramework.h>



@interface TAMediaInterstitialAdapter: MPFullscreenAdAdapter <MPThirdPartyFullscreenAdAdapter, TADInterstitialDelegate>



@property (nonatomic,strong) TADInterstitial *interstitialView;



@end
#import "TAMediaInterstitialAdapter.h"



@implementation TAMediaInterstitialAdapter



- (void)requestAdWithAdapterInfo:(NSDictionary *)info adMarkup:(NSString *)adMarkup {

    TADRequest *request = [TADRequest request];

    

    request.testing = NO;

    // Type: TADGender

    request.gender = kTADGenderUnknown;

    

    // interstitialView 物件初始化

    if (self.interstitialView == nil) {

        self.interstitialView = [[TADInterstitial alloc] init];

    }

    

    // 必須要設定delegate

    self.interstitialView.delegate = self;

    

    // 設定 AD Unit ID

    NSString *interstitialId = info[@"InterstitialId"];

    self.interstitialView.adUnitID = interstitialId;

    self.interstitialView.turnOnMicrophone = NO;

    

    MPLogAdEvent([MPLogEvent adLoadAttemptForAdapter:NSStringFromClass(self.class) dspCreativeId:nil dspName:nil], [self getAdUnitId]);

    // 載入廣告

    [self.interstitialView loadRequest:request];



}



- (BOOL) isRewardExpected {

    return NO;

}



- (BOOL)hasAdAvailable {

    return self.interstitialView.isReady;

}



- (BOOL)enableAutomaticImpressionAndClickTracking {

    return YES;

}



- (void)presentAdFromViewController:(UIViewController *)rootViewController {

    MPLogAdEvent([MPLogEvent adShowAttemptForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    [self.interstitialView presentFromRootViewController:rootViewController];

}





#pragma mark - TADInterstitialDelegate

// Interstitial廣告成功載入後呼叫, 可以在此時間點及之後顯示呈現廣告

- (void)interstitialDidReceiveAd:(TADInterstitial *)ad {

    MPLogAdEvent([MPLogEvent adLoadSuccessForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);



    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterDidLoadAd:)]) {

        [self.delegate fullscreenAdAdapterDidLoadAd:self];

    }

}



// Interstitial廣告載入失敗時呼叫, 處理錯誤 或 顯示錯誤訊息

- (void)interstitial:(TADInterstitial *)ad didFailToReceiveAdWithError:(TADRequestError *)error {

    MPLogAdEvent([MPLogEvent adLoadFailedForAdapter:NSStringFromClass(self.class) error:error], [self getAdUnitId]);

    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapter:didFailToLoadAdWithError:)]) {

        [self.delegate fullscreenAdAdapter:self didFailToLoadAdWithError:error];

    }

}



// Interstitial廣告呈現之前呼叫, 注意使用者可能會在廣告內按下連結(網頁, AppStore, ...)而因此離開應用程式, 可以在這function中處理該暫停之項目

- (void)interstitialWillPresentScreen:(TADInterstitial *)ad {

    MPLogAdEvent([MPLogEvent adWillAppearForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    MPLogAdEvent([MPLogEvent adShowSuccessForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    MPLogAdEvent([MPLogEvent adDidAppearForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    

    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterAdWillAppear:)]) {

        [self.delegate fullscreenAdAdapterAdWillAppear:self];

    }

    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterAdDidAppear:)]) {

        [self.delegate fullscreenAdAdapterAdDidAppear:self];

    }

}



// Interstitial廣告關閉, 在螢幕上消失之前呼叫, 再次提醒在Interstitail消失前, 必須將Interstitial及delegate設為nil (可以在這個function中執行)

- (void)interstitialWillDismissScreen:(TADInterstitial *)ad {

    MPLogAdEvent([MPLogEvent adWillDisappearForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterAdWillDismiss:)]) {

        [self.delegate fullscreenAdAdapterAdWillDismiss:self];

    }

}



// Interstitial廣告關閉, 在螢幕上消失之後呼叫

- (void)interstitialDidDismissScreen:(TADInterstitial *)ad {

    MPLogAdEvent([MPLogEvent adDidDisappearForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);



    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterAdDidDismiss:)]) {

        [self.delegate fullscreenAdAdapterAdDidDismiss:self];

    }

}



// 使用者在廣告內按下連結(網頁, AppStore, ...)而因此離開應用程式之前呼叫

- (void)interstitialWillLeaveApplication:(TADInterstitial *)ad {

    MPLogAdEvent([MPLogEvent adWillLeaveApplicationForAdapter:NSStringFromClass(self.class)], [self getAdUnitId]);

    

    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterWillLeaveApplication:)]) {

        [self.delegate fullscreenAdAdapterWillLeaveApplication:self];

    }

    if ([self.delegate respondsToSelector:@selector(fullscreenAdAdapterDidReceiveTap:)]) {

        [self.delegate fullscreenAdAdapterDidReceiveTap:self];

    }

}



- (NSString *)getAdUnitId {

    return self.interstitialView.adUnitID ? self.interstitialView.adUnitID : @"";

}



- (void)dealloc {

    if (self.interstitialView != nil) {

        self.interstitialView.delegate = nil;

        self.interstitialView = nil;

    }

}



@end