平台适配介绍
iOS AFP SDK使用适配器来作为统一管理和调配第三方SDK的工具,适配通过对个各个第三方平台SDK的消息的转换屏蔽了平台插屏,最终向开发者提供统一的接口。本文将重点介绍适配器体系和定义适配器的方式。
平台适配器类库介绍 由上图可见,SDK的适配器分为:MMUBannerAdNetworkAdapter、MMUSplashAdNetworkAdapter、MMUInterstitialAdNetworkAdapter、MMUDataInterfaceAdapter四种适配器 其中:
- MMUBannerAdNetworkAdapter:用于适配第三方SDK的横幅样式。
- MMUSplashAdNetworkAdapter:用于适配第三方SDK的开屏样式。
- MMUInterstitialAdNetworkAdapter:用于适配第三方SDK的插屏样式。
MMUDataInterfaceAdapter:用适配提供数据接口的第三方SDK,支持样式有开屏、信息流、焦点图,
这四种适配都继承自MMUAdNetworkAdapter,这个类有一个属性和几个重要的方法:
//这个属性是从AFP SDK传来的配置信息,一般包含当前平台相关样式的创意请求所用的参数。 @property (nonatomic,strong) NSDictionary *ration; //在此方法中开始当前平台的相关样式的创意请求 - (void)getAd; //获取当前平台创意请求状态, - (MMUAdapterState)getAdapterState; //用于主动中止当前平台创意请求 - (void)stopAd; //用于提前主动清理和当前平台相关的资源 - (void)cleanAd;
定义平台适配的具体步骤
AFP SDK默认定义的第三方SDK适配器支持的样式属于横幅、开屏、插屏、信息流、焦点图样式集合,为方便开发者的真对特定平台的定制化,这些适配的具体类是开源的,以下是定义一个第三方SDK样式适配器的具体方法。
如果该样式是开屏、信息流、焦点图的一种,并且支持数据接口或者可以以其他方式得到创意数据,在定义该适配器的时候需要继承自MMUDataInterfaceAdapter(可参见MMUDataInterfaceAdapter.h中的定义和注释)并且必须实现以下方法(以实现广点通的信息流为例,可参见MMUGDTNativeAdapter.m文件):
//此方法返回的值指定要适配的是那个平台 + (MMUAdNetworkType)networkType { //这里是广点通,其他平台参见MMUAdNetworkType的定义 return MMUAdNetworkTypeGDT; } + (void)load { /*把当前适配器注册到MMUFeedsSDKAdapterRegistry中定义的集合里面 这个集合保存了所有平台SDK信息里样式的适配器。 如果是开屏样式代码为: [[MMUDISplashNetworkRegistry sharedRegistry] registerClass:self]; 如果是焦点图样式代码为: [[MMUHeadlineAdapterRegistry sharedRegistry] registerClass:self]; 如果是入口样式代码为: [[MMUHandleAdapterRegistry sharedRegistry] registerClass:self]; */ [[MMUFeedsSDKAdapterRegistry sharedRegistry] registerClass:self]; } //此方法中使用第三方SDK提供的接口做创意数据的请求 - (void)getAd { //首先,要取到请求当前平台样式所需的参数信息,前面说了这些参数保存在属性ration中 NSDictionary *config = [self.ration mmuDictionaryValueForKey:@"netset"]; NSString *appid = [config mmuStringValueForKey:@"appid"]; NSString *pid = [config mmuStringValueForKey:@"pid"]; //其次,使用这些参数做第三方SDK样式创意数据的请求 self.nativeAd =[[GDTNativeAd alloc]initWithAppkey:appid placementId:pid]; self.nativeAd.controller = [self.mPDelegate viewControllerForPresentingModalView]; self.nativeAd.delegate = self; //然后,调用基类方法通知请求即将开始, [self adDidWillStartRequestWithInfo:@{}]; [self.nativeAd loadAd:adcount]; //最后,调用基类方法通知请求已经开始 [self adDidWillStartRequestWithInfo:@{}]; } //该平台请求创意成功的回调 -(void)nativeAdSuccessToLoad:(NSArray *)nativeAdDataArray { ....... //把返回数据nativeAdDataArray转换AFP定义的MMUMamaResponse并通知请求成功 [self adDidSuccess:[[MMUMamaResponse alloc] initWithAttributes:mamaDictionary]]; } //该平台请求创意失败的回调 -(void)nativeAdFailToLoad:(NSError *)error { //使用基类方法通知失败 [self adDidFailed:MMUE_PFAdFailed]; } //重写基类方法 展现实现上报 - (void)adDidPresentWithPromoters:(NSArray<MMUMamaPromoter *> *)promoters fromResponse:(MMUMamaResponse *)response { for (MMUMamaPromoter *prom in promoters) { if (!prom || !prom.promoterId) continue; //调用该平台样式的展现上报接口做展示上报 [self.nativeAd attachAd:_mNativeAdDatas[prom.promoterId] toView:[self getRenderView]]; } [super adDidPresentWithPromoters:promoters fromResponse:response]; } //重写基类方法 展现实现上报 -(void)adDidClickWithPromoter:(MMUMamaPromoter*)promoter fromResponse:(MMUMamaResponse *)response { if (!promoter || !promoter.promoterId) return; //调用该平台样式的点击上报接口做点击上报 [self.nativeAd clickAd:_mNativeAdDatas[promoter.promoterId]]; [super adDidClickWithPromoter:promoter fromResponse:response]; }
上面的代码提到,在方法nativeAdSuccessToLoad方法中做数据的转换,IOS AFP SDK数据接口会根据实际语意将聚合的各家的数据统一转化成KEY值为title、sub_title、price、promoprice、img_url、icon_url等字段,并且根据返回模板ID的不同,这些字段的组合也不同,具体的情况可以参考SDK-数据接口使用说明,对于那些平台特有的,IOS AFP SDK无法默认转换的字段,会以"p+下划线+原KEY"的形式重新命该字段返回给开发者。
- 如果该样式是横幅、插屏和非数据接口的开屏,定义适配的时候也需要实现+ (MMUAdNetworkType)networkType、 + (void)load、- (void)getAd;等方法,器实现要做的事情也类似,具体的可以参考iOS AFP SDK中默认实现的继承自MMUBannerAdNetworkAdapter、MMUSplashAdNetworkAdapter、MMUInterstitialAdNetworkAdapter的适配器。此外,AFP会将各个第三方平台的接口归类为创意请求、创意创意请求成功反馈、请求失败反馈、创意展现反馈、创意点击反馈、创意创意关闭等六类,形成IOS AFP SDK统一的对开发者的接口,对那些无法归类的第三方SDK代理接口,会以"MMUEXT+下划线+原方法名" 重新命名该代理接口,因此开发者在创建IOS AFP SDK样式代理的时候,代理类中要避免出现以类似规则命名的方法,以防止冲突。