请输入
菜单

自定义聚合平台

1. 自定义聚合平台的使用

请先查看如何在HyperBid Tools 后台创建自定义聚合平台

使用流程

  1. 继承MCMediationAdapter
    您只需要继承MCMediationAdapter并实现MCMediationAdapterProtocol协议中的相应方法。自定义聚合平台Adapter中的所有方法都不需要您进行调用,MCSDK内部会在合适的时机调用自定义聚合平台Adapter中的相关方法。

  2. 回调通知机制
    自定义聚合平台的广告代理回调,需要通过MCMediationAdapteradDelegate对象,调用对应的代理方法通知MCSDK。在MCSDK收到上一步的通知后,才会回调给外部MCAdDelegate使用者。

自定义聚合平台流程

2. 自定义聚合平台Adapter协议

● MCMediationAdapterProtocol

方法 说明
- (void)initSDK:(MCMediationInfo *)mediationInfo completed:(MCAdapterInitCompletionBlock)completedBlock; 初始化自定义聚合平台SDK
- (void)loadRewardedAd:(MCLoadInfo *)loadInfo delegate:(id<MCAdapterDelegate>)delegate; 加载激励视频广告
- (void)loadInterstitialAd:(MCLoadInfo *)loadInfo delegate:(id<MCAdapterDelegate>)delegate; 加载插屏广告
- (void)loadAppOpenAd:(MCLoadInfo *)loadInfo containerView:(UIView *)containerView delegate:(id<MCAdapterDelegate>)delegate; 加载开屏广告
- (void)loadAdViewAd:(MCLoadInfo *)loadInfo delegate:(id<MCAdapterDelegate>)delegate; 加载横幅广告
- (void)loadNative:(MCLoadInfo *)loadInfo delegate:(id<MCAdapterDelegate>)delegate; 加载原生广告
- (void)showAdWithWindow:(UIWindow *)window viewController:(UIViewController *)viewController withExtra:(NSDictionary *)extra; 自定义聚合平台展示开屏广告的方法
- (UIView *)getBannerView; 自定义聚合平台获取BannerView的方法
- (BOOL)isAdReady; 自定义聚合平台判断广告是否可展示的方法
- (void)destroyAd; 自定义聚合平台资源释放的方法

3. 聚合平台信息对象

● MCMediationInfo

属性 说明
@property (nonatomic, assign) NSInteger mediationId; 获取聚合平台的ID值
@property (nonatomic, strong) NSDictionary *mediationInitParams; 获取初始化信息的map,用于初始化聚合平台时从这个map中获取appId、appKey等参数
@property (nonatomic, strong) NSString *mediationAdapterClass; 获取聚合平台Adapter的class

4. 广告加载信息的对象

● MCLoadInfo

属性 说明
@property (nonatomic, strong) NSDictionary *loadExtraParameter; 用于聚合平台SDK获取加载时的额外信息map
@property (nonatomic, copy) NSString *placementId; 聚合平台的广告位ID
@property (nonatomic, assign) double weight; 聚合平台的权重值
@property (nonatomic, copy) NSDictionary<NSString *, NSString *> *content; 聚合平台配置参数
@property (nonatomic, assign) NSTimeInterval loadAdTimeoutInterval; 聚合平台广告加载超时时间
@property (nonatomic, strong) NSString *requestId; 当次请求ID

5. 广告加载事件的回调

● MCAdDelegate

方法 说明
- (void)didAdLoadSuccess:(MCIAdInfo *)ad; 广告加载成功时调用此方法通知MCSDK(仅激励,插屏,横幅,开屏使用)
- (void)didAdLoadSuccess:(MCIAdInfo *)ad withNativeAd:(MCNativeAd *)nativeAd; 广告加载成功时调用此方法通知MCSDK(仅原生广告使用)
- (void)didFailToLoadAdWithError:(MCError *)error; 广告加载失败时调用此方法通知MCSDK
- (void)didAdShow:(MCIAdInfo *)ad; 广告展示成功时调用此方法通知MCSDK
- (void)didAdClick:(MCIAdInfo *)ad; 广告点击时调用此方法通知MCSDK
- (void)didAdClose:(MCIAdInfo *)ad; 广告关闭时调用此方法通知MCSDK
- (void)didAdVideoStart:(MCIAdInfo *)ad; 广告视频开始播放时调用此方法通知MCSDK
- (void)didAdVideoEnd:(MCIAdInfo *)ad; 广告视频播放结束时调用此方法通知MCSDK
- (void)didAdDisplayFailed:(MCIAdInfo *)ad withError:(MCAdapterError *)error; 广告展示失败时调用此方法通知MCSDK
- (void)didAdRewardSuccess:(MCIAdInfo *)ad withReward:(MCReward *)rewardInfo; 激励视频触广告发奖励时调用此方法通知MCSDK
- (void)didAdRevenuePaid:(MCIAdInfo *)ad; 获取广告收益时调用此方法通知MCSDK

6. 广告加载结果的对象

● MCIAdInfo

💡Tips

  • 需要您参照下面的方法说明,继承IAdInfo并自行构建广告加载结果对象
属性 返回值类型 说明
mediationId NSInteger 获取聚合平台对应的ID
mediationPlacementId NSString * 获取聚合平台的广告位ID
networkName NSString * 获取广告源名称
networkPlacementId NSString * 获取广告平台的广告位ID
revenue double 获取收益
revenuePrecision RevenuePrecisionEnum 获取收益精度
currency NSString * 获取收益货币单位
country NSString * 获取国家代码
format MCAdFormat 获取广告类型
scenarioId NSString * 获取广告场景ID
extraDic NSDictionary * 获取聚合平台广告的额外信息
originData NSString * 获取聚合平台广告回调的原始信息

7. 示意Code

objective-c 复制代码
#import "MCMediationAdapter.h"

NS_ASSUME_NONNULL_BEGIN

@interface YourCustomMCMediationAdapter : MCMediationAdapter

@end

NS_ASSUME_NONNULL_END
objective-c 复制代码
#import "YourCustomMCMediationAdapter.h"
#import <引入您的自定义聚合SDK头文件>
#import "MCIAdInfo+Internal.h"
#import "MCGroMoreNativeAd.h"

#import <objc/message.h>
#import <objc/runtime.h>

#define kMCAPIAppIDKey @"app_id"
#define kMCAPICurrencyKey @"currency"

static MCAdapterInitStatus initStatus = MCAdapterInitNo;

@interface YourCustomMCMediationAdapter () <自定义聚合SDK各广告类型代理>

@property (nonatomic, strong) 自定义聚合SDK激励视频类 *rewardedVideoAd;
@property (nonatomic, strong) 自定义聚合SDK插屏类 *interstitialAd;
@property (nonatomic, strong) 自定义聚合SDK开屏类 *splashAd;
@property (nonatomic, strong) 自定义聚合SDK横幅类 *bannerView;
@property (nonatomic, strong) 自定义聚合SDK原生类 *nativeAd;
 
@property (nonatomic, assign) BOOL isDidAdShowCallback;
@property (nonatomic, assign) BOOL isDidAdVideoStartCallback;

@property (nonatomic, copy) NSString *currency;

@end

@implementation YourCustomMCMediationAdapter

- (void)dealloc
{
    
}

- (NSString *)mediationVersion {
    return 自定义聚合SDK版本
}

static NSString *_advanceSDKConfigPath = nil;
+ (void)setAdvanceSDKConfigPath:(NSString *)advanceSDKConfigPath {
    _advanceSDKConfigPath = [advanceSDKConfigPath copy];
}
+ (NSString *)advanceSDKConfigPath {
    return _advanceSDKConfigPath;
}

#pragma mark - MCMediationAdapterProtocol

- (void)initSDK:(MCMediationInfo *_Nonnull)mediationInfo completed:(nullable MCAdapterInitCompletionBlock)completedBlock {
    [super initSDK:mediationInfo completed:completedBlock];
    
    NSDictionary *mediationInitParams = mediationInfo.mediationInitParams;
    NSString *appIDKey = mediationInitParams[kMCAPIAppIDKey];
    self.currency = mediationInitParams[kMCAPICurrencyKey] ?: @"USD";
    
    if (initStatus != MCAdapterInitNo) {
        if (completedBlock) {
            completedBlock(initStatus, nil);
        }
        return;
    }
    initStatus = MCAdapterInitializing;
    
    if (!appIDKey.length) {
        NSError *error = [[NSError alloc] initWithDomain:@"parameter error" code:0 userInfo:@{}];
        initStatus = MCAdapterInitFailed;
        if (completedBlock) {
            completedBlock(initStatus, error);
        }
        return;
    }
    
    //这里配置并初始化自定义聚合SDK
    ......
}

- (void)loadRewardedAd:(MCLoadInfo *_Nonnull)loadInfo delegate:(id<MCAdapterDelegate>_Nonnull)delegate {
    [super loadRewardedAd:loadInfo delegate:delegate];
    
    //使用自定义聚合SDK加载激励视频广告
    ......
    self.rewardedVideoAd = xxx
    ......
}

- (void)loadInterstitialAd:(MCLoadInfo *_Nonnull)loadInfo delegate:(id<MCAdapterDelegate>_Nonnull)delegate {
    [super loadInterstitialAd:loadInfo delegate:delegate];
    
    //使用自定义聚合SDK加载插屏广告
    ......
    self.interstitialAd = xxx
    ......
}

- (void)loadAppOpenAd:(MCLoadInfo *_Nonnull)loadInfo containerView:(UIView *_Nullable)containerView delegate:(id<MCAdapterDelegate>_Nonnull)delegate {
    [super loadAppOpenAd:loadInfo containerView:containerView delegate:delegate];
    
    //使用自定义聚合SDK加载开屏广告
    ......
    self.splashAd = xxx
    ......
}

// banner
- (void)loadAdViewAd:(MCLoadInfo *_Nonnull)loadInfo delegate:(id<MCAdapterDelegate>_Nonnull)delegate {
    [super loadAdViewAd:loadInfo delegate:delegate];
    
    //使用自定义聚合SDK加载横幅广告
    ......
    self.bannerView = xxx
    ......
}

// native
- (void)loadNative:(MCLoadInfo *_Nonnull)loadInfo delegate:(id<MCAdapterDelegate>_Nonnull)delegate {
    [super loadNative:loadInfo delegate:delegate];
    
    //根据需求设置一些回调标志
    self.isDidAdShowCallback = NO;
    self.isDidAdVideoStartCallback = NO;
    
    //使用自定义聚合SDK加载原生广告
    ......
    self.bannerView = xxx
    ......
}

//返回是否就绪
- (BOOL)isAdReady {
    if (self.format == [MCAdFormat rewarded]) {
        return self.rewardedVideoAd.isReady;
    }
    if (self.format == [MCAdFormat interstitial]) {
        return self.interstitialAd.isReady;
    }
    if (self.format == [MCAdFormat appOpen]) {
        return self.splashAd.isReady;
    }
    if ([self.format isAdViewAd]) {
        return self.bannerView.isReady;
    }
    if (self.format == [MCAdFormat native]) {
        return self.nativeAd.isReady;
    }
    return NO;
}

// 插屏、激励视频show
- (void)show:(UIViewController *_Nullable)vc extra:(NSDictionary *_Nullable)extra {
    [super show:vc extra:extra];
    if (self.format == [MCAdFormat rewarded]) {
        [self.rewardedVideoAd show...
    } else if (self.format == [MCAdFormat interstitial]) {
        [self.interstitialAd show...
    }
}

// 开屏广告show
- (void)showAdWithWindow:(UIWindow *_Nullable)window viewController:(UIViewController *_Nullable)viewController withExtra:(NSDictionary *_Nullable)extra {
    [super showAdWithWindow:window viewController:viewController withExtra:extra];
    
    if (self.format == [MCAdFormat appOpen]) {
        [self.splashAd show...
    }
}

// debug调试工具show
- (void)showMediationDebuggerWithViewController:(UIViewController * _Nullable)viewController {
    //展示三方聚合调试工具
}

// 获取bannerView
- (UIView *_Nullable)getBannerView {
    return self.bannerView;
}

- (void)destroyAd {
    if ([self.format isAdViewAd]) {
        //销毁资源
        [self.bannerView destory];
        self.bannerView = nil;
    } else if (self.format == [MCAdFormat native]) {
        //销毁资源
        [self.nativeAd destory];
        self.nativeAd = nil;
    }
}

#pragma mark - over write

- (void)initAdInfo {
    [super initAdInfo];
    
    self.adInfo.networkPlacementId = self.ritInfo.slotID;

    [self updateRevenue:self.ritInfo];
    self.adInfo.compareRevenue = self.adInfo.originRevenue;
    if (self.adInfo.originRevenue <= 0) {
        self.adInfo.compareRevenue = [self getGroMorePrice];
    }
    
    [self showLog:[NSString stringWithFormat:@"gromore offer ecpm:%@", [NSNumber numberWithDouble:self.adInfo.originRevenue*1000]]];
    
    self.adInfo.revenuePrecision = ({
        RevenuePrecisionEnum revenuePrecision = RuePsionUndefined;
        revenuePrecision = 自定义聚合提供的接口
        revenuePrecision;
    });
    
    self.adInfo.country = @"";
    self.adInfo.currency = self.currency;
    self.adInfo.networkName = self.ritInfo.adnName;
    self.adInfo.extraDic = nil;
    
    [self updateOriginData:self.mediaExt];
}

#pragma mark - 以下实现自定义聚合平台的事件协议方法,并通过adDelegate通知MCSDK,以开屏为例,通知前可以准备一些信息设置给adInfo
- (void)splashAdDidShowFailed:(SplashAd *_Nonnull)splashAd error:(NSError *)error {
    [self showDelegateLog:[NSString stringWithFormat:@"splashAdDidShowFailed:error: %@, %@", splashAd, error]];
    
    MCAdapterError *mcError = [[MCAdapterError alloc] initWithCode:error.code message:error.description mediationId:self.mediationId mediatedNetworkErrorCode:error.code mediatedNetworkErrorMessage:error.description originError:error];
    [self.adDelegate didAdDisplayFailed:self.adInfo withError:mcError];
}

- (void)splashAdLoadSuccess:(SplashAd *)splashAd {
    self.ritInfo = [splashAd.mediation getCurrentBestEcpmInfo];
    self.mediaExt = splashAd.mediaExt;
    [self initAdInfo];
    
    [self showDelegateLog:[NSString stringWithFormat:@"splashAdLoadSuccess: %@", splashAd]];
    [self.adDelegate didAdLoadSuccess:self.adInfo];
}

....其他广告类型类似

@end
上一个
高级功能
下一个
自定义流量分组
最近修改: 2025-03-31Powered by