横幅自定义平台的适配方法
对于横幅来说,AFP SDK目前聚合的第三方的SDK有个特点就是,这些第三方SDK的横幅的都定义为UIView的子类,而AFP是对他们做了统一的包装,所以开发者在自定义适配第三方SDK横幅样式的时候,需要确最后保给AFP的横幅对象是UIView的实例。
因为AFP已经默认适配了一些平台的横幅样式,并且适配器的源代码是开放的,开发者可以参考这些实例来完成自己的适配,这里以适配广点通的横幅(MMUGDTBannerAdapter.m)为例介绍。
首先开发者定义的适配器必须是MMUBannerAdNetworkAdapter的子类,并实现以下方法:
返回平台ID的方法:
+ (MMUAdNetworkType)networkType { return MMUAdNetworkTypeGDT; }
此方法和之前介绍的一样,就是需要返回目前适配的平台编号,对于自定义平台,这个是开发者在AFP后台生成的自定义平台编号。
重写基类的load方法。
+ (void)load { [[MMUSDKBannerNetworkRegistry sharedRegistry] registerClass:self]; }
此方法是将当前的适配器类注册给AFP SDK,这样AFP SDK就会知道当前支持横幅创意的有哪几个平台,并根据AFP服务下发的配置中的平台列表依次向这些平台请求创意。
重写基类的getAd方法,当AFP SDK尝试向某个实现了横幅样式的第三方平台请求创意的时候会调用此方方法。它做的几个重要的事情如下
- (void)getAd { //1,需要调用基类的adBannerWillStartRequest方法, //此方法告诉AFP SDK已经找到一个平台,将要开始创意请求。 [self adBannerWillStartRequest]; ...... //2,self.ration是当前适配器获取的针对当前平台的配置信息,它是NSDictinary类型的,主要的成员有: //(1)该平台SDK横幅创意请求所需的信息,key值为KEY_NETSET,对于广点通来说value为appid、pid的值。 NSDictionary *config = [self.ration mmuDictionaryValueForKey:KEY_NETSET]; //(2)横幅的通用配置信息,比如大小 NSString *sizeInfoStr = [(NSDictionary*)[self.ration objectForKey:KEY_AZSET] objectForKey:KEY_BANNER_SIZE]; //3,根据配置信息得出横幅的类型 NSString *sizeInfoStr = [(NSDictionary*)[self.ration objectForKey:KEY_AZSET] objectForKey:KEY_BANNER_SIZE]; NSDictionary *sizeInfo = [self typeInfoWithDescription:sizeInfoStr]; NSNumber *typeInfo = [sizeInfo mmuNumberValueForKey:KEY_BANNER_TYPE]; MMUBannerType type = (typeInfo != nil) ? (MMUBannerType)[typeInfo intValue] : MMUBannerUnknow; ...... //4,至此获取了广点通横幅创意请求所需要的全部参数,根据这些参数使用广点通的SDK请求横幅创意 self.bannerView = [[GDTMobBannerView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height) appkey:appid placementId:pid]; //5,通知AFP横幅创意请求已经开始 [self adBannerDidStartRequest]; }
注意这里的横幅创意分为“即将开始”和“已经开始”两个步骤,这允许开发者在“即将开始”之后和“已经开始”之前中止请求,比如,可以使用adBannerFailWithError让请求直接结束。
指定该平台SDK的横幅创意是否有点击事件的回调,如果没有,那么点击事件采用APF 横幅自己的点击事件统计数据,否者在该平台横幅的点击回调事件中统计。
- (BOOL)isSupportClickDelegate { return YES; }
该平台横幅请求成功的回调
- (void)bannerViewDidReceived { //通知AFP收到创意返回 [self adBannerDidReceiveAd]; [self adBannerDidReceiveBannerView:self.bannerView]; }
该平台横幅请求失败的回调
- (void)bannerViewFailToReceived:(NSError *)error { //针对该平特殊逻辑(广点通在二跳页展示失败的时候也会调用这个回调)对开发者适配其他平台不是必须的 if ([self getAdapterState] >= ST_MMUAapterReady) return; //通知AFP SDK请求失败了 [self adBannerFailWithError:MMUE_PFAdFailed]; }
横幅点击回调
- (void)bannerViewClicked { [self adBannerClicked]; }
至此广点通的适配完毕;
可以看到,在基类中还有其他方法:
//平台横幅被挂起
- (void)adBannerSuspend;
//平台横幅重启
- (void)adBannerResumed;
如果开发者适配的平台SDK的横幅支持这些特性也需要调用基类的方法通知AFP SDK。