iOS SDK 对接文档

1,013 阅读15分钟

SDK对接注意事项

  1. 请在真机上调试,模拟器环境可能会请求不到广告

  2. 如果是更新sdk,手动部署请直接替换sdksource文件夹。

  3. iOS14以上适配很重要,请一定配置,且审核时也一定要出现idfa的弹框。

2.1.4 部分客户在审核的时候会屏蔽广告,但请一定不要屏蔽以下代码(只屏蔽广告调用部分即可),以下代码调用之后会有弹框(只会出现一次),具体见4.1。如果屏蔽了审核会被拒。

[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {

  }];

SDK版本发布记录

文档版本修订日期修订说明
3.0.22022.4.1bug修复
3.0.12022.3.31bug修复、增加互动游戏
3.0.02022.3.7bug修复
2.7.92022.3.2bug修复
2.7.82022.3.1【增】自动部署增加系统依赖库,见5.1.6 CFNetwork.framework、SafariServices.framework、libbz2.1.0.tbd【增】3.5 SKAdNetwork配置增加3个配置【改】自动部署Podfile内容修改,见5.2自动部署
2.7.52022.2.24【删】删除H5互动广告(以后都不支持了)【增】增加组合广告【改】bug修复

SDK Appstore 隐私数据获取说明

以下用户数据由 iOS SDK收集,开发者在回答app Store Connect上的应用隐私问题时可以参考此图表。 访问developer.apple.com/app-store/a…了解更多信息。

  1. 收集的数据类型 | 数据类型 | SDK收集情况 |备注| | --- | --- |--- | | 联系信息 Contact Info 姓名 Name 电子邮件地址 Email Address 电话号码 Phone Number 实际地址 Physical Address 其他用户联系信息 Other User Contact Info | 不收集 || |健康与健身 Health and Fitness 健康 Health 健身 Fitness | 不收集 || | 财务信息 Financial Info 付款信息 Payment Info 信用信息 Credit Info 其他财务信息 Other Financial Info | 不收集 || | 位置 Location 精确位置 Precise Location 粗略位置 Coarse Location | 可选收集 不收集|SDK会获取地理位置信息用于广告投放与反作弊。 应用被用户授予地理位置权限时,SDK会获取地理位置信息,用于广告定向与反作弊;当应用不获取地理位置权限时,SDK不会主动获取地理位置权限及地理位置信息。| | 敏感信息 Sensitive Info | 不收集 || | 联系人 Contacts | 不收集 || |用户内容 User Content 电子邮件或短信内容 Emails or Text Messages 照片或视频 Photos or Videos 音频数据 Audio Data 游戏内容 Gameplay Content 客户支持 Customer Support 其他用户内容 Other User Content| 不收集|| |浏览历史记录 Browsing History | 不收集 || | 搜索历史记录 Search History | 不收集 || | 标识符 Identifiers 用户ID User ID 设备ID Device ID | 可选收集 |用户ID仅用于功能-奖励视频服务器端验证回调。开发者在广告请求期间向SDK发送他们的用户名(基本上是一系列数字,SDK不知道它与该应用内的内部用户id或内部用户名的关系。SDK只接收这些数据,不检查、不验证、不存储、不使用)。当用户完全观看奖励视频时,SDK将把这个用户id发送回开发者的服务器。如果开发者不使用此功能,则开发者不需要传递此类数据。设备ID 当应用被用户授予广告追踪权限时,SDK将获取idfa用于广告归因与追踪。| |购买项目 Purchases 购物历史 Purchase History| 不收集 || | 使用数据 Usage Data 产品交互 Product Interaction 广告数据 Advertising Data 其他使用数据 Other Usage Data | 不收集 收集 不收集|SDK广告将统计下列广告数据,以用于广告主统计投放结果。展示 、点击 、转化| | 诊断 Diagnostics 崩溃数据 Crash Data 性能数据 Performance Data 其他诊断数据 Other Diagnostic Data | 收集 收集 不收集 |崩溃数据 SDK将收集SDK带来的崩溃信息,以此来优化代码缺陷。 性能数据 SDK将收集SDK运行过程中性能数据,以优化SDK的性能。| | 其他数据 Other Data 其他数据类型 Other Data Types | 收集|技术上我们还会收集一些设备信息(例如,设备型号、操作系统及版本、时区、网络类型等)|

2.数据的使用目的 苹果明示了一系列的数据使用目的,需要开发者根据App中数据的使用情况进行披露。如下表所示,SDK依据自身功能,列举了数据的使用目的,以供参考。

基于媒体与我方的合作目的,SDK收集数据的主要目的是用于“第三方广告”、“APP功能”(如流量变现的功能); 其他使用目的基于媒体自己的使用情况而定。

使用目的基于接入SDK的功能,选择数据的使用目的
第三方广告Third-Party Advertising
开发者广告或营销内容Developer’s Advertising or Marketing如您的App使用数据用于显示应用中的第一方广告(包括与第三方共享以显示广告)或其他营销目的,请选择 
分析Analytics广告数据会用于分析,请选择 
产品个性化 Product Personalization如您的App将数据用于任何产品个性化功能,请选择 
App 功能App Functionality
其他用途 Other Purposes如您的App出于其他目的使用数据,请选择 
  1. 与用户身份的关联性 通过SDK收集的数据类型通常连接到诸如设备ID(如果可用)之类的标识符,或者与其他标识符(如配置时由客户发布的ID)相连。因此,在询问数据是否链接到身份时,应用程序开发人员应选择 

  2. 关于用户追踪 根据苹果对追踪的定义,当应用被用户授予广告追踪权限时,SDK将获取IDFA用于广告归因与追踪。

iOS14以上适配指南 很重要***

本文档列出了流量侧需要为iOS14.5升级所需要的修改,目的是请求用户授权,访问与应用相关的数据以跟踪用户或设备。

获取 App Tracking Transparency 授权(弹窗授权获取IDFA等广告标识符)

  • App Tracking Transparency (ATT)  适用于请求用户授权,访问与应用相关的数据以跟踪用户或设备。 访问 developer.apple.com/documentati…了解更多信息。 目前苹果要求在iOS 14.5及以上的版本中必须在弹窗取得用户同意后,才可以追踪用户。对其他版本暂无明确要求,开发者应根据需要配置弹窗

如果想在流量中显示 App Tracking Transparency 授权来获取IDFA等广告标识符,需要在Info.plist中添加NSUserTrackingUsageDescription,描述获取IDFA等广告标识符的用途。例如:

<key>NSUserTrackingUsageDescription</key> 
<string>XXXXXXXXXXXXXXXXX </string>

image.png

该描述将用于授权IDFA等广告标识符的弹窗提示中,如下所示: 弹窗小字文案建议:

  • 获取标记权限向您提供更优质、安全的个性化服务及内容,未经同意我们不会用于其他目的;开启后,您也可以前往系统“设置-隐私 ”中随时关闭。
  • 获取IDFA等广告标识符权限向您提供更优质、安全的个性化服务及内容;开启后,您也可以前往系统“设置-隐私 ”中随时关闭。

image.png

展示授权弹窗需要调用requestTrackingAuthorizationWithCompletionHandler:方法。代码如下(可参考demo中的SPLAViewController.m文件):

#import <AppTrackingTransparency/AppTrackingTransparency.h>
#import <AdSupport/AdSupport.h>
- (void)requestIDFA {
  [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
    //  授权完成回调
    // [self loadad];
  }];

}

ios15以上注意点(新的)***

ios 15以上注意点(新的)需要添加的代码,很多用户审核被拒了,注意下。 这边调用这个代码主要是为了在ios 15以上的系统,用户第一次安装app出现idfa的弹框,即上图中的弹框。如果您已经保证了ios 15以上系统的用户第一次安装app会出现idfa授权弹框,可忽略这个。

appdelegate-(void)applicationDidBecomeActive:(UIApplication *)application

{

    if ( @available(iOS 14.5, *)) {

        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {        }];

    }

}

SKAdNetwork 接入

  • SKAdNetwork(SKAN)  是 Apple 的归因解决方案,可帮助广告客户在保持用户隐私的同时衡量广告活动。 使用 Apple 的 SKAdNetwork 后,即使 IDFA 不可用,广告网络也可以正确获得应用安装的归因结果。 访问 developer.apple.com/documentati… 了解更多信息。 为了广告转化的归因,所有开发者须设置SKAdNetwork方案的 SKAdNetwork id

请将下列参数添加到info.plist中。可以右键info.plist文件,选择open as ->source code,直接复制到info.plist文件中,如图所示 image.png

<key>SKAdNetworkItems</key>

<array>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>x2jnk7ly8j.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>238da6jt44.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>58922nb4gd.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>f7s53z58qe.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>27a282f54n.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>kbd757ywx3.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>mls7yz5dvl.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>4fzdc2evr5.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>4pfyvq9l8r.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>ydx93a7ass.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>cg4yq2srnc.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>p78axxw29g.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>737z793b9f.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>v72qych5uu.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>6xzpu9s2p8.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>ludvb6z3bs.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>mlmmfzh3r3.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>c6k4g5qg8m.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>wg4vff78zm.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>523jb4fst2.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>ggvn48r87g.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>22mmun2rn5.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>3sh42y64q3.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>f38h382jlk.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>24t9a8vw3c.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>hs6bdukanm.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>prcb7njmu6.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>m8dbw4sv7c.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>9nlqeag3gk.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>cj5566h2ga.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>cstr6suwn9.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>w9q455wk68.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>wzmmz9fp6w.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>yclnxrl5pm.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>4468km3ulz.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>t38b2kh725.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>k674qkevps.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>7ug5zh24hu.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>5lm9lj6jb7.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>9rd848q2bz.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>7rz58n8ntl.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>4w7y6s5ca2.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>feyaarzu9v.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>ejvt5qm6ak.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>9t245vhmpl.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>n9x2a789qt.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>44jx6755aq.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>zmvfpc5aq8.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>tl55sbb4fm.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>2u9pt9hc89.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>5a6flpkh64.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>8s468mfl3y.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>glqzh8vgby.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>av6w8kgt66.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>klf5c3l5u5.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>dzg6xy7pwj.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>y45688jllp.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>hdw39hrw9y.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>ppxm28t8ap.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>424m5254lk.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>5l3tpt7t6e.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>uw77j35x4d.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>4dzt52r2t5.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>mtkv5xtk9e.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>gta9lk7p23.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>5tjdwbrq8w.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>3rd42ekr43.skadnetwork</string>
</dict>

<dict>
<key>SKAdNetworkIdentifier</key>
<string>g28c52eehv.skadnetwork</string>
</dict>

</array>

Xcode 配置

开发工具:推荐Xcode 12及以上版本

部署目标:iOS 9.0及以上版本

  1. 网络权限设置 工程plist文件设置,点击右边的information Property List后边的 "+" 展开

添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。 SDK API 已经全部支持HTTPS,但是广告主素材存在非HTTPS情况。

image.png

image.png

  1. iOS本地化\国际化配置 注意 : 开发者必须在这里设置所支持的语言,否则会有语言显示的问题. image.png

  2. 位置权限设置(可选) SDK不会主动获取应用位置权限,当应用本身有获取位置权限逻辑时,需要在应用的 info.plist 添加相应配置信息,避免 App Store 审核被拒

//应用根据实际情况配置

   Privacy - Location When In Use Usage Description

   Privacy - Location Always and When In Use Usage Description

   Privacy - Location Always Usage Description

   Privacy - Location Usage Description

SDK部署

自动部署

  1. 在Podfile 文件添加以下下(只需要下面两行)
pod 'KSAdSDK', :path => './Pods/KSAdSDK/KSAdSDK.podspec'
pod 'libmysdk', :path => './Pods/MYAdSdk/libmysdk.podspec'
  1. 拷贝《自动部署DevelopmentPods相关文件》文件夹下的文件到项目中的《Pods》文件夹下

image.png

  1. pod install

结果如下

image.png

image.png

手动部署

  1. 拷贝sdkSource文件夹到项目中

  2. Xcode设置Other Linker Flags 参数 Build Settings中Other Linker Flags 参数增加参数-ObjC、-l"c++"、 -l"c++abi" 、-l"sqlite3"、-l"z"

  3. 关于“手动部署上传appStore之前需要替换的库”的文件夹的说明 上传appStore之前,需要用此文件夹中的KSAdSDK.framework库替换路径 “/sdkSource/otherSource/kusiShou/KSAdSDK.framework”下的KSAdSDK.framework。

  4. KSAdSDK.framework设置 Targets->Gerenal ->Frameworks,libraries,and embedded Content,找到KSAdSDK.framework设置成Embed&Sign ,否则会报错,具体如下图 image.png

  5. Validate WorkSapce 设置 Build Settings -> Build Options -> Validate WorkSapce 设置为YES,否则会报错

  6. 系统依赖库添加

StoreKit.framework

AdSupport.framework

CoreLocation.framework

SystemConfiguration.framework

CoreTelephony.framework

libz.tbd

Security.framework

libxml2.tbd

AVFoundation.framework

WebKit.framework

AudioToolbox.framework

CoreGraphics.framework

CoreImage.framework

CoreText.framework

JavaScriptCore.framework

MapKit.framework

UIKit.framework

libc++abi.tbd

MobileCoreServices.framework

MediaPlayer.framework

CoreMedia.framework

CoreMotion.framework

Accelerate.framework

libresolv.9.tbd

libc++.tbd

libsqlite3.tbd

libbz2.tbd

ImageIO.framework

libiconv.tbd

QuartzCore.framework

Foundation.framework

CoreData.framework

AVKit.framework

MessageUI.framework

QuickLook.framework    

AddressBook.framework

AppTrackingTransparency. framework

CFNetwork.framework

SafariServices.framework

libbz2.1.0.tbd

关于appId和广告位Id的介绍

appId:初始化sdk时使用

如下图所示 WeChat689a30a1fd7b8a5fc5dcb86cef621981.png

广告位id:请求广告时使用

如下图所示 WeChata97ba58102289a6e0b17fdf6a4793f66.png

SDK初始化

[[MYSDKConfig getDefaultInstance] setAppID:appId callback:^(BOOL success)

    {

        if(success)

        {

           //初始化成功,可在此处请求开屏广告

        }else

        {
            //初始化失败

        }

    }];

开屏广告

  • 调用方法
//请求开屏广告, data:开屏广告Data
-(void) my_showSplashAd:(MYSplashAdData *)data;

// 关闭开屏广告,在失败和关闭回调中调用此方法来关闭开屏广告
-(void) my_closeSplashAd;
  • 回调协议 MYSplashAdDelegate
//广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onSplashAdFail:(NSString*)error;

//广告渲染成功
- (void) onSplashAdExposure;

// 广告被点击
- (void) onSplashAdClicked;

// 广告被跳过
- (void) onSplashAdClose;
  • 代码示例
    self.aCenter = [[MYAdCenter alloc] init];  //aCenter是声明的一个属性,必须要用属性
    MYSplashAdData *data = [[MYSplashAdData alloc] init];
    data.positionID = spla_id;//广告位id
    data.rootViewController = self.window.rootViewController;
    data.splashDelegate = self;
    if (@available(iOS 14, *)) {
        [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
             // 授权完成回调
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.aCenter my_showSplashAd:data];
            });
        }];
    } else
    {
        [self.aCenter my_showSplashAd:data];
    }
    
    
 //协议回调
 ///广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onSplashAdFail:(NSString*)error{
        //失败了 需要调用my_closeSplashAd
        [self.aCenter my_closeSplashAd];
        self.aCenter = nil;
}

//广告渲染成功
- (void) onSplashAdExposure{
}

// 广告被点击
- (void) onSplashAdClicked{
}

// 广告被关闭
- (void) onSplashAdClose{
    //关闭了 需要调用my_closeSplashAd
    [self.aCenter my_closeSplashAd];
    self.aCenter = nil;
}

插屏广告

  • 调用方法
//请求插屏广告
-(void) my_showInterActionAd:(MYInterActionAdData *)data;
  • 回调协议 MYInterActionAdDelegate
//广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onInterActionAdFail:(NSString*)error;

//广告渲染成功
- (void) onInterActionAdExposure;

//广告被关闭
- (void) onInterActionAdDismiss;

//广告被点击
- (void) onInterActionAdClicked;

//视频准备就绪开始播放(非视频广告不回调)
- (void) onInterActionVideoReady;

//视频播放完成(非视频广告不回调)
- (void) onInterActionVideoComplete;
  • 代码示例
MYInterActionAdData *data = [[MYInterActionAdData alloc] init];
data.positionID = inter_id_full;
data.rootViewController = self;
data.interActionAdDelegate = self;
[self.aCenter my_showInterActionAd:data];

//回调协议
- (void) onInterActionAdFail:(NSString*)error{
    self.aCenter = nil;
}
- (void) onInterActionAdDismiss{
    self.aCenter = nil;
}
- (void) onInterActionAdExposure{}
- (void) onInterActionAdClicked{}
- (void) onInterActionVideoReady{}
- (void) onInterActionVideoComplete{}

Banner广告

宽高比为6.4:1

  • 调用方法
//请求banner广告
-(void) my_showBannerAd:(MYBannerAdData *)data;

//移除banner广告
-(void)removeBannerAd;
  • 回调协议 MYBannerAdDelegate
//广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onBannerAdFail:(NSString*)error;

//广告渲染成功
- (void) onBannerAdExposure;

//广告被关闭
- (void) onBannerAdDismiss;

//广告被点击
- (void) onBannerAdClicked;

///banner 高度(部分广告源返回)
-(void) onBannerHeight:(CGFloat)height;
  • 代码示例
MYBannerAdData *data = [[MYBannerAdData alloc] init];
data.positionID = banner_id;
data.rootViewController = self;
data.bannerAdDelegate = self;
data.bannerFrame = CGRectMake(x,y,width,height);
[self.aCenter my_showBannerAd:data];

//回调
///广告关闭时需要movebanner
- (void) onBannerAdDismiss{
    [self.aCenter removeBannerAd];
}

激励视频广告

  • 调用方法
/// 激励视频广告调用,返回值为订单号
-(NSString *) my_showRewardVideoAd:(MYRewardVideoAdData *)data;

/// 显示激励视频广告
-(void) showRewardVideoAd;
  • 回调协议 MYRewardVideoAdDelegate
//广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onRewardAdFail:(NSString*)error;

//视频被点击
- (void) onRewardAdClicked;

//视频被关闭
- (void) onRewardAdClose;

//视频广告曝光
- (void) onRewardAdExposure;

//视频广告加载完成,此时播放视频不卡顿
- (void) onRewardVideoCached;

//激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
- (void) onRewardVerify;
  • 代码示例
MYRewardVideoAdData *data = [[MYRewardVideoAdData alloc] init];
data.positionID = revideo_id_V;
data.rootViewController = self;
data.rewardVideoAdDelegate = self;
data.showDirection = MYAdShowDirection_Vertical;//MYAdShowDirection_Horizontal
data.userId = @"1234";
data.extraData = @"我真实个好人啊mmmmmmaaaa123";
self.aCenter = [[MyAdCenter alloc] init]
[self.aCenter my_showRewardVideoAd:data];

//回调
///广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)

- (void) onRewardAdFail:(NSString*)error{
    self.aCenter = nil;
}

//视频被点击
- (void) onRewardAdClicked{
}

///视频被关闭
- (void) onRewardAdClose{
    self.aCenter = nil; 
}

//视频广告曝光
- (void) onRewardAdExposure{
}

//视频广告加载完成,此时播放视频不卡顿
- (void) onRewardVideoCached{
    [self.aCenter showRewardVideoAd];//调用播放激励视频

}

//激励视频触发激励(观看视频大于一定时长或者视频播放完毕)
- (void) onRewardVerify{
    //发放奖励
}

信息流广告

  • 调用方法
/// 请求信息流广告广告调用
-(void) my_showNativeAd:(MYNativeAdData *)data;

//获取广告cell高度
- (CGFloat)my_heightForNativeAd:(id)adData;

//获取cell
- (UITableViewCell *)my_tableView:(UITableView *)tableView cellForForNativeAd:(**id**)adData IndexPath:(NSIndexPath *)indexPath;
  • 回调协议 MYNativeAdDelegate
//广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onNativeAdFail:(NSString*)error;

//广告加载成功,刷新数据
- (void) onNativeAdloadSuccessWithDataArray:(NSMutableArray *)adDataArray;

//点击不喜欢,关闭广告
- (void) onNativeAdClickDislike:(id)data;

//广告渲染成功
- (void) onNativeAdExposure;

//广告被关闭
- (void) onNativeAdDismiss;

//广告被点击
- (void) onNativeAdClicked;

//视频准备就绪开始播放(非视频广告不回调)
- *void) onNativeVideoReady;

//视频播放完成(非视频广告不回调)
- (void) onNativeVideoComplete;
  • 代码示例 参考demo中的NativeAdBaseController

自渲染信息流广告

  • 调用方法
// 请求信息流自渲染广告数据
-(void)my_requestUnifiedAd:(MYUnifiedAdData *)data;

// 信息流自渲染广告视图注册
// @param dataObject 数据对象,必传字段
// @param clickableViews 可点击的视图数组,此数组内的广告元素才可以响应广告对应的点击事件
// @param customClickableViews 可点击的视图数组,与clickableViews的区别是:在视频广告中当dataObject中的videoConfig的detailPageEnable为YES时,点击后直接进落地页而非视频详情页,除此条件外点击行为与clickableViews保持一致
- (void)my_registerDataObject:(**id**)dataObject view:(UIView *)view clickableViews:(NSArray<UIView *> *)clickableViews customClickableViews:(NSArray <UIView *> *)customClickableViews;
  • 回调协议 MYUnifiedNativeAdDelegate
//返回广告数据回调 unifiedNativeAdDataObjects数组中的元素类型为GDTUnifiedNativeAdDataObject
- (void)unifiedNativeAdLoaded:(NSArray * **_Nullable**)unifiedNativeAdDataObjects :(NSError * **_Nullable**)error;

//广告点击回调
- (void)unifiedNativeAdClick;

//广告展示回调
- (void)unifiedNativeAdExposure;
  • 代码示例 参考demo中的QBBaseNativeViewController

draw信息流广告

  • 调用方法
// draw竖版视频信息流广告调用
-(void) my_showDrawNativeVideoAd:(MYDrawNativeVideoAdData *)data;

// draw竖版视频信息流广告 获取广告UITableViewCell
// @param tableView 显示的tableview
// @param adData 广告数据
// @param indexPath table的indexPath
// @return UITableViewCell
- (UITableViewCell *)my_tableView:(UITableView *)tableView cellForForDrawVideoAd:(id)adData IndexPath:(NSIndexPath *)indexPath;

// draw竖版视频信息流广告 获取广告UICollectionViewCell
// @param collectionView 显示的UICollectionView
// @param adData 广告数据
// @param indexPath table的indexPath
// @return UICollectionViewCell
- (UICollectionViewCell *)my_collectionView:(UICollectionView *)collectionView cellForForDrawVideoAd:(**id**)adData IndexPath:(NSIndexPath *)indexPath;
  • 回调协议 MYDrawNativeVideoAdDelegate
//广告加载失败,msg加载失败说明(如果重新请求广告,注意:只重新请求一次)
- (void) onDrawNativeAdFail:(NSString*)error;

//视频被点击
- (void) onDrawNativeAdClicked;

// 广告曝光回调
- (void) onDrawNativeRenderSuccess;

//广告加载成功,刷新数据
- (void) onDrawNativeAdloadSuccessWithDataArray:(NSMutableArray *)adDataArray;
  • 代码示例 参考demo中的DrawVideoAdViewController类

视频内容+广告样式

  • 调用方法
//请求内容+广告样式广告
-(**void**)my_showContentStyleAd:(MYContentStyleAdData *)data;

/**
 播放器外部控制能力,需要联系商务申请
* 媒体调用,控制当前视频启播或者恢复播放;
*/
- (void)resumeCurrentPlayer;

/**
 播放器外部控制能力,需要联系商务申请
* 媒体调用,控制当前视频暂停播放; 若在首个video起播前调用,视频不启播,若在视频播放过程中调用,视频转变为暂停播放状态。
*/
-  (void)pauseCurrentPlayer;

/*
 释放内容列表样式
*/
-(void) deallocContentStyleAd;
  • 回调协议 MYContentStyleAdDelegate
/**
* 请求失败
*/
- (void)onContentStyleAd_loadFail;

/**
 * 视频开始播放
 * **@param** videoId       视频Id
 */
- (void)onContentStyleAd_videoDidStartPlay:(NSString *)videoId;

/**
* 视频暂停播放
* @param videoId        视频Id
*/
- (void)onContentStyleAd_videoDidPause:(NSString *)videoId;

/**
* 视频恢复播放
* @param videoId         视频Id
*/
- (void)onContentStyleAd_videoDidResume:(NSString *)videoId;

/**
* 视频停止播放
* @param videoId        视频Id
* @param finished        是否播放完成
*/
- (void)onContentStyleAd_videoDidEndPlay:(NSString *)videoId :(BOOL)finished;

/**
* 视频播放失败
* @param videoId        视频Id
* @param error          失败原因
*/
- (void)onContentStyleAd_videoDidFailedToPlay:(NSString *)videoId :(NSString *)error;
  • 代码示例
MYContentStyleAdData *data = [[MYContentStyleAdData alloc] init];
data.positionID = contentTypeAd_id;
data.rootViewController = self;
data.contentStyleViewFrame = CGRectMake(x,y,width,height);
data.contentStyleAdDelegate = self;
[self.aCenter my_showContentStyleAd:data];

互动游戏

  • 调用方法
//获取互动模块controller
-(UIViewController *)getActiveViewCOntroller:(MYActiveAdData *)data;

//获取wkwebview
//controller 是getSaWebViewControllerWithData获取的controller
-(WKWebView*)getActiveWebViewWithController:(UIViewController *)controller;
  • 代码示例 参考demo ActiveAdViewController 类