SDK对接注意事项
-
请在真机上调试,模拟器环境可能会请求不到广告
-
如果是更新sdk,手动部署请直接替换sdksource文件夹。
-
iOS14以上适配很重要,请一定配置,且审核时也一定要出现idfa的弹框。
2.1.4 部分客户在审核的时候会屏蔽广告,但请一定不要屏蔽以下代码(只屏蔽广告调用部分即可),以下代码调用之后会有弹框(只会出现一次),具体见4.1。如果屏蔽了审核会被拒。
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
}];
SDK版本发布记录
| 文档版本 | 修订日期 | 修订说明 |
|---|---|---|
| 3.0.2 | 2022.4.1 | bug修复 |
| 3.0.1 | 2022.3.31 | bug修复、增加互动游戏 |
| 3.0.0 | 2022.3.7 | bug修复 |
| 2.7.9 | 2022.3.2 | bug修复 |
| 2.7.8 | 2022.3.1 | 【增】自动部署增加系统依赖库,见5.1.6 CFNetwork.framework、SafariServices.framework、libbz2.1.0.tbd【增】3.5 SKAdNetwork配置增加3个配置【改】自动部署Podfile内容修改,见5.2自动部署 |
| 2.7.5 | 2022.2.24 | 【删】删除H5互动广告(以后都不支持了)【增】增加组合广告【改】bug修复 |
SDK Appstore 隐私数据获取说明
以下用户数据由 iOS SDK收集,开发者在回答app Store Connect上的应用隐私问题时可以参考此图表。 访问developer.apple.com/app-store/a…了解更多信息。
- 收集的数据类型 | 数据类型 | 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出于其他目的使用数据,请选择 是 |
-
与用户身份的关联性 通过SDK收集的数据类型通常连接到诸如设备ID(如果可用)之类的标识符,或者与其他标识符(如配置时由客户发布的ID)相连。因此,在询问数据是否链接到身份时,应用程序开发人员应选择 是。
-
关于用户追踪 根据苹果对追踪的定义,当应用被用户授予广告追踪权限时,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>
该描述将用于授权IDFA等广告标识符的弹窗提示中,如下所示: 弹窗小字文案建议:
- 获取标记权限向您提供更优质、安全的个性化服务及内容,未经同意我们不会用于其他目的;开启后,您也可以前往系统“设置-隐私 ”中随时关闭。
- 获取IDFA等广告标识符权限向您提供更优质、安全的个性化服务及内容;开启后,您也可以前往系统“设置-隐私 ”中随时关闭。
展示授权弹窗需要调用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文件中,如图所示
<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及以上版本
- 网络权限设置 工程plist文件设置,点击右边的information Property List后边的 "+" 展开
添加 App Transport Security Settings,先点击左侧展开箭头,再点右侧加号,Allow Arbitrary Loads 选项自动加入,修改值为 YES。 SDK API 已经全部支持HTTPS,但是广告主素材存在非HTTPS情况。
-
iOS本地化\国际化配置 注意 : 开发者必须在这里设置所支持的语言,否则会有语言显示的问题.
-
位置权限设置(可选) 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部署
自动部署
- 在Podfile 文件添加以下下(只需要下面两行)
pod 'KSAdSDK', :path => './Pods/KSAdSDK/KSAdSDK.podspec'
pod 'libmysdk', :path => './Pods/MYAdSdk/libmysdk.podspec'
- 拷贝《自动部署DevelopmentPods相关文件》文件夹下的文件到项目中的《Pods》文件夹下
- pod install
结果如下
手动部署
-
拷贝sdkSource文件夹到项目中
-
Xcode设置Other Linker Flags 参数 Build Settings中Other Linker Flags 参数增加参数-ObjC、-l"c++"、 -l"c++abi" 、-l"sqlite3"、-l"z"
-
关于“手动部署上传appStore之前需要替换的库”的文件夹的说明 上传appStore之前,需要用此文件夹中的KSAdSDK.framework库替换路径 “/sdkSource/otherSource/kusiShou/KSAdSDK.framework”下的KSAdSDK.framework。
-
KSAdSDK.framework设置 Targets->Gerenal ->Frameworks,libraries,and embedded Content,找到KSAdSDK.framework设置成Embed&Sign ,否则会报错,具体如下图
-
Validate WorkSapce 设置 Build Settings -> Build Options -> Validate WorkSapce 设置为YES,否则会报错
-
系统依赖库添加
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时使用
如下图所示
广告位id:请求广告时使用
如下图所示
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 类