SDK8 Mopub Mediation Adapter Interstitial

出自TAMedia
於 2022年4月21日 (四) 08:26 由 CharlesWang留言 | 貢獻 所做的修訂 →‎TAMediaInterstitialAdapter
(差異) ←上個修訂 | 最新修訂 (差異) | 下個修訂→ (差異)
跳至導覽 跳至搜尋

依照Mopub設定教學設定後,開始實做 adaptor
官方教學:連結

  1. 先建立一 class 繼承 MPFullscreenAdAdapter,class 名稱必須與 Mopub 後台設定內一樣
  2. 加入#import <TAMediaAdsFramework/TAMediaAdsFramework.h>
  3. 複寫-requestAdWithAdapterInfo:(NSDictionary *)info adMarkup:以及在此 method 內用 TADInterstitial 呼叫廣告
    info 內的 key 值請依照 Mopub 內所設定的 key 值帶入
  4. 複寫-presentAdFromViewController:(UIViewController *)viewController以及在此 method 內用 TADInterstitial的方法 -presentFromRootViewController:顯示廣告
  5. 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 : @"";
}

@end