Last active
July 31, 2020 05:50
-
-
Save thomasmso/e210584f4c712f7e3b9017273437c0fe to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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