iOS 版
Adiz iOS¶
Adiz iOS 是 Hive 提供的 iOS 广告模块,旨在简化使用 AdMob 提供的广告曝光功能。Adiz iOS 提供的广告类型如下:
- 插页广告
- 横幅广告
- 原生广告
- 奖励广告
- 奖励插页广告
- 应用启动广告
要安装和使用 Adiz iOS,请按照下面的指南进行。
前提条件¶
配置 Adiz iOS 开发环境。
安装¶
将 GADApplicationIdentifier
键添加到 Xcode 项目的 Info.plist 文件中,并将 AdMobId
值(格式为 ca-app-pub-XXXXX~YYYYY)作为该键的值添加。
此外,在 iOS 14 及以上版本中,请参考 更新你的 info.plist 指南,将 SKAdNetwork
列表添加到你的 Info.plist 文件中。
之后,将以下内容添加到您项目的 CocoaPods 配置(Podfile)中。
source 'https://github.com/CocoaPods/Specs.git'
source 'https://github.com/Com2uSPlatformCorp/HiveAdiz-iOS.git'
platform :ios, '12.0'
target 'UnityFramework' do
pod 'HiveAdizUnityPlugin', '2.0.1'
end
target 'Unity-iPhone' do
end
use_frameworks!
# fix for dyld issue in pods when using Project
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
# xcode 15 Toolchain Issue
xcconfig_path = config.base_configuration_reference.real_path
xcconfig = File.read(xcconfig_path)
xcconfig_mod = xcconfig.gsub(/DT_TOOLCHAIN_DIR/, "TOOLCHAIN_DIR")
File.open(xcconfig_path, "w") { |file| file << xcconfig_mod }
# end
config.build_settings["BUILD_LIBRARY_FOR_DISTRIBUTION"] = "YES"
if config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f < 12.0
config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0'
end
end
end
end
运行 $pod install
以应用 CocoaPod 设置。
设置测试广告¶
Adiz 允许您以两种方式显示测试广告。
- 启用测试模式:仅显示由 AdMob 发布的测试广告。
- 注册测试设备并显示广告:为了测试目的显示真实广告。注册设备以显示测试广告,以确保在测试期间不会发生无效流量。
启用测试模式¶
在开发阶段,启用测试模式,以便点击测试广告不会对广告客户产生费用。当启用测试模式时,仅显示测试广告。在测试模式下,您无需在 Hive 控制台中输入 AdMob 广告密钥即可显示测试广告。对于商业分发,请禁用测试模式。
Note
如果在开发阶段的测试模式下点击广告过多,可能会被视为无效流量,并且您的AdMob账户可能会被报告,从而阻止您展示广告。
设置测试设备以显示广告¶
您应该在以下情况下注册测试设备以显示测试广告:
在未注册测试设备的情况下测试真实广告可能会被视为无效流量,从而导致您的AdMob帐户被封锁,并且无法再显示广告。当您注册测试设备时,在广告展示期间将显示“测试模式”或“测试广告”(针对原生广告)。测试设备在生产部署时应禁用。
要注册测试设备,首先识别测试设备 ID。测试设备 ID(例如,B74F6468-1516-467C-99AD-CC5973C5DB52
)可以通过以下两种方法找到:
- 在调用
Adiz.Initialize()
后检查 Logcat 日志:
要为此设备启用调试模式,请设置: UMPDebugSettings.testDeviceIdentifiers = @[B74F6468-1516-467C-99AD-CC5973C5DB52]
- 在调用
Adiz.Initialize()
后检查 Logcat 日志,然后调用initialize()
→load()
,无论广告类型如何:
GADMobileAds.sharedInstance().requestConfiguration.testDeviceIdentifiers = [ "B74F6468-1516-467C-99AD-CC5973C5DB52" ]
在识别测试设备ID后,在现有的Adiz初始化代码中执行Adiz.initialize
之前添加行Adiz.SetTestDevice(DEVICE_ID)
。将DEVICE_ID
替换为复制的测试设备ID。
使用广告检查器¶
广告检查器是一个应用内覆盖工具,允许实时分析在测试设备上请求和显示实际广告的过程。它会告知您加载广告所需的时间,并在显示失败时提供失败的原因。此外,您可以指定特定的广告网络,以检查广告是否正确显示,如果存在任何问题,您可以在代码级别进行调试。所有这些过程都是通过广告检查器用户界面进行的。它包含在 Google Mobile Ads SDK iOS 版本 7.68.0 及以上版本中,可以通过调用 AdizDeveloperTool.OpenAdInspector
来使用。
要使用广告检查器,必须满足以下两个条件:
设置 Adiz appID¶
在 Hive 控制台 AppCenter 中设置您注册的 Adiz AppID。如果未配置,将使用 Bundle ID。
设置 Hive 控制台服务器¶
设置您想要使用的 Hive 控制台服务器。默认值为 real
。即使您使用商业服务器,如果启用了测试模式,仍会显示测试广告。
- Hive 测试控制台服务器:
AdizZoneType.test
- Hive 沙盒控制台服务器:
AdizZoneType.sandbox
- Hive 商业控制台服务器:
AdizZoneType.real
曝露用户特定广告¶
随着 iOS 14.5+ 中引入的 ATT(应用追踪透明度),隐私保护得到了加强。因此,只有在用户同意在 ATT 同意弹窗中进行活动追踪的情况下,才能曝露用户特定广告。为了通过曝露用户特定广告来最大化广告收入,有必要创建一个 IDFA(广告商标识符)消息。
按照AdMob仪表板上的指南创建并发布您的IDFA消息。
在创建和发布IDFA消息后,设置用户跟踪权限。按照以下步骤将密钥添加到Info.plist。
- 在 Xcode 项目窗口的项目导航器中选择您的项目。
- 在 TARGETS 列表中,选择您的应用。
- 点击 Info 标签。
- 在 Info 标签中点击 Custom iOS Target Properties 部分。
- 在 Custom iOS Target Properties 列表中右键单击。
- 点击 Add Row 菜单。
- 在 Key 字段中输入 NSUserTrackingUsageDescription,并添加在 Localization file > Base.Iproj folder > InfoPlist.strings 中指定的值。
接下来,按照本地化文件中指定的内容,撰写请求应用用户权限批准的消息(常规设置 > 请求权限设置)。如果您不输入权限请求弹出消息,应用可能会因缺少关于用户访问权限的额外说明指南而在审核过程中被拒绝。
一旦完成,ATT 同意弹出窗口将在您 初始化 Adiz 时自动显示。如果用户在 ATT 同意弹出窗口上点击“允许”,则 IDFA 将被激活,从而为用户启用个性化广告。
GDPR 同意弹窗显示 (欧洲和英国)¶
如果您的游戏面向欧洲和英国(欧洲经济区和英国),则必须显示GDPR(通用数据保护条例)同意弹窗。只有当用户的设备IP地址来自欧洲或英国(欧洲经济区和英国)时,才会显示GDPR同意弹窗。Adiz支持Google的UMP(用户消息平台)来显示GDPR同意弹窗。
在AdMob控制台中创建GDPR消息后,当您初始化Adiz时,GDPR弹出窗口将显示给来自欧洲和英国的用户。
警告
即使您针对的是欧洲和英国以外的地区,您也必须在AdMob 控制台中创建GDPR 消息,以确保Adiz 的初始化能够正确执行。
创建 GDPR 消息¶
访问 Google AdMob 控制台以创建 GDPR 消息。在创建 GDPR 消息之前,请参考 GDPR 消息创建指南。
在创建GDPR消息后,GDPR同意弹出窗口将在Adiz初始化期间自动显示。
实施GDPR同意/撤回选项¶
GDPR同意弹出窗口应允许用户随时修改他们的同意。例如,最初不同意GDPR的用户可能希望同意以接收个性化广告,反之亦然。为了适应这种情况,开发人员必须实现用户再次同意或撤回先前同意的功能。要实现GDPR同意/撤回功能,请按照以下步骤操作:
- 在您的应用中实现一个按钮 UI,以重新加载 GDPR 同意弹出窗口。
- 在实现 Adiz 的初始化 时,调用
isPrivacyOptionsRequired()
来为来自欧洲和英国的用户显示上述按钮 UI,而在其他情况下不显示。如果来自欧洲和英国的用户按下按钮,调用showPrivacyOptionsForm
重新加载 GDPR 同意弹出窗口,允许用户通过应用中的“管理选项”按钮或类似功能随时修改他们的 GDPR 详细信息的同意。下面提供的showPrivacyOptionsForm
方法仅供说明,开发者可以以任何所需的形式实现。
import HiveAdiz
func initialize(_ appId: String) {
// ...
// isPrivacyOptionsRequired is default false
targetViewController.showPrivacyFormButton.isEnabled = AdizConsentManager.isPrivacyOptionsRequired())
// HiveAdiz 初始化
Adiz.initialize(targetViewController) { error, json in
// ...
// showPrivacyOptionsForm 按钮启用检查
targetViewController.showPrivacyFormButton.isEnabled = AdizConsentManager.isPrivacyOptionsRequired()
// ...
}
}
func showPrivacyOptionsForm(_ targetViewController: UIViewController) {
// 显示GDPR表单
if AdizConsentManager.isPrivacyOptionsRequired() {
AdizConsentManager.showPrivacyOptionsForm(targetViewController) { error in
// 不需要处理任何错误。
}
}
}
#import <HiveAdiz/HiveAdiz-Swift.h>
(void)initialize: (NSString *)appId {
// ...
// isPrivacyOptionsRequired 是默认的 false
targetViewController.showPrivacyFormButton.enabled = [AdizConsentManager isPrivacyOptionsRequired];
// HiveAdiz 初始化
[Adiz 初始化: targetViewController 处理:^(AdizError * error, NSDictionary<NSString *,id> * json) {
// ...
// 显示隐私选项表单按钮启用检查
targetViewController.showPrivacyFormButton.enabled = [AdizConsentManager isPrivacyOptionsRequired];
// ...
}];
}
(void)showPrivacyOptionsForm: (UIViewController*) targetViewController {
// 显示GDPR表单
if ([AdizConsentManager isPrivacyOptionsRequired]) {
[AdizConsentManager showPrivacyOptionsForm: targetViewController handler:^(AdizError *error) {
// 无需进行任何错误处理。
}];
}
}
为未满同意年龄的标签设置¶
使用Tag为Under Age of Consent(TFUA),您可以配置广告请求,将居住在欧洲经济区(EEA)、英国和瑞士的用户视为有限数据处理的对象。对于服务儿童的应用,您可以使用AdizConsentManager.SetUserPrivacySettings
设置用户为未满同意年龄。虽然欧洲国家之间存在一些差异,GDPR将需要父母同意的年龄定义为16岁以下。必须在执行Adiz.initialize
之前配置同意年龄设置。
Warning
如果同时将适用于未成年人同意年龄的GDPR标签setTagForUnderAgeOfConsent
和针对儿童的COPPA标签setTagForChildDirectedTreatment
设置为true
,则COPPA标签将优先。因此,请勿同时将它们都设置为true
。
Note
当使用 Hive SDK v4 24.2.0 或更高版本以及 Adiz 2.0.1 或更高版本时,Hive SDK 将根据用户的年龄自动为未满同意年龄的用户应用标签。因此,无需调用 AdizConsentManager.SetUserPrivacySettings
。
func initialize(_ appId: String) {
bool isTagForUnderAgeOfConsent = false // change this to true if the user is a child
let privacySet = PrivacySettings.Builder()
.setTagForUnderAgeOfConsent(isTagForUnderAgeOfConsent)
AdizConsentManager.setUserPrivacySettings(privacySet.build())
// HiveAdiz 初始化
Adiz.initialize(targetViewController) { error, json in
// ...
}
}
(void)initialize: (NSString *)appId {
bool isTagForUnderAgeOfConsent = false; // change this to true if the user is a child
PrivacySettingsBuilder* privacySet = [[PrivacySettingsBuilder alloc] init];
privacySet = [builder setTagForUnderAgeOfConsent: isTagForUnderAgeOfConsent];
[AdizConsentManager setUserPrivacySettings: [privacySet build]];
// HiveAdiz 初始化
[Adiz initialize: targetViewController handler:^(AdizError * error, NSDictionary<NSString *,id> * json) {
// ...
}];
}
设置GDPR测试设备¶
只有当设备的IP地址来自欧洲或英国时,GDPR同意弹出窗口才会显示。在开发过程中,您可以通过设置GDPR测试设备来强制显示GDPR同意弹出窗口,而不管设备的IP地址,以便进行测试。请按照以下步骤设置GDPR测试设备。以下内容与在测试设备上显示广告相同。
- 初始化 Adiz。此初始化的目的是检查测试设备ID,因此您无需提前创建GDPR同意消息。
- 在Logcat日志输出中找到设备ID。以下是一个示例消息:
要为此设备启用调试模式,请设置:UMPDebugSettings.testDeviceIdentifiers = @[B74F6468-1516-467C-99AD-CC5973C5DB52]
获取设备 ID(示例:B74F6468-1516-467C-99AD-CC5973C5DB52
)。
- 复制设备 ID。
- 在现有的 Adiz 初始化代码中,在执行
Adiz.initialize
之前添加Adiz.setTestDevice(DEVICE_ID)
。 - 创建 GDPR 同意消息 并重新初始化 Adiz,以确保 GDPR 同意弹出窗口正确出现。
(void)initialize: (NSString *)appId {
// ...
// 在 Adiz.initialize 之前设置 TestDevice。示例 @"B74F6468-1516-467C-99AD-CC5973C5DB52"
[Adiz setTestDevice: @"B74F6468-1516-467C-99AD-CC5973C5DB52"];
// HiveAdiz 初始化
[Adiz initialize: targetViewController handler:^(AdizError * error, NSDictionary<NSString *,id> * json) {
// ...
}];
}
COPPA儿童导向处理标签设置¶
根据儿童在线隐私保护法案(COPPA),应用开发者可以通过设置tagForChildDirectedTreatment (TFCD)标签来指定Google在广告请求中是否应将内容视为儿童导向。如果您希望将内容视为儿童导向,必须在执行Adiz.initialize
之前调用AdizConsentManager.SetUserPrivacySettings
。在使用Adiz与Hive SDK时,儿童导向处理标签会自动应用,因此无需额外设置。
func initialize(_ appId: String) {
bool isTagForChildDirectedTreatment = false // Change to true for children
let privacySet = PrivacySettings.Builder()
.setTagForChildDirectedTreatment(isTagForUnderAgeOfConsent)
AdizConsentManager.setUserPrivacySettings(privacySet.build())
// HiveAdiz 初始化
Adiz.initialize(targetViewController) { error, json in
// ...
}
}
- (void)initialize: (NSString *)appId {
bool isTagForChildDirectedTreatment = false; // Change to true for children
PrivacySettingsBuilder* privacySet = [[PrivacySettingsBuilder alloc] init];
privacySet = [builder setTagForChildDirectedTreatment: isTagForChildDirectedTreatment];
[AdizConsentManager setUserPrivacySettings: [privacySet build]];
// HiveAdiz 初始化
[Adiz initialize: targetViewController handler:^(AdizError * error, NSDictionary<NSString *,id> * json) {
// ...
}];
}
添加 ad 中介¶
Adiz 允许您使用 AdMob 中介显示广告。请按照以下步骤添加 AdMob 中介。
添加AdMob 中介¶
在AdMob 控制台中进行广告源集成工作。请遵循下表。
AppLovin | Pangle | Unity Ads | Meta | |
---|---|---|---|---|
步骤 1 | 配置 AppLovin | 配置 Pangle | 配置 Unity Ads | 设置 Meta 配置 |
步骤 2 | 将 AppLovin 广告源添加到 AdMob | 将 Pangle 广告源添加到 AdMob | 将 Unity Ads 广告源添加到 AdMob | 将 Meta 广告源添加到 AdMob |
步骤 3 | 添加 Adiz 适配器 |
添加 adiz 适配器¶
将依赖项添加到您的 CocoaPods Podfile。
# ...
$HIVE_ADIZ_VERSION = '2.0.1'
def adiz
pod 'HiveAdiz', $HIVE_ADIZ_VERSION
end
def adizAdapter
pod 'HiveAdizAdapterAppLovin', $HIVE_ADIZ_VERSION
pod 'HiveAdizAdapterPangle', $HIVE_ADIZ_VERSION
pod 'HiveAdizAdapterUnityAds', $HIVE_ADIZ_VERSION
pod 'HiveAdizAdapterMeta', $HIVE_ADIZ_VERSION
end
target 'MyGame-mobile' do
adiz
adizAdapter
end
# ...
为了确保Adiz适配器配置正确应用,请运行应用程序并检查Ad Inspector屏幕上的配置列表。
初始化 Adiz¶
Adiz 的初始化是展示任何类型广告之前的必要步骤。当您初始化 Adiz 时,您可以接收到显示广告所需的广告密钥。如果启用了测试模式,您将收到一个测试密钥。如果您使用的是 Hive SDK,请在调用 AuthV4.setup
后继续进行 Adiz 初始化。
Note
如果您的游戏面向欧洲和英国(EEA & UK)地区,并且您没有使用Hive SDK,则在进行Adiz初始化之前需要获得GDPR同意。有关获取GDPR同意的更多详细信息,请查看Google AdMob指南。
import HiveAdiz
// 初始化 Adiz
Adiz.initialize(targetViewController) { error, json in
if error.isSuccess,
let responseList = json?["keys"] as? [[String:Any]] {
var interstitialKeyList = [String]()
var bannerKeyList = [String]()
var nativeKeyList = [String]()
var rewardedKeyList = [String]()
var rewardedInterstitialKeyList = [String]()
var appOpenKeyList = [String]()
for response in responseList {
if let isDefault = response["is_default"] as? Bool,
isDefault == false {
let hiveAdKey = response["key"] as? String ?? ""
let hiveForm = response["form"] as? String ?? ""
switch hiveForm {
case "interstitial": interstitialKeyList.append(hiveAdKey)
case "banner": bannerKeyList.append(hiveAdKey)
case "native": nativeKeyList.append(hiveAdKey)
case "rewarded": rewardedKeyList.append(hiveAdKey)
case "rewarded_interstitial": rewardedInterstitialKeyList.append(hiveAdKey)
case "app_open": appOpenKeyList.append(hiveAdKey)
default: break
}
}
}
print("interstitialKeyList \(interstitialKeyList)");
print("bannerKeyList \(bannerKeyList)");
print("nativeKeyList \(nativeKeyList)");
print("rewardedKeyList \(rewardedKeyList)");
print("rewardedInterstitialKeyList \(rewardedInterstitialKeyList)");
print("appOpenKeyList \(appOpenKeyList)");
}
}
#import <HiveAdiz/HiveAdiz-Swift.h>
// 初始化 Adiz
[Adiz initialize: targetViewController handler:^(AdizError * error, NSDictionary<NSString *,id> * json) {
if([error isSuccess] && json[@"keys"] != nil) {
NSArray* responseList = json[@"keys"];
NSMutableArray<NSString*> *interstitialKeyList = [[NSMutableArray alloc] init];
NSMutableArray<NSString*> *bannerKeyList = [[NSMutableArray alloc] init];
NSMutableArray<NSString*> *nativeKeyList = [[NSMutableArray alloc] init];
NSMutableArray<NSString*> *rewardedKeyList = [[NSMutableArray alloc] init];
NSMutableArray<NSString*> *rewardedInterstitialKeyList = [[NSMutableArray alloc] init];
NSMutableArray<NSString*> *appOpenKeyList = [[NSMutableArray alloc] init];
for (NSDictionary* response in responseList) {
// 这是直接设置广告键列表的示例(is_default = false),当你想直接放置广告键时。
if (response[@"is_default"] != nil && [response[@"is_default"] boolValue] == false) {
NSString* hiveAdKey = response[@"key"];
NSString* hiveForm = response[@"form"];
if ([hiveForm isEqualToString: @"interstitial"]) {
[interstitialKeyList addObject: hiveAdKey];
} else if ([hiveForm isEqualToString: @"banner"]) {
[bannerKeyList addObject: hiveAdKey];
} else if ([hiveForm isEqualToString: @"native"]) {
[nativeKeyList addObject: hiveAdKey];
} else if ([hiveForm isEqualToString: @"rewarded"]) {
[rewardedKeyList addObject: hiveAdKey];
} else if ([hiveForm isEqualToString: @"rewarded_interstitial"]) {
[rewardedInterstitialKeyList addObject: hiveAdKey];
} else if ([hiveForm isEqualToString: @"app_open"]) {
[appOpenKeyList addObject: hiveAdKey];
}
}
}
NSLog(@"interstitialKeyList %@", interstitialKeyList);
NSLog(@"bannerKeyList %@", bannerKeyList);
NSLog(@"nativeKeyList %@", nativeKeyList);
NSLog(@"rewardedKeyList %@", rewardedKeyList);
NSLog(@"rewardedInterstitialKeyList %@", rewardedInterstitialKeyList);
NSLog(@"appOpenKeyList %@", appOpenKeyList);
}
}];
作为回调接收到的JSON文件包含广告键的列表。广告键列表的格式如下:
{
"keys":[
{
"mediation_id":5,
"key":"ca-app-pub-3940256099942544/5354046379",
"form":"rewarded_interstitial",
"is_default":true
},
{
"mediation_id":4,
"key":"ca-app-pub-3940256099942544/5224354917",
"form":"rewarded",
"is_default":true
},
{
"mediation_id":3,
"key":"ca-app-pub-3940256099942544/2247696110",
"form":"native",
"is_default":true
},
{
"mediation_id":1,
"key":"ca-app-pub-3940256099942544/1033173712",
"form":"interstitial",
"is_default":true
},
{
"mediation_id":2,
"key":"ca-app-pub-3940256099942544/6300978111",
"form":"banner",
"is_default":true
},
{
"mediation_id":6,
"key":"ca-app-pub-3940256099942544/9257395921",
"form":"app_open",
"is_default":true
}
]
}
如果您在测试模式下初始化,即使您未在 Hive 控制台中注册 AdMob 广告密钥,您也会收到测试广告密钥的列表。如果您在商业模式下初始化,您将收到在 Hive 控制台中注册的 AdMob 广告密钥的列表。
每种广告格式都有一个广告作为默认广告(一个广告的 "is_default":true
)。注册的第一个广告成为该广告格式的默认广告。在为默认广告创建广告实例(initialize()
)时,您无需输入广告密钥(hiveAdKey
)。要更改默认广告,您必须在 Hive 控制台中删除现有的默认广告并重新注册广告。
设置广告回调监听器¶
通过在创建每个广告实例时实现 AdizListener
,您可以根据广告状态的变化接收回调。
名称 | 描述 | 必需 |
---|---|---|
onLoad() | 广告加载成功 | O |
onFail(error: AdizError) | 失败(您可以通过 error.getCode() 和 error.getMessage() 理解失败原因) | O |
onShow() | 广告展示成功 | O |
onClick() | 广告被点击 | O |
onPaidEvent(_ revenueData: AdRevenueData) | 这是在广告展示后接收到付费事件的时刻。在此时,广告收入信息被传递。 | O |
onClose() | 广告关闭 * 在广告关闭后,要再次展示同一广告实例,您需要调用 load() 然后调用 show() 。* 如果您不再希望展示广告,请调用 destroy() 来移除广告实例。 | X |
onRewarded(_ rewardItem: RewardItem) | 用户在展示奖励广告(rewarded ,rewarded interstitial )后获得奖励的时刻 | X |
import HiveAdiz
class TestAdizListener: AdizListener {
func onLoad() {
// 当广告加载时调用。
// 如果广告加载成功,您需要在合适的时机调用广告实例的 .show() 来显示广告。
print("[\(delegateTypeName)] onLoad")
}
func onFail(_ error: AdizError) {
// 如果广告加载失败或由于其他原因广告显示失败时调用。
print("[\(delegateTypeName)] onFail: ")
print("(\(error.getCode())) \(error.getMessage() ?? "")")
}
func onShow() {
// 当广告显示时调用。
print("[\(delegateTypeName)] onShow")
}
func onClick() {
// 当广告被点击时调用。
print("[\(delegateTypeName)] onClick")
}
func onPaidEvent(_ revenueData: AdRevenueData) {
// 当广告产生收入时调用。
print("[\(delegateTypeName)] onPaidEvent: \(revenueData.getCurrency()) \(revenueData.getRevenue().description)")
var revenue = revenueData.getRevenue() // 广告曝光时的收入
var currency = revenueData.getCurrency() // 广告曝光时的收入货币代码
}
func onClose() {
// 当广告关闭时调用。
// 横幅广告、原生广告没有 onClose 回调。
print("[\(delegateTypeName)] onClose")
}
func onRewarded(_ rewardItem: RewardItem) {
// 在观看广告时获得奖励时调用,适用于奖励广告和奖励插播广告。
print("[\(delegateTypeName)] onRewarded")
print("amount: \(rewardItem.getItemAmount()) type: \(rewardItem.getItemType())")
var itemType = rewardItem.getItemType() // 奖励物品类型
var itemAmount = rewardItem.getItemAmount() // 奖励物品数量 }}
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface TestAdizListener : NSObject<AdizListener>
@end
@implementation TestAdizListener
- (void) onLoad {
// 当广告加载时调用。
// 如果广告加载成功,您需要在所需的时刻调用广告实例的 .show() 来显示广告。
NSLog(@"[TestAdizListener] onLoad");
}
- (void) onFail:(AdizError *)error {
// 如果广告加载失败或由于其他原因广告显示失败,则调用此方法。
NSLog(@"[TestAdizListener] onFail: ");
NSLog(@"errorCode: %ld, errorMessage: %@", (long)[error getCode], [error getMessage]);
}
- (void) onShow {
// Called when the ad is displayed.
NSLog(@"[TestAdizListener] onShow");
}
- (void) onClick {
// 被点击广告时调用。
NSLog(@"[TestAdizListener] onClick");
}
- (void) onPaidEvent:(AdRevenueData *)revenueData {
// 当广告产生收入时调用。
NSLog(@"[TestAdizListener] onPaidEvent: %@ %f", [revenueData getCurrency], [revenueData getRevenue]);
double revenue = [revenueData getRevenue]; // 广告曝光时的收入
NSString* currency = [revenueData getCurrency]; // 广告曝光时的收入货币代码
}
- (void) onClose {
// 广告关闭时调用。
// 横幅广告和原生广告没有 onClose 回调。
NSLog(@"[TestAdizListener] onClose");
}
- (void) onRewarded:(RewardItem *)rewardItem {
// 当观看奖励广告时发生奖励时调用。
NSLog(@"[TestAdizListener] onRewarded");
NSLog(@"amount: %ld type: %@", (long)[rewardItem getItemAmount], [rewardItem getItemType]);
NSString* itemType = [rewardItem getItemType]; // 奖励物品类型
NSInteger itemAmount = [rewardItem getItemAmount]; // 奖励物品数量
}
@end
错误代码¶
当接收到 onFail()
时,Adiz.Initialize
和 AdizListener
的错误代码和错误消息如下:
常见代码¶
数字 | 案例 | 解释 |
---|---|---|
0 | 成功 | 成功 |
Adiz 错误代码¶
数字 | 案例 | 解释 |
---|---|---|
-1 | InvalidParam | 无效参数 |
-2 | NotSupported | 不支持 |
-3 | InProgress | 处理中 |
-4 | Network | 网络错误 |
-5 | NeedInitialize | 需要初始化 |
-6 | ResponseFail | 响应失败 |
-7 | Timeout | 网络超时 |
-99 | Unknown | 未知错误 |
广告平台错误代码¶
编号 | 案例 | 说明 |
---|---|---|
-101 | 需要加载 | 广告未加载 |
-102 | 需要重新加载 | 由于广告显示时间到期,需要重新加载 |
-103 | 库存不足 | 调解响应成功,但由于库存不足未填充广告 |
-104 | 缺少AppId | 调解请求的AppID错误 |
-105 | 内部网络错误 | 调解网络相关错误 |
-106 | 无效的单元ID | 无效的单元ID |
-107 | 调解未填充 | 调解适配器未能处理广告请求 |
-108 | 已加载 | 已加载 |
-109 | 无法请求广告 | 无法请求广告 |
-201 | GDPR同意错误 | GDPR同意错误 |
-202 | 不需要隐私选项 | 无需显示或无法显示GDPR同意弹出窗口 |
广告曝光与终止¶
要曝光和终止广告,请按照以下步骤操作:
- 从广告类创建广告实例,以便为您想要公开的每种广告类型创建实例。如果您想要公开的广告不是默认广告,则需要输入从初始化中获得的广告密钥。如果您不输入广告密钥(
hiveAdKey
),则会创建一个默认广告实例。 - 加载(
load()
)您想要公开的广告。 - 显示(
show()
)已加载的广告。要重新公开广告,您必须再次调用load()
,然后调用show()
。 - 要终止广告,请调用
destroy()
。
插页广告¶
插页广告是覆盖游戏界面的全屏广告。
import UIKit
import HiveAdiz
class InitViewController: UIViewController {
// 创建一个插页式广告实例。
var interstitialAd: AdizInterstitial?
func requestInitAd(hiveAdKey: String?) {
if let adKey = hiveAdKey,
adKey.count > 0 {
// 初始化 AdizInterstitial 实例 (ViewController, hiveAdKey, AdizListener)
self.interstitialAd = AdizInterstitial.initialize(self, hiveAdKey: adKey, adizListener: self)
}
else {
// 初始化默认的 AdizInterstitial 实例 (ViewController, AdizListener)
self.interstitialAd = AdizInterstitial.initialize(self, adizListener: self)
}
}
func requestLoadAd() {
// Load AdizInterstitial
self.interstitialAd?.load()
}
func requestShowAd() {
// Show AdizInterstitial
self.interstitialAd?.show()
}
func requestDestroyAd() {
// 销毁 AdizInterstitial
self.interstitialAd?.destroy()
self.interstitialAd = nil
}
}
extension InitViewController: AdizListener {
func onLoad() {
// requestShowAd()
}
func onFail(_ error: AdizError) {
}
func onShow() {
}
func onClick() {
}
func onPaidEvent(_ revenueData: AdRevenueData) {
}
func onClose() {
// requestDestroyAd()
}
}
#import <UIKit/UIKit.h>
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface InitViewController : UIViewController<AdizListener>
@property (nonatomic, strong) AdizInterstitial* interstitialAd;
@end
@implementation InitViewController
- (void) requestInitAd: (NSString*)hiveAdKey {
if (hiveAdKey != nil && ![hiveAdKey isEqualToString:@""]) {
// 初始化 AdizInterstitial 实例 (ViewController, hiveAdKey, AdizListener)
// 创建一个插页广告实例。
self.interstitialAd = [AdizInterstitial initialize:self hiveAdKey:hiveAdKey adizListener:self];
}
else {
// 初始化默认 AdizInterstitial 实例 (ViewController, AdizListener)
self.interstitialAd = [AdizInterstitial initialize:self adizListener:self];
}
}
- (void) requestLoadAd {
// 加载 AdizInterstitial
if (self.interstitialAd != nil) {
[self.interstitialAd load];
}
}
- (void) requestShowAd {
// 显示 AdizInterstitial
if (self.interstitialAd != nil) {
[self.interstitialAd show];
}
}
- (void) requestDestroyAd {
// 销毁 AdizInterstitial
if (self.interstitialAd != nil) {
[self.interstitialAd destroy];
self.interstitialAd = nil;
}
}
#pragma mark - AdizListener
- (void) onLoad {
// [self requestShowAd];
}
- (void) onFail:(AdizError *)error {
}
- (void) onShow {
}
- (void) onClick {
}
- (void) onPaidEvent:(AdRevenueData *)revenueData {
}
- (void) onClose {
// [self requestDestroyAd];
}
@end
横幅广告 (banner)¶
横幅广告展示特定大小的横幅。横幅广告不会接收 onClose()
回调。因此,您必须从其他位置调用 destroy()
来终止广告。
BannerSize
遵循标准横幅尺寸。
尺寸点 (宽 x 高) | 描述 | 支持的设备 | BannerSize 常量 |
---|---|---|---|
320x50 | 横幅 | 手机和平板电脑 | BannerSize.normal |
320x100 | 大横幅 | 手机和平板电脑 | BannerSize.medium |
300x250 | IAB 中等矩形 | 手机和平板电脑 | BannerSize.large |
468x60 | IAB 全尺寸横幅 | 平板电脑 | BannerSize.full |
PositionType
是顶部或底部。默认是底部。
对齐方式 | 描述 | PositionType 常量 |
---|---|---|
顶部对齐 | 指定基于安全区域的屏幕顶部对齐 | PositionType.top |
底部对齐(默认) | 指定基于安全区域的屏幕底部对齐 | PositionType.bottom |
import UIKit
import HiveAdiz
class BannerViewController: UIViewController {
// 创建 AdizBanner 实例
// 创建一个横幅广告实例。
var bannerAd: AdizBanner?
func requestInitAd(hiveAdKey: String?) { // 设置横幅大小
var bannerSize: BannerSize = .normal
if let adKey = hiveAdKey,
adKey.count > 0 {
// 初始化 AdizBanner 实例 (ViewController, hiveAdKey, BannerSize, AdizListener)
self.bannerAd = AdizBanner.initialize(self, hiveAdKey: adKey, size: bannerSize, adizListener: self)
} else {
// 初始化默认 AdizBanner 实例 (ViewController, BannerSize, AdizListener)
self.bannerAd = AdizBanner.initialize(self, size: bannerSize, adizListener: self)
} } func requestLoadAd() {
// 加载 AdizBanner
self.bannerAd?.load()
} func requestShowAd() {
// 设置位置类型
var position: PositionType = .top
// 显示 AdizBanner
self.bannerAd?.show(position)
} func requestDestroyAd() {
// 销毁 AdizBanner
self.bannerAd?.destroy()
self.bannerAd = nil
}} extension BannerViewController: AdizListener {
func onLoad() {
// requestShowAd()
} func onFail(_ error: AdizError) {
} func onShow() {
} func onClick() {
} func onPaidEvent(_ revenueData: AdRevenueData) { }}
#import <UIKit/UIKit.h>
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface BannerViewController : UIViewController<AdizListener>
@property (nonatomic, strong) AdizBanner* bannerAd;
@end
@implementation BannerViewController
- (void) requestInitAd: (NSString*)hiveAdKey {
// 设置横幅大小
BannerSize bannerSize = BannerSizeNormal;
if (hiveAdKey != nil && ![hiveAdKey isEqualToString:@""]) {
// 初始化 AdizBanner 实例 (ViewController, hiveAdKey, BannerSize, AdizListener)
self.bannerAd = [AdizBanner initialize:self hiveAdKey:hiveAdKey size: bannerSize adizListener:self];
} else {
// 初始化默认 AdizBanner 实例 (ViewController, BannerSize, AdizListener)
self.bannerAd = [AdizBanner initialize:self size:bannerSize adizListener:self];
}} - (void) requestLoadAd {
// 加载 AdizBanner
if (self.bannerAd != nil) {
[self.bannerAd load];
}} - (void) requestShowAd {
// 设置位置类型
PositionType position = PositionTypeTop;
// 显示 AdizBanner
if (self.bannerAd != nil) {
[self.bannerAd show: position];
}} - (void) requestDestroyAd {
// 销毁 AdizBanner
if (self.bannerAd != nil) {
[self.bannerAd destroy];
self.bannerAd = nil;
}} #pragma mark - AdizListener
- (void) onLoad {
// [self requestShowAd];
} - (void) onFail:(AdizError *)error {
} - (void) onShow {
} - (void) onClick {
} - (void) onPaidEvent:(AdRevenueData *)revenueData {
} @end
原生广告¶
原生广告显示特定大小的原生模板。原生广告针对纵向屏幕进行了优化,因此建议在纵向游戏(竖屏游戏)中使用它们。原生广告不会接收 onClose()
回调。因此,您必须从其他位置调用 destroy()
来终止广告。
目前,模板支持small
或medium
尺寸。
尺寸点(宽 x 高) | 模板 | 对齐 | BannerSize 常量 |
---|---|---|---|
355x91(纵横比调整) | 小尺寸 | 上 / 下 | BannerSize.normal |
355x370(纵横比调整) | 中尺寸 | 中心(固定) | BannerSize.medium, BannerSize.large, BannerSize.full |
对于 small
模板,PositionType
可以是顶部或底部,默认是底部。
对齐方式 | 描述 | 位置类型常量 |
---|---|---|
顶部对齐 | 指定屏幕顶部的对齐方式 | PositionType.top |
底部对齐(默认) | 指定屏幕底部的对齐方式 | PositionType.bottom |
medium
模板不允许选择对齐方式,默认使用居中对齐。
import UIKit
import HiveAdiz
class NativeViewController: UIViewController {
// 创建 AdizNative 实例
var nativeAd: AdizNative?
func requestInitAd(hiveAdKey: String?) {
// 设置横幅大小
var bannerSize: BannerSize = .normal
if let adKey = hiveAdKey,
adKey.count > 0 {
// 初始化 AdizNative 实例 (ViewController, hiveAdKey, BannerSize, AdizListener)
self.nativeAd = AdizNative.initialize(self, hiveAdKey: adKey, size: bannerSize, adizListener: self)
}
else {
// 初始化默认的 AdizNative 实例 (ViewController, BannerSize, AdizListener)
self.nativeAd = AdizNative.initialize(self, size: bannerSize, adizListener: self)
}
}
func requestLoadAd() {
// Load AdizNative
self.nativeAd?.load()
}
func requestShowAd() {
// 设置位置类型
var position: PositionType = .top
// 显示 AdizNative
self.nativeAd?.show(position)
}
func requestDestroyAd() {
// 销毁 AdizNative
self.nativeAd?.destroy()
self.nativeAd = nil
}
}
extension NativeViewController: AdizListener {
func onLoad() {
// requestShowAd()
}
func onFail(_ error: AdizError) {
}
func onShow() {
}
func onClick() {
}
func onPaidEvent(_ revenueData: AdRevenueData) {
}
}
#import <UIKit/UIKit.h>
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface NativeViewController : UIViewController<AdizListener>
@property (nonatomic, strong) AdizNative* nativeAd;
@end
@implementation NativeViewController
- (void) requestInitAd: (NSString*)hiveAdKey {
// 设置横幅大小
BannerSize bannerSize = BannerSizeNormal;
if (hiveAdKey != nil && ![hiveAdKey isEqualToString:@""]) {
// 初始化 AdizNative 实例 (ViewController, hiveAdKey, BannerSize, AdizListener)
self.nativeAd = [AdizNative initialize:self hiveAdKey:hiveAdKey size: bannerSize adizListener:self];
}
else {
// 初始化默认 AdizNative 实例 (ViewController, BannerSize, AdizListener)
self.nativeAd = [AdizNative initialize:self size:bannerSize adizListener:self];
}
}
- (void) requestLoadAd {
// 加载 AdizNative
if (self.nativeAd != nil) {
[self.nativeAd load];
}
}
- (void) requestShowAd {
// 设置位置类型
PositionType position = PositionTypeTop;
// 显示 AdizNative
if (self.nativeAd != nil) {
[self.nativeAd show: position];
}
}
- (void) requestDestroyAd {
// 销毁 AdizNative
if (self.nativeAd != nil) {
[self.nativeAd destroy];
self.nativeAd = nil;
}
}
#pragma mark - AdizListener
- (void) onLoad {
// [self requestShowAd];
}
- (void) onFail:(AdizError *)error {
}
- (void) onShow {
}
- (void) onClick {
}
- (void) onPaidEvent:(AdRevenueData *)revenueData {
}
@end
奖励广告 (rewarded)¶
这些是奖励广告,用户在观看广告一定时间后会获得奖励。一旦奖励发放,您将通过 onRewarded()
回调收到有关奖励项目的信息。
import UIKit
import HiveAdiz
class RewardViewController: UIViewController {
// 创建 AdizRewarded 实例
var rewardAd: AdizRewarded?
func requestInitAd(hiveAdKey: String?) {
if let adKey = hiveAdKey,
adKey.count > 0 {
// 初始化 AdizRewarded 实例 (ViewController, hiveAdKey, AdizListener)
self.rewardAd = AdizRewarded.initialize(self, hiveAdKey: adKey, adizListener: self)
}
else {
// 初始化默认 AdizRewarded 实例 (ViewController, AdizListener)
self.rewardAd = AdizRewarded.initialize(self, adizListener: self)
}
}
func requestLoadAd() {
// Load AdizRewarded
self.rewardAd?.load()
}
func requestShowAd() {
// 显示 AdizRewarded
self.rewardAd?.show()
}
func requestDestroyAd() {
// 销毁 AdizRewarded
self.rewardAd?.destroy()
self.rewardAd = nil
}
}
extension RewardViewController: AdizListener {
func onLoad() {
// requestShowAd()
}
func onFail(_ error: AdizError) {
}
func onShow() {
}
func onClick() {
}
func onPaidEvent(_ revenueData: AdRevenueData) {
}
func onClose() {
// requestDestroyAd()
}
func onRewarded(_ rewardItem: RewardItem) {
}
}
#import <UIKit/UIKit.h>
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface RewardedViewController : UIViewController<AdizListener>
@property (nonatomic, strong) AdizRewarded* rewardedAd;
@end
@implementation RewardedViewController
- (void) requestInitAd: (NSString*)hiveAdKey {
if (hiveAdKey != nil && ![hiveAdKey isEqualToString:@""]) {
// 初始化 AdizRewarded 实例 (ViewController, hiveAdKey, AdizListener)
self.rewardedAd = [AdizRewarded initialize:self hiveAdKey:hiveAdKey adizListener:self];
}
else {
// 初始化默认 AdizRewarded 实例 (ViewController, AdizListener)
self.rewardedAd = [AdizRewarded initialize:self adizListener:self];
}
}
- (void) requestLoadAd {
// 加载 AdizRewarded
if (self.rewardedAd != nil) {
[self.rewardedAd load];
}
}
- (void) requestShowAd {
// 显示 AdizRewarded
if (self.rewardedAd != nil) {
[self.rewardedAd show];
}
}
- (void) requestDestroyAd {
// 销毁 AdizRewarded
if (self.rewardedAd != nil) {
[self.rewardedAd destroy];
self.rewardedAd = nil;
}
}
#pragma mark - AdizListener
- (void) onLoad {
// [self requestShowAd];
}
- (void) onFail:(AdizError *)error {
}
- (void) onShow {
} - (void) onClick {
} - (void) onPaidEvent:(AdRevenueData *)revenueData {
}
- (void) onClose {
// [self requestDestroyAd];
}
- (void) onRewarded:(RewardItem *)rewardItem {
}
@end
奖励插页广告(奖励插页)¶
奖励插页广告允许用户在观看广告一段时间后获得奖励。一旦奖励发放,您将通过 onRewarded()
回调收到有关奖励项目的信息。
import UIKit
import HiveAdiz
class RewardInterstitialViewController: UIViewController {
// 创建 AdizRewardedInterstitial 实例
var rewardInterstitialAd: AdizRewardedInterstitial?
func requestInitAd(hiveAdKey: String?) {
if let adKey = hiveAdKey,
adKey.count > 0 {
// 初始化 AdizRewardedInterstitial 实例 (ViewController, hiveAdKey, AdizListener)
self.rewardInterstitialAd = AdizRewardedInterstitial.initialize(self, hiveAdKey: adKey, adizListener: self)
}
else {
// 初始化默认 AdizRewardedInterstitial 实例 (ViewController, AdizListener)
self.rewardInterstitialAd = AdizRewardedInterstitial.initialize(self, adizListener: self)
} } func requestLoadAd() {
// 加载 AdizRewardedInterstitial
self.rewardInterstitialAd?.load()
} func requestShowAd() {
// 显示 AdizRewardedInterstitial
self.rewardInterstitialAd?.show()
} func requestDestroyAd() {
// 销毁 AdizRewardedInterstitial
self.rewardInterstitialAd?.destroy()
self.rewardInterstitialAd = nil
}
}
extension RewardInterstitialViewController: AdizListener {
func onLoad() {
// requestShowAd()
} func onFail(_ error: AdizError) {
} func onShow() {
} func onClick() {
}
func onPaidEvent(_ revenueData: AdRevenueData) {
}
func onClose() {
// requestDestroyAd()
}
func onRewarded(_ rewardItem: RewardItem) {
}
}
#import <UIKit/UIKit.h>
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface RewardedInterstitialViewController : UIViewController<AdizListener>
@property (nonatomic, strong) AdizRewardedInterstitial* rewardedInterstitialAd;
@end
@implementation RewardedInterstitialViewController
- (void) requestInitAd: (NSString*)hiveAdKey {
if (hiveAdKey != nil && ![hiveAdKey isEqualToString:@""]) {
// 初始化 AdizRewardedInterstitial 实例 (ViewController, hiveAdKey, AdizListener)
self.rewardedInterstitialAd = [AdizRewardedInterstitial initialize:self hiveAdKey:hiveAdKey adizListener:self];
}
else {
// 初始化默认的 AdizRewardedInterstitial 实例 (ViewController, AdizListener)
self.rewardedInterstitialAd = [AdizRewardedInterstitial initialize:self adizListener:self];
}} - (void) requestLoadAd {
// 加载 AdizRewardedInterstitial
if (self.rewardedInterstitialAd != nil) {
[self.rewardedInterstitialAd load];
}} - (void) requestShowAd {
// 显示 AdizRewardedInterstitial
if (self.rewardedInterstitialAd != nil) {
[self.rewardedInterstitialAd show];
}} - (void) requestDestroyAd {
// 销毁 AdizRewardedInterstitial
if (self.rewardedInterstitialAd != nil) {
[self.rewardedInterstitialAd destroy];
self.rewardedInterstitialAd = nil;
}} #pragma mark - AdizListener
- (void) onLoad {
// [self requestShowAd];
} - (void) onFail:(AdizError *)error {
} - (void) onShow {
} - (void) onClick {
} - (void) onPaidEvent:(AdRevenueData *)revenueData {
}
- (void) onClose {
// [self requestDestroyAd];
}
- (void) onRewarded:(RewardItem *)rewardItem {
}
@end
应用打开广告 (appopen)¶
应用打开广告在应用状态从后台切换到前台时显示预加载的 (load()
) 广告。如果在广告加载后 3 小时调用 show()
,广告将在显示之前自动重新加载。一旦广告至少显示一次,之后将不会自动加载。
import UIKit
import HiveAdiz
class AppOpenViewController: UIViewController {
// 创建 AdizAppOpen 实例
var appOpenAd: AdizAppOpen?
func requestInitAd(hiveAdKey: String?) {
if let adKey = hiveAdKey,
adKey.count > 0 {
// 初始化 AdizAppOpen 实例 (ViewController, hiveAdKey, AdizListener)
self.appOpenAd = AdizAppOpen.initialize(self, hiveAdKey: adKey, adizListener: self)
}
else {
// 初始化默认 AdizAppOpen 实例 (ViewController, AdizListener)
self.appOpenAd = AdizAppOpen.initialize(self, adizListener: self)
} } func requestLoadAd() {
// 加载 AdizAppOpen
self.appOpenAd?.load()
} func requestShowAd() {
print("[appOpenAd] appOpenAd 不请求显示")
} func requestDestroyAd() {
// 销毁 AdizAppOpen
self.appOpenAd?.destroy()
self.appOpenAd = nil
}
}
extension AppOpenViewController: AdizListener {
func onLoad() {
} func onFail(_ error: AdizError) {
} func onShow() {
} func onClick() {
}
func onPaidEvent(_ revenueData: AdRevenueData) {
}
func onClose() {
// requestDestroyAd()
}
}
#import <UIKit/UIKit.h>
#import <HiveAdiz/HiveAdiz-Swift.h>
@interface AppOpenViewController : UIViewController<AdizListener>
@property (nonatomic, strong) AdizAppOpen* appOpenAd;
@end
@implementation AppOpenViewController
- (void) requestInitAd: (NSString*)hiveAdKey {
if (hiveAdKey != nil && ![hiveAdKey isEqualToString:@""]) {
// 初始化 AdizAppOpen 实例 (ViewController, hiveAdKey, AdizListener)
self.appOpenAd = [AdizAppOpen initialize:self hiveAdKey:hiveAdKey adizListener:self];
} else {
// 初始化默认 AdizAppOpen 实例 (ViewController, AdizListener)
self.appOpenAd = [AdizAppOpen initialize:self adizListener:self];
}} - (void) requestLoadAd {
// 加载 AdizAppOpen
if (self.appOpenAd != nil) {
[self.appOpenAd load];
}} - (void) requestShowAd {
NSLog(@"[appOpenAd] appOpenAd 不请求显示");
}
- (void) requestDestroyAd {
// 销毁 AdizAppOpen
if (self.appOpenAd != nil) {
[self.appOpenAd destroy];
self.appOpenAd = nil;
}} #pragma mark - AdizListener
- (void) onLoad {
} - (void) onFail:(AdizError *)error {
} - (void) onShow {
} - (void) onClick {
} - (void) onPaidEvent:(AdRevenueData *)revenueData {
}
- (void) onClose {
// [self requestDestroyAd];
}
@end