Skip to content

Instantly share code, notes, and snippets.

@thomasmso
Last active July 31, 2020 05:50
Show Gist options
  • Save thomasmso/e210584f4c712f7e3b9017273437c0fe to your computer and use it in GitHub Desktop.
Save thomasmso/e210584f4c712f7e3b9017273437c0fe to your computer and use it in GitHub Desktop.
//
// ALMintegralMediationAdapter.m
// AppLovinSDK
//
#import "ALMintegralMediationAdapter.h"
#import <MTGSDK/MTGSDK.h>
#import <MTGSDK/MTGErrorCodeConstant.h>
#import <MTGSDKBidding/MTGBiddingSDK.h>
#import <MTGSDKInterstitialVideo/MTGBidInterstitialVideoAdManager.h>
#import <MTGSDKInterstitialVideo/MTGInterstitialVideoAdManager.h>
#import <MTGSDKReward/MTGRewardAdManager.h>
#import <MTGSDKReward/MTGBidRewardAdManager.h>
#import <MTGSDKBanner/MTGBannerAdView.h>
#import <MTGSDKBanner/MTGBannerAdViewDelegate.h>
#import "ALSdk.h"
#import "ALUtils.h"
#import "MAAdapterError.h"
#import "MAAdapterInitializationParameters.h"
#import "NSDictionary+ALUtils.h"
#import "NSString+ALUtils.h"
#define ADAPTER_VERSION @"6.3.5.0.0"
// List of Mintegral error codes not defined in API, but in their docs
//
// http://cdn-adn.rayjump.com/cdn-adn/v2/markdown_v2/index.html?file=sdk-m_sdk-ios&lang=en#faqs
//
#define EXCEPTION_RETURN_EMPTY -1 // ads no fill
#define EXCEPTION_TIMEOUT -9 // request timeout
#define EXCEPTION_IV_RECALLNET_INVALIDATE -1904 // The network status at the time of the request is incorrect. Generally, because of the SDK initialization is not completed yet when the request has been sent.
#define EXCEPTION_SIGN_ERROR -10 // AppID and appKey do not match correctly
#define EXCEPTION_UNIT_NOT_FOUND -1201 // Can not find the unitID in dashboard
#define EXCEPTION_UNIT_ID_EMPTY -1202 // unitID is empty
#define EXCEPTION_UNIT_NOT_FOUND_IN_APP -1203 // Can not find the unitID of the appID
#define EXCEPTION_UNIT_ADTYPE_ERROR -1205 // The adtype of the unitID is wrong
#define EXCEPTION_APP_ID_EMPTY -1301 // appID is empty
#define EXCEPTION_APP_NOT_FOUND -1302 // Can not find the appId
@interface ALMintegralMediationAdapterInterstitialDelegate : NSObject<MTGInterstitialVideoDelegate, MTGBidInterstitialVideoDelegate>
@property (nonatomic, weak) ALMintegralMediationAdapter *parentAdapter;
@property (nonatomic, strong) id<MAInterstitialAdapterDelegate> delegate;
- (instancetype)initWithParentAdapter:(ALMintegralMediationAdapter *)parentAdapter andNotify:(id<MAInterstitialAdapterDelegate>)delegate;
@end
@interface ALMintegralMediationAdapterRewardedDelegate : NSObject<MTGRewardAdLoadDelegate, MTGRewardAdShowDelegate>
@property (nonatomic, weak) ALMintegralMediationAdapter *parentAdapter;
@property (nonatomic, strong) id<MARewardedAdapterDelegate> delegate;
@property (nonatomic, assign, getter=hasGrantedReward) BOOL grantedReward;
- (instancetype)initWithParentAdapter:(ALMintegralMediationAdapter *)parentAdapter andNotify:(id<MARewardedAdapterDelegate>)delegate;
@end
@interface ALMintegralMediationAdapterBannerViewDelegate : NSObject<MTGBannerAdViewDelegate>
@property (nonatomic, weak) ALMintegralMediationAdapter *parentAdapter;
@property (nonatomic, strong) id<MAAdViewAdapterDelegate> delegate;
- (instancetype)initWithParentAdapter:(ALMintegralMediationAdapter *)parentAdapter andNotify:(id<MAAdViewAdapterDelegate>)delegate;
@end
@interface ALMintegralMediationAdapter()
@property (nonatomic, strong) MTGBidInterstitialVideoAdManager *bidInterstitialVideoManager;
@property (nonatomic, strong) MTGInterstitialVideoAdManager *interstitialVideoManager;
@property (nonatomic, strong) MTGBannerAdView *bannerAdView;
@property (nonatomic, strong) ALMintegralMediationAdapterInterstitialDelegate *interstitialDelegate;
@property (nonatomic, strong) ALMintegralMediationAdapterRewardedDelegate *rewardedDelegate;
@property (nonatomic, strong) ALMintegralMediationAdapterBannerViewDelegate *bannerDelegate;
@end
@implementation ALMintegralMediationAdapter
#pragma mark - MAAdapter Methods
- (void)initializeWithParameters:(id<MAAdapterInitializationParameters>)parameters completionHandler:(void (^)(MAAdapterInitializationStatus, NSString * _Nullable))completionHandler
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self log: @"Initializing Mintegral SDK..."];
NSString *appId = [parameters.serverParameters al_stringForKey: @"app_id"];
NSString *appKey = [parameters.serverParameters al_stringForKey: @"app_key"];
MTGSDK *mtgSDK = [MTGSDK sharedInstance];
// Must be called before -[MTGSDK setAppID:ApiKey:]
// Communicated over email, GDPR status can only be set before SDK initialization
NSNumber *hasUserConsent = [self privacySettingForSelector: @selector(hasUserConsent) fromParameters: parameters];
if ( hasUserConsent )
{
mtgSDK.consentStatus = hasUserConsent.boolValue;
}
if ( ALSdk.versionCode >= 61100 )
{
// Has to be _before_ their SDK init as well
NSNumber *isDoNotSell = [self privacySettingForSelector: @selector(isDoNotSell) fromParameters: parameters];
if ( isDoNotSell && isDoNotSell.boolValue )
{
mtgSDK.doNotTrackStatus = YES;
}
}
[mtgSDK setAppID: appId ApiKey: appKey];
});
completionHandler(MAAdapterInitializationStatusDoesNotApply, nil);
}
- (nullable NSNumber *)privacySettingForSelector:(SEL)selector fromParameters:(id<MAAdapterParameters>)parameters
{
// Use reflection because compiled adapters have trouble fetching `BOOL` from old SDKs and `NSNumber` from new SDKs (above 61400)
NSMethodSignature *signature = [[parameters class] instanceMethodSignatureForSelector: selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setSelector: selector];
[invocation setTarget: parameters];
[invocation invoke];
// Privacy parameters return nullable `NSNumber` on newer SDKs
if ( ALSdk.versionCode >= 61400 )
{
NSNumber *__unsafe_unretained value;
[invocation getReturnValue: &value];
return value;
}
// Privacy parameters return BOOL on older SDKs
else
{
BOOL rawValue;
[invocation getReturnValue: &rawValue];
return @(rawValue);
}
}
- (NSString *)SDKVersion
{
return [MTGSDK sdkVersion];
}
- (NSString *)adapterVersion
{
return ADAPTER_VERSION;
}
- (void)destroy
{
self.bidInterstitialVideoManager.delegate = nil;
self.bidInterstitialVideoManager = nil;
self.interstitialVideoManager.delegate = nil;
self.interstitialVideoManager = nil;
[self.bannerAdView destroyBannerAdView];
self.bannerAdView.delegate = nil;
self.bannerAdView = nil;
self.interstitialDelegate = nil;
self.rewardedDelegate = nil;
self.bannerDelegate = nil;
}
#pragma mark - Signal Collection
- (void)collectSignalWithParameters:(id<MASignalCollectionParameters>)parameters andNotify:(id<MASignalCollectionDelegate>)delegate
{
// DOCS: https://app.asana.com/0/20387143076905/1126882455204927
[self log: @"Collecting signal..."];
NSString *signal = [MTGBiddingSDK buyerUID];
[delegate didCollectSignal: signal];
}
#pragma mark - MAInterstitialAdapter Methods
- (void)loadInterstitialAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MAInterstitialAdapterDelegate>)delegate
{
BOOL shouldUpdateMuteState = [parameters.serverParameters al_containsValueForKey: @"is_muted"]; // Introduced in 6.10.0
BOOL muted = [parameters.serverParameters al_numberForKey: @"is_muted"].boolValue;
self.interstitialDelegate = [[ALMintegralMediationAdapterInterstitialDelegate alloc] initWithParentAdapter: self andNotify: delegate];
if ( [parameters.bidResponse al_isValidString] )
{
[self log: @"Loading bidding interstitial..."];
self.bidInterstitialVideoManager = [[MTGBidInterstitialVideoAdManager alloc] initWithPlacementId: nil
unitId: parameters.thirdPartyAdPlacementIdentifier
delegate: self.interstitialDelegate];
if ( [self.bidInterstitialVideoManager isVideoReadyToPlayWithPlacementId: nil unitId: parameters.thirdPartyAdPlacementIdentifier] )
{
[self log: @"A bidding interstitial ad is ready already"];
[delegate didLoadInterstitialAd];
}
else
{
// Update mute state if configured by backend
if ( shouldUpdateMuteState ) self.bidInterstitialVideoManager.playVideoMute = muted;
[self.bidInterstitialVideoManager loadAdWithBidToken: parameters.bidResponse];
}
}
else
{
[self log: @"Loading mediated interstitial ad..."];
self.interstitialVideoManager = [[MTGInterstitialVideoAdManager alloc] initWithPlacementId: nil
unitId: parameters.thirdPartyAdPlacementIdentifier
delegate: self.interstitialDelegate];
if ( [self.interstitialVideoManager isVideoReadyToPlayWithPlacementId: nil unitId: parameters.thirdPartyAdPlacementIdentifier] )
{
[self log: @"A mediated interstitial ad is ready already"];
[delegate didLoadInterstitialAd];
}
else
{
// Update mute state if configured by backend
if ( shouldUpdateMuteState ) self.interstitialVideoManager.playVideoMute = muted;
[self.interstitialVideoManager loadAd];
}
}
}
- (void)showInterstitialAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MAInterstitialAdapterDelegate>)delegate
{
if ( [self.bidInterstitialVideoManager isVideoReadyToPlayWithPlacementId: nil unitId: parameters.thirdPartyAdPlacementIdentifier] )
{
[self log: @"Showing bidding interstitial..."];
[self.bidInterstitialVideoManager showFromViewController: [ALUtils topViewControllerFromKeyWindow]];
}
else if ( [self.interstitialVideoManager isVideoReadyToPlayWithPlacementId: nil unitId: parameters.thirdPartyAdPlacementIdentifier] )
{
[self log: @"Showing mediated interstitial..."];
[self.interstitialVideoManager showFromViewController: [ALUtils topViewControllerFromKeyWindow]];
}
else
{
[self log: @"Unable to show interstitial - no ad loaded..."];
[delegate didFailToDisplayInterstitialAdWithError: MAAdapterError.adNotReady];
}
}
#pragma mark - MARewardedAdapter Methods
- (void)loadRewardedAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MARewardedAdapterDelegate>)delegate
{
BOOL shouldUpdateMuteState = [parameters.serverParameters al_containsValueForKey: @"is_muted"]; // Introduced in 6.10.0
BOOL muted = [parameters.serverParameters al_numberForKey: @"is_muted"].boolValue;
self.rewardedDelegate = [[ALMintegralMediationAdapterRewardedDelegate alloc] initWithParentAdapter: self andNotify: delegate];
if ( [parameters.bidResponse al_isValidString] )
{
[self log: @"Loading bidding rewarded ad..."];
if ( [[MTGBidRewardAdManager sharedInstance] isVideoReadyToPlayWithPlacementId: nil unitId: parameters.thirdPartyAdPlacementIdentifier] )
{
[self log: @"A bidding rewarded ad is ready already"];
[delegate didLoadRewardedAd];
}
else
{
// Update mute state if configured by backend
if ( shouldUpdateMuteState ) [MTGBidRewardAdManager sharedInstance].playVideoMute = muted;
[[MTGBidRewardAdManager sharedInstance] loadVideoWithBidToken: parameters.bidResponse
placementId: nil
unitId: parameters.thirdPartyAdPlacementIdentifier
delegate: self.rewardedDelegate];
}
}
else
{
[self log: @"Loading mediated rewarded ad..."];
if ( [[MTGRewardAdManager sharedInstance] isVideoReadyToPlayWithPlacementId: nil unitId: parameters.thirdPartyAdPlacementIdentifier] )
{
[self log: @"A mediated rewarded ad is ready already"];
[delegate didLoadRewardedAd];
}
else
{
// Update mute state if configured by backend
if ( shouldUpdateMuteState ) [MTGRewardAdManager sharedInstance].playVideoMute = muted;
[[MTGRewardAdManager sharedInstance] loadVideoWithPlacementId: nil
unitId: parameters.thirdPartyAdPlacementIdentifier
delegate: self.rewardedDelegate];
}
}
}
- (void)showRewardedAdForParameters:(id<MAAdapterResponseParameters>)parameters andNotify:(id<MARewardedAdapterDelegate>)delegate
{
// Configure reward from server.
[self configureRewardForParameters: parameters];
NSString *placementIdentifier = parameters.thirdPartyAdPlacementIdentifier;
NSDictionary<NSString *, id> *serverParameters = parameters.serverParameters;
NSString *rewardId = serverParameters[@"reward_id"];
NSString *userId = serverParameters[@"user_id"];
if ( [[MTGBidRewardAdManager sharedInstance] isVideoReadyToPlayWithPlacementId: nil unitId: placementIdentifier] )
{
[self log: @"Showing bidding rewarded ad..."];
[[MTGBidRewardAdManager sharedInstance] showVideoWithPlacementId: nil
unitId: placementIdentifier
withRewardId: rewardId
userId: userId
delegate: self.rewardedDelegate
viewController: [ALUtils topViewControllerFromKeyWindow]];
}
else if ( [[MTGRewardAdManager sharedInstance] isVideoReadyToPlayWithPlacementId: nil unitId: placementIdentifier] )
{
[self log: @"Showing mediated rewarded ad..."];
[[MTGRewardAdManager sharedInstance] showVideoWithPlacementId: nil
unitId: placementIdentifier
withRewardId: rewardId
userId: userId
delegate: self.rewardedDelegate
viewController: [ALUtils topViewControllerFromKeyWindow]];
}
else
{
[self log: @"Unable to show rewarded ad - no ad loaded..."];
[delegate didFailToDisplayRewardedAdWithError: MAAdapterError.adNotReady];
}
}
#pragma mark - MAAdViewAdapter Methods
- (void)loadAdViewAdForParameters:(id<MAAdapterResponseParameters>)parameters
adFormat:(MAAdFormat *)adFormat
andNotify:(id<MAAdViewAdapterDelegate>)delegate
{
MTGBannerSizeType sizeType = [self sizeTypeFromAdFormat: adFormat];
self.bannerAdView = [[MTGBannerAdView alloc] initBannerAdViewWithBannerSizeType: sizeType
placementId: nil
unitId: parameters.thirdPartyAdPlacementIdentifier
rootViewController: [ALUtils topViewControllerFromKeyWindow]];
self.bannerDelegate = [[ALMintegralMediationAdapterBannerViewDelegate alloc] initWithParentAdapter: self andNotify: delegate];
self.bannerAdView.delegate = self.bannerDelegate;
self.bannerAdView.autoRefreshTime = 0;
self.bannerAdView.showCloseButton = MTGBoolNo;
if ( [parameters.bidResponse al_isValidString] )
{
[self log: @"Loading bidding banner ad..."];
[self.bannerAdView loadBannerAdWithBidToken: parameters.bidResponse];
}
else
{
[self log: @"Loading mediated banner ad..."];
[self.bannerAdView loadBannerAd];
}
}
#pragma mark - Shared Methods
+ (MAAdapterError *)maxErrorFromMintegralError:(NSError *)error
{
NSInteger errorCode;
NSInteger mintegralCode = error.code;
if ( mintegralCode == kMTGErrorCodeConnectionLost )
{
errorCode = MAAdapterError.errorCodeNoConnection;
}
else if ( mintegralCode == kMTGErrorCodeNoAds || mintegralCode == kMTGErrorCodeNoAdsAvailableToPlay || mintegralCode == EXCEPTION_RETURN_EMPTY )
{
errorCode = MAAdapterError.errorCodeNoFill;
}
else if ( mintegralCode == kMTGErrorCodeLoadAdsTimeOut || mintegralCode == EXCEPTION_TIMEOUT )
{
errorCode = MAAdapterError.errorCodeTimeout;
}
else if ( mintegralCode == EXCEPTION_IV_RECALLNET_INVALIDATE )
{
errorCode = MAAdapterError.errorCodeNotInitialized;
}
else if ( mintegralCode == KMTGErrorCodeEmptyUnitId || mintegralCode == EXCEPTION_SIGN_ERROR || mintegralCode == EXCEPTION_UNIT_NOT_FOUND || mintegralCode == EXCEPTION_UNIT_ID_EMPTY || mintegralCode == EXCEPTION_UNIT_NOT_FOUND_IN_APP || mintegralCode == EXCEPTION_UNIT_ADTYPE_ERROR || mintegralCode == EXCEPTION_APP_ID_EMPTY || mintegralCode == EXCEPTION_APP_NOT_FOUND )
{
errorCode = MAAdapterError.errorCodeInvalidConfiguration;
}
else if ( mintegralCode == kMTGErrorCodeOfferExpired )
{
errorCode = MAAdapterError.errorCodeAdExpired;
}
else if ( mintegralCode == kMTGErrorCodeDailyLimit )
{
errorCode = -5214; // `errorCodeAdFrequencyCapped`
}
else
{
errorCode = MAAdapterError.errorCodeUnspecified;
}
return [MAAdapterError errorWithCode: errorCode errorString: [ALMintegralMediationAdapter formatErrorMessage: error]];
}
- (MTGBannerSizeType)sizeTypeFromAdFormat:(MAAdFormat *)adFormat
{
if ( adFormat == MAAdFormat.banner || adFormat == MAAdFormat.leader )
{
return MTGSmartBannerType;
}
else if ( adFormat == MAAdFormat.mrec )
{
return MTGMediumRectangularBanner300x250;
}
else
{
[NSException raise: NSInvalidArgumentException format: @"Unsupported ad format: %@", adFormat];
return MTGSmartBannerType;
}
}
+ (NSString *)formatErrorMessage:(NSError *)error
{
NSString *description = [error.localizedDescription al_stringByURLEncodingString];
return [NSString stringWithFormat: @"%ld:%@", (long) error.code, description];
}
@end
#pragma mark - MTGInterstitialDelegate Methods
@implementation ALMintegralMediationAdapterInterstitialDelegate
- (instancetype)initWithParentAdapter:(ALMintegralMediationAdapter *)parentAdapter andNotify:(id<MAInterstitialAdapterDelegate>)delegate
{
self = [super init];
if ( self )
{
self.parentAdapter = parentAdapter;
self.delegate = delegate;
}
return self;
}
- (void)onInterstitialVideoLoadSuccess:(MTGInterstitialVideoAdManager *)adManager
{
// Ad has loaded and video has been downloaded
[self.parentAdapter log: @"Interstitial successfully loaded and video has been downloaded"];
[self.delegate didLoadInterstitialAd];
}
- (void)onInterstitialAdLoadSuccess:(MTGInterstitialVideoAdManager *)adManager
{
// Ad has loaded but video still needs to be downloaded
[self.parentAdapter log: @"Interstitial successfully loaded but video still needs to be downloaded"];
}
- (void)onInterstitialVideoLoadFail:(NSError *)error adManager:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial failed to load: %@", error];
MAAdapterError *adapterError = [ALMintegralMediationAdapter maxErrorFromMintegralError: error];
[self.delegate didFailToLoadInterstitialAdWithError: adapterError];
}
- (void)onInterstitialVideoShowSuccess:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial displayed"];
[self.delegate didDisplayInterstitialAd];
}
- (void)onInterstitialVideoShowFail:(NSError *)error adManager:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial failed to show: %@", error];
MAAdapterError *adapterError = [ALMintegralMediationAdapter maxErrorFromMintegralError: error];
[self.delegate didFailToDisplayInterstitialAdWithError: adapterError];
}
- (void)onInterstitialVideoAdClick:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial clicked"];
[self.delegate didClickInterstitialAd];
}
- (void)onInterstitialVideoAdDismissedWithConverted:(BOOL)converted adManager:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial hidden"];
[self.delegate didHideInterstitialAd];
}
- (void)onInterstitialVideoAdDidClosed:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial video completed"];
}
- (void)onInterstitialVideoEndCardShowSuccess:(MTGInterstitialVideoAdManager *)adManager
{
[self.parentAdapter log: @"Interstitial endcard shown"];
}
@end
#pragma mark - MTGRewardedDelegate Methods
@implementation ALMintegralMediationAdapterRewardedDelegate
- (instancetype)initWithParentAdapter:(ALMintegralMediationAdapter *)parentAdapter andNotify:(id<MARewardedAdapterDelegate>)delegate
{
self = [super init];
if ( self )
{
self.parentAdapter = parentAdapter;
self.delegate = delegate;
}
return self;
}
- (void)onVideoAdLoadSuccess:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
// Ad has loaded and video has been downloaded
[self.parentAdapter log: @"Rewarded ad successfully loaded and video has been downloaded"];
[self.delegate didLoadRewardedAd];
}
- (void)onAdLoadSuccess:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
// Ad has loaded but video still needs to be downloaded
[self.parentAdapter log: @"Rewarded ad successfully loaded but video still needs to be downloaded"];
}
- (void)onVideoAdLoadFailed:(nullable NSString *)placementId unitId:(nullable NSString *)unitId error:(NSError *)error
{
[self.parentAdapter log: @"Rewarded ad failed to load: %@", error];
MAAdapterError *adapterError = [ALMintegralMediationAdapter maxErrorFromMintegralError: error];
[self.delegate didFailToLoadRewardedAdWithError: adapterError];
}
- (void)onVideoAdShowSuccess:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
[self.parentAdapter log: @"Rewarded ad displayed"];
[self.delegate didDisplayRewardedAd];
[self.delegate didStartRewardedAdVideo];
}
- (void)onVideoAdShowFailed:(nullable NSString *)placementId unitId:(nullable NSString *)unitId withError:(NSError *)error
{
[self.parentAdapter log: @"Rewarded ad failed to show: %@", error];
MAAdapterError *adapterError = [ALMintegralMediationAdapter maxErrorFromMintegralError: error];
[self.delegate didFailToDisplayRewardedAdWithError: adapterError];
}
- (void)onVideoAdClicked:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
[self.parentAdapter log: @"Rewarded ad clicked"];
[self.delegate didClickRewardedAd];
}
- (void)onVideoAdDismissed:(nullable NSString *)placementId unitId:(nullable NSString *)unitId withConverted:(BOOL)converted withRewardInfo:(nullable MTGRewardAdInfo *)rewardInfo
{
[self.parentAdapter log: @"Rewarded ad granted reward"];
self.grantedReward = converted;
}
- (void)onVideoAdDidClosed:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
[self.parentAdapter log: @"Rewarded ad hidden"];
[self.delegate didCompleteRewardedAdVideo];
if ( [self hasGrantedReward] || [self.parentAdapter shouldAlwaysRewardUser] )
{
MAReward *reward = [self.parentAdapter reward];
[self.parentAdapter log: @"Rewarded user with reward: %@", reward];
[self.delegate didRewardUserWithReward: reward];
}
[self.delegate didHideRewardedAd];
}
- (void)onVideoPlayCompleted:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
[self.parentAdapter log: @"Rewarded ad video completed"];
}
- (void)onVideoEndCardShowSuccess:(nullable NSString *)placementId unitId:(nullable NSString *)unitId
{
[self.parentAdapter log: @"Rewarded ad endcard shown"];
}
@end
#pragma mark MTGAdViewDelegate Methods
@implementation ALMintegralMediationAdapterBannerViewDelegate
- (instancetype)initWithParentAdapter:(ALMintegralMediationAdapter *)parentAdapter andNotify:(id<MAAdViewAdapterDelegate>)delegate
{
self = [super init];
if ( self )
{
self.parentAdapter = parentAdapter;
self.delegate = delegate;
}
return self;
}
- (void)adViewLoadSuccess:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad loaded"];
[self.delegate didLoadAdForAdView: adView];
}
- (void)adViewLoadFailedWithError:(NSError *)error adView:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad failed to load: %@", error];
MAAdapterError *adapterError = [ALMintegralMediationAdapter maxErrorFromMintegralError: error];
[self.delegate didFailToLoadAdViewAdWithError: adapterError];
}
- (void)adViewWillLogImpression:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad displayed"];
[self.delegate didDisplayAdViewAd];
}
- (void)adViewDidClicked:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad clicked"];
[self.delegate didClickAdViewAd];
}
- (void)adViewWillLeaveApplication:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad will leave application"];
}
- (void)adViewWillOpenFullScreen:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad expanded"];
[self.delegate didExpandAdViewAd];
}
- (void)adViewCloseFullScreen:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad collapsed"];
[self.delegate didCollapseAdViewAd];
}
- (void)adViewClosed:(MTGBannerAdView *)adView
{
[self.parentAdapter log: @"Banner ad closed"];
[self.delegate didHideAdViewAd];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment