平台适配介绍


  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样式代理的时候,代理类中要避免出现以类似规则命名的方法,以防止冲突
powered by Gitbook该文件修订时间: 2017-02-16 17:30:43