Unity
Adiz Unity¶
Adiz Unity是Hive提供的Unity广告模块,使得在AdMob上提供的广告展示功能更加便捷。Adiz Unity提供的广告形式如下。
- 全屏广告(Interstitial)
- 横幅广告(Banner)
- 原生广告(Native)
- 激励广告(Rewarded)
- 激励全屏广告(Rewarded Interstitial)
- 应用启动广告(AppOpen)
请按照以下指南的顺序安装和使用Adiz Unity。
安装或更新¶
- 配置 Adiz Unity 开发环境。
- 下载并解压 Adiz 的最新版本 下载。
- 在 Unity 中选择 Assets > Import Package > Custom Package…,然后选择 .unitypackage 文件并点击 Import。
- 请确认 Assets 文件夹下是否生成了 Adiz 文件和文件夹。
- 下载并安装 EDM4U 的最新版本。Hive SDK v4 包含 EDM4U。如果使用 Hive SDK v4,则无需单独安装 EDM4U。
要更新当前使用的 Adiz 版本,请先卸载 Adiz,然后下载并安装最新版本。
Unity 设置¶
Android¶
在 Unity 项目中创建的 Assets/Plugins/Android/AndroidManifest.xml 文件中添加格式为 ca-app-pub-XXXXX~YYYYY 的 AdMobId
值。
<manifest>
<application>
<!-- Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713 -->
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-xxxxxxxxxxxxxxxx~yyyyyyyyyy"/>
</application>
</manifest>
要显示视频广告,必须启用硬件加速。在AndroidManifest.xml文件中添加硬件加速的设置。如果添加到application
标签,则整个应用程序将使用硬件加速。如果添加到activity
标签,则仅在希望显示广告的特定Activity
中使用硬件加速。
<application android:hardwareAccelerated="true">
<!-- For activities that use ads, hardwareAcceleration should be true. -->
<activity android:hardwareAccelerated="true" />
</application>
在Unity的Android Resolver Settings(Assets > External Dependency Manager > Android Resolver > Settings)中,勾选Use Jetifier.。
玩家设置 > 玩家 > 构建 设置界面中勾选以下四个项目。
使用Proguard时,Adiz模块中已包含ProGuard规则。因此,您无需将ProGuard规则添加到项目中。
iOS¶
在Assets > External Dependency Manager > iOS Resolver > Settings中取消选中static_framework
构建设置。
打开在 Unity 构建时生成的 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.1.0
end
target 'Unity-iPhone' do
end
use_frameworks!
# 修复使用项目时 pods 中的 dyld 问题
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
# xcode 15 工具链问题
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 }
# 结束
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
在Unity构建时生成的Xcode项目的Info.plist文件中,添加如下GADApplicationIdentifier
键,并将AdMobId
值(ca-app-pub-XXXXX~YYYYY格式)作为键值输入。或者在Assets/HiveAdiz/Editor/AdizPostProcess.cs文件内部取消注释GADApplicationIdentifier
设置行并添加AdMobId
,将自动进行设置。
另外,在 iOS 14 及以上版本中,请参考 更新您的 info.plist 指南,将 SKAdNetwork
列表添加到 Info.plist 文件中。使用 Assets/HiveAdiz/Editor/AdizPostProcess.cs 文件将在构建时自动添加到 Info.plist 文件中。
测试广告设置¶
Adiz可以通过两种方式展示测试广告。 1. 启用测试模式:仅展示AdMob发放的测试广告 2. 注册测试设备后展示广告:为了测试展示真实广告,进行测试以避免无效流量,并注册将展示测试广告的设备进行操作
测试模式激活¶
在开发阶段,激活测试模式以确保点击测试广告不会向广告主收费。激活测试模式后,仅显示测试广告。在测试模式下,即使不在控制台中输入AdMob广告密钥,也会显示测试广告。在商业发布时,禁用测试模式。
测试模式激活方法有两种。
Warning
在开发阶段,如果不是测试模式,过多点击广告将被视为无效流量,可能导致AdMob账户被举报,从而无法显示广告。
Adiz.SetTestMode() 方法使用¶
using hiveAdiz; // 激活测试模式。在商业发布时,请注释掉下面的行。
Adiz.SetTestMode(true);
// 启用 Adiz 模块日志记录。日志记录仅应在测试模式下使用。 在生产发布时,请注释掉以下行。
Adiz.SetLogEnable(true);
测试设备的广告展示¶
在以下情况下,需要注册测试设备以展示测试广告。
测试设备上展示广告的方法有两种。
-
在注册测试设备到 Hive 控制台后,设置为 广告单元 ID 使用(推荐):
请参考控制台指南中的 测试设备管理 内容。 -
Adiz 类的
setTestDevice()
方法使用:
请参考下面的 示例代码。
Note
如果在未注册测试设备的情况下进行实际广告展示的测试,将被视为无效流量,可能导致AbMob账户被封禁,并且无法再展示广告。注册测试设备后,广告展示时将显示“测试模式”或“测试广告”(原生广告)。在商业发布时,必须禁用测试设备。
横幅、全屏广告或激励广告
原生广告
使用 Adiz.setTestDevice() 方法¶
要注册测试设备,首先需要确认测试设备 ID。在 Unity 引擎的 Android 环境中,可以通过以下两种方法确认测试设备 ID(示例:33BE2250B43518CCDA7DE426D04EE231
)。
-
调用
Adiz.Initialize()
后检查 Logcat 日志: -
调用
Adiz.Initialize()
后,无论广告类型如何,调用initialize()
→load()
后检查 Logcat 日志:
在Unity引擎的iOS环境中,可以通过以下两种方法确认测试设备ID(示例:B74F6468-1516-467C-99AD-CC5973C5DB52
)。
-
调用
Adiz.Initialize()
后检查 Logcat 日志: -
调用
Adiz.Initialize()
后,无论广告类型如何,调用initialize()
→load()
后检查 Logcat 日志:
在确认测试设备 ID 后,在现有的 Adiz 初始化代码中,在执行 Adiz.initialize
之前添加 Adiz.setTestDevice(DEVICE_ID)
这一行。DEVICE_ID
中输入复制的测试设备 ID。
using hiveAdiz;
public void Initialize() {
// 테스트 디바이스 설정
Adiz.SetTestDevice("33BE2250B43518CCDA7DE426D04EE231");
Adiz.Initialize(new CommonHandlers.Builder()
.OnResult(InitResultCB)
.Build());
}
广告检查器使用¶
广告检查器是一个在测试设备上请求实际广告并实时分析展示过程的应用内覆盖工具。它会告诉您加载广告所需的时间,如果展示失败,它会告知失败的原因。您还可以指定特定的广告网络,以检查广告是否正常展示,如果有问题,可以在代码级别进行调试。所有这些过程都与广告检查 UI 一起进行。它包含在 Google Mobile Ads SDK Android 20.0.0 和 Google Mobile Ads SDK iOS 7.68.0 及以上版本中,可以通过调用 AdizDeveloperTool.OpenAdInspector
来使用。
要使用广告检查器,必须设置测试设备注册。
Adiz AppID 设置¶
Hive 控制台 AppCenter 中注册的 Adiz AppID。未设置时使用 Package Name 或 Bundle ID。
Adiz.SetAppId(appId);
Hive 控制台服务器设置¶
设置要使用的 Hive 控制台服务器。默认值为 REAL
。即使使用生产服务器,启用测试模式也只会显示测试广告。
- Hive 测试控制台服务器:
ZoneType.TEST
- Hive 沙盒控制台服务器:
ZoneType.SANDBOX
- Hive 商用控制台服务器:
ZoneType.REAL
ZoneType selectZone = ZoneType.REAL;
Adiz.SetZone((int)selectZone);
用户特化广告曝光¶
在 iOS 14.5+ 中,由于引入了ATT(应用追踪透明度),个人信息保护得到了加强。因此,只有在 ATT 同意弹窗中用户同意活动追踪的情况下,才能向用户展示特化广告。为了通过展示特化广告来最大化广告收益,需要编写 IDFA(广告标识符)消息。
AdMob 仪表板中,请按照以下 IDFA 消息编写指南编写并发布消息。
在AdMob仪表板发布IDFA消息后,在iOS 14.5+中,Adiz初始化时会自动显示IDFA消息。如果用户在IDFA消息窗口中点击“继续”,则会显示ATT同意弹窗。
当用户在 ATT 同意弹窗中点击“允许”时,IDFA 将被激活,并会显示针对用户的广告。
Note
向在欧洲和英国地区访问的用户显示GDPR同意弹窗。如果用户从未同意过GDPR条款,则在显示GDPR同意弹窗后不会显示IDFA消息,而是直接显示ATT同意弹窗。如果用户曾同意过GDPR条款,则正常显示IDFA消息后再显示ATT同意弹窗。
GDPR同意弹窗展示(欧洲,英国)¶
当游戏针对欧洲和英国(EEA & UK)时,必须展示GDPR(欧洲联盟通用数据保护条例)同意弹窗。GDPR同意弹窗仅在用户设备的IP地址为欧洲和英国(EEA & UK)IP地址时展示。Adiz支持使用Google UMP(用户消息平台)展示GDPR同意弹窗。在AdMob控制台编写GDPR消息后,初始化Adiz,GDPR弹窗将展示给来自欧洲和英国地区的用户。
Warning
如果针对欧洲和英国以外的地区,例如仅计划在国内提供服务,可以跳过GDPR同意弹窗展示(欧洲,英国)步骤,并使用Adiz.InitializeForNonGDPR()
方法进行初始化。
使用Adiz.Initialize()
方法进行初始化时,必须在AdMob控制台中编写GDPR消息,才能正常进行Adiz初始化。
GDPR 消息编写¶
访问 Google AdMob 控制台以编写 GDPR 消息。在编写 GDPR 消息之前,请先参考 GDPR 消息编写指南。
如果您编写了 GDPR 消息,Adiz 初始化 时将自动显示 GDPR 同意弹窗。
警告
如果使用Hive SDK,则必须在完成Hive Adiz初始化后执行AuthV4.setup
。如果在显示ATT(应用追踪透明度)同意通知后出现GDPR同意屏幕,应用可能会在Apple应用审核中被拒绝。
实现 GDPR 同意和撤回功能¶
GDPR 同意弹窗中的项目应提供修改功能,以便用户随时修改同意状态。例如,用户最初未同意 GDPR,但希望为了查看定制广告而重新同意,或者相反,用户最初同意了 GDPR,但不再希望提供个人信息而希望撤回同意。为了应对这些情况,应用开发者需要实现重新同意或撤回现有同意的功能。要实现 GDPR 同意/撤回功能,请遵循以下步骤。
- 在应用程序中实现一个按钮UI,以便重新调用GDPR同意弹出窗口。
- 在实现Adiz初始化时,调用
isPrivacyOptionsRequired()
,以便向来自欧洲和英国的用户显示上述按钮UI,而对其他用户则不显示。当来自欧洲和英国的用户点击该按钮时,调用showPrivacyOptionsForm
以重新调用GDPR同意弹出窗口。之后,用户可以随时在应用程序中点击“管理选项”等按钮来修改GDPR详细条款的同意状态。下面的showPrivacyOptionsForm
是为了示例而随意实现的方法,开发者可以根据需要更改实现形式。
// ....
private void InitResultCB(AdizError error, string jsonString) {
// 初始化完成回调函数
Debug.Log(TAG + "::InitResultCB:: errorCode : "+error.errorCode+" errorMessage : "+error.errorMessage+" json : "+jsonString);
if(error.isSuccess()) {
bool isPrivacyOptionsRequired = AdizConsentManager.IsPrivacyOptionsRequired();
if(isPrivacyOptionsRequired) {
// 显示个人信息保护选项按钮。点击时调用ShowPrivacyOptionsForm
} else {
// 隐藏个人信息保护选项按钮
}
}
}
private void ShowPrivacyOptionsForm() {
// 调用个人信息保护选项表单
if(AdizConsentManager.IsPrivacyOptionsRequired()) {
AdizConsentManager.ShowPrivacyOptionsForm(new CommonHandlers.Builder()
.OnResult(CommonResultCB)
.Build());
}
}
// ....
GDPR 同意年龄以下用户的标签(TFUA)设置¶
可以通过使用GDPR同意年龄以下用户的标签(Tag For Under the Age of Consent, TFUA)在广告请求时将居住在欧洲经济区(EEA)、英国和瑞士的用户视为有限数据处理对象。对于面向儿童的应用程序,可以使用AdizConsentManager.setUserPrivacySettings
设置用户未满同意年龄。尽管每个欧洲国家略有不同,但GDPR规定16岁以下需要父母同意。未满同意年龄的设置必须在执行Adiz.initialize
之前进行。
Warning
如果同时将GDPR同意年龄以下标签设置为setTagForUnderAgeOfConsent
和COPPA儿童目标设置为setTagForChildDirectedTreatment
设置为true
,则COPPA儿童目标设置setTagForChildDirectedTreatment
将优先应用,因此请勿同时将它们设置为true
。
Note
Hive SDK v4 24.2.0 以上和 Adiz 2.0.1 以上一起使用时,Hive SDK 中设置的同意年龄以下用户的状态会自动应用,因此不需要调用 AdizConsentManager.setUserPrivacySettings
。
using hiveAdiz;
public void Initialize() {
bool isTagForUnderAgeOfConsent = false; // 어린이인 경우 true로 변경
PrivacySettings settings = new PrivacySettings.Builder()
.SetTagForUnderAgeOfConsent(isTagForUnderAgeOfConsent)
.Build();
AdizConsentManager.SetUserPrivacySettings(settings);
Adiz.Initialize(new CommonHandlers.Builder()
.OnResult(InitResultCB)
.Build());
}
GDPR 测试设备设置¶
GDPR 同意弹窗仅在设备 IP 地址为欧洲和英国 IP 地址时显示。在开发阶段,可以强制显示 GDPR 同意弹窗以测试弹窗的显示,无论 IP 地址如何,为此需要设置 GDPR 测试设备。请按照以下步骤设置 GDPR 测试设备。下面的内容与 在测试设备上展示广告 的方法相同。
- 初始化Adiz 进行初始化。这是为了确认测试设备ID,不需要编写GDPR同意消息。
通过输出Android Studio或Xcode日志来确认设备ID。示例日志如下所示。
- Android: 在
使用新的 ConsentDebugSettings.Builder().addTestDeviceHashedId("33BE2250B43518CCDA7DE426D04EE231") 将其设置为调试设备。
33BE2250B43518CCDA7DE426D04EE231
- iOS: 在
<UMP SDK>要启用此设备的调试模式,请设置: UMPDebugSettings.testDeviceIdentifiers = @[B74F6468-1516-467C-99AD-CC5973C5DB52]
B74F6468-1516-467C-99AD-CC5973C5DB52
- 复制设备 ID。
- 在现有的 Adiz 初始化代码中,在执行
Adiz.initialize
之前添加AdizGDPRManager.setTestDevice(DEVICE_ID)
。 - 编写 GDPR 同意消息,并重新初始化 Adiz,以确保 GDPR 同意弹出窗口正常显示。
using hiveAdiz; public void Initialize() { // GDPR 测试设备设置 AdizGDPRManager.SetTestDevice("33BE2250B43518CCDA7DE426D04EE231"); Adiz.Initialize(new CommonHandlers.Builder() .OnResult(InitResultCB) .Build()); }
COPPA儿童目标处理标签设置¶
根据儿童在线隐私保护法(COPPA)的目的,应用程序开发者可以通过儿童目标处理标签设置(tagForChildDirectedTreatment, TFCD)来指定在广告请求时Google是否将内容处理为儿童内容。如果希望将其处理为儿童内容,则必须在执行Adiz.initialize
之前调用AdizConsentManager.SetUserPrivacySettings
。当Adiz与Hive SDK一起使用时,儿童目标处理标签会自动应用,因此无需单独设置。
using hiveAdiz;
public void Initialize() {
bool isTagForChildDirectedTreatment = false; // 如果是儿童则更改为 true
PrivacySettings settings = new PrivacySettings.Builder()
.SetTagForChildDirectedTreatment(isTagForChildDirectedTreatment)
.Build();
AdizConsentManager.SetUserPrivacySettings(settings);
Adiz.Initialize(new CommonHandlers.Builder()
.OnResult(InitResultCB)
.Build());
}
添加广告调解¶
Adiz可以使用AdMob调解来展示广告。要添加AdMob调解,请按照以下步骤操作。
添加 AdMob 中介¶
在 AdMob 控制台中进行广告源集成工作。按照下面的表格进行操作。
AppLovin | Pangle | Unity Ads | Meta | |
---|---|---|---|---|
步骤 1: 设置 | Android iOS | Android iOS | Android iOS | Android iOS |
步骤 2: 添加广告源 | Android iOS | Android iOS | Android iOS | Android iOS |
步骤 3 | 添加 Adiz 适配器 |
添加 Adiz 适配器¶
Assets/HiveAdiz/Editor/Adiz_DefaultDependencies.xml中添加库依赖。
<dependencies>
<androidPackages>
<repositories>
<repository>https://repo.maven.apache.org/maven2</repository>
<repository>https://artifact.bytedance.com/repository/pangle/</repository>
</repositories>
<androidPackage spec="com.com2us.android.adiz:hive-adiz:2.1.0"/>
<!-- AppLovin -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-applovin:2.1.0"/>
<!-- Pangle -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-pangle:2.1.0"/>
<!-- Unity Ads -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-unityads:2.1.0"/>
<!-- Meta -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-meta:2.1.0"/>
</androidPackages>
<iosPods>
<sources>
<source>https://github.com/Com2uSPlatformCorp/HiveAdiz-iOS.git</source>
</sources>
<iosPod name="HiveAdizUnityPlugin" version="2.1.0"/>
<iosPod name="HiveAdizAdapterAppLovin" version="2.1.0"/>
<iosPod name="HiveAdizAdapterPangle" version="2.1.0"/>
<iosPod name="HiveAdizAdapterUnityAds" version="2.1.0"/>
<iosPod name="HiveAdizAdapterMeta" version="2.1.0"/>
</iosPods>
</dependencies>
为了确认 Adiz 适配器配置是否正确应用,请在运行应用后在 广告检查器 界面中查看配置列表。
Adiz 初始化¶
在展示所有类型的广告之前,必须执行的步骤。进行 Adiz 初始化后,可以获得展示广告所需的广告密钥。如果处于测试模式,则会获得测试密钥。如果使用 Hive SDK,则在调用 AuthV4.setup
之后进行 Adiz 初始化。
警告
如果使用GDPR设置,则必须在完成Hive Adiz初始化后执行AuthV4.setup
。如果在显示ATT(应用追踪透明度)同意通知后出现GDPR同意屏幕,则应用可能会在Apple应用审核中被拒绝。
using hiveAdiz;
public void Start() {
/* 생략 */
// 要使用 HiveAdiz 回调,必须将 AdizCallbackManager 注册为 GameObject。
Adiz.InitPlugin();
}
Adiz.Initialize(new CommonHandlers.Builder()
.OnResult(InitResultCB)
.Build());
// 初始化回调监听器
private void InitResultCB(AdizError error, string jsonString) {
Debug.Log(TAG + "::InitResultCB:: errorCode : "+error.errorCode+" errorMessage : "+error.errorMessage+" json : "+jsonString);
if(error.isSuccess()) {
JSONObject resJsonObject = new JSONObject (jsonString);
JSONObject jsonArray = resJsonObject.GetField ("keys");
if (jsonArray != null && jsonArray.count > 0) {
List interstitialKeyList = new List();
List bannerKeyList = new List();
List nativeKeyList = new List();
List rewardedKeyList = new List();
List rewardedInterstitialKeyList = new List();
List appOpenKeyList = new List();
List jsonList = jsonArray.list;
foreach (JSONObject jsonItem in jsonList) {
bool isDefault = false;
jsonItem.GetField(ref isDefault, "is_default");
// 这是在游戏中直接输入广告密钥并使用时,构建is_default为false的密钥列表的示例。
if(isDefault == false) {
string hiveAdKey = null;
jsonItem.GetField(ref hiveAdKey, "key");
string form = null;
jsonItem.GetField(ref form, "form");
switch (form) {
case "interstitial":
interstitialKeyList.Add(hiveAdKey);
break;
case "banner":
bannerKeyList.Add(hiveAdKey);
break;
case "native":
nativeKeyList.Add(hiveAdKey);
break;
case "rewarded":
rewardedKeyList.Add(hiveAdKey);
break;
case "rewarded_interstitial":
rewardedInterstitialKeyList.Add(hiveAdKey);
break;
case "app_open":
appOpenKeyList.Add(hiveAdKey);
break;
}
}
}
foreach(string hiveAdKey in interstitialKeyList) {
Debug.Log("onSdkInitialize interstitialKeyList "+hiveAdKey);
}
foreach(string hiveAdKey in bannerKeyList) {
Debug.Log("onSdkInitialize bannerKeyList "+hiveAdKey);
}
foreach(string hiveAdKey in nativeKeyList) {
Debug.Log("onSdkInitialize nativeKeyList "+hiveAdKey);
}
foreach(string hiveAdKey in rewardedKeyList) {
Debug.Log("onSdkInitialize rewardedKeyList "+hiveAdKey);
}
foreach(string hiveAdKey in rewardedInterstitialKeyList) {
Debug.Log("onSdkInitialize rewardedInterstitialKeyList "+hiveAdKey);
}
foreach(string hiveAdKey in appOpenKeyList) {
Debug.Log("onSdkInitialize appOpenKeyList "+hiveAdKey);
}
}
}
}
初始化执行时作为回调接收的 JSON 文件中包含广告键列表。广告键列表的格式如下:
{
"keys":[
{
"mediation_id":5,
"key":"ca-app-pub-3940256099942544/5354046379",
"form":"rewarded_interstitial",
"is_default":true,
"placement_id":"lobby01"
},
{
"mediation_id":4,
"key":"ca-app-pub-3940256099942544/5224354917",
"form":"rewarded",
"is_default":true,
"placement_id":"game02"
},
{
"mediation_id":3,
"key":"ca-app-pub-3940256099942544/2247696110",
"form":"native",
"is_default":true,
"placement_id":"event01"
},
{
"mediation_id":1,
"key":"ca-app-pub-3940256099942544/1033173712",
"form":"interstitial",
"is_default":true,
"placement_id":"mission01"
},
{
"mediation_id":2,
"key":"ca-app-pub-3940256099942544/6300978111",
"form":"banner",
"is_default":true,
"placement_id":"main01"
},
{
"mediation_id":6,
"key":"ca-app-pub-3940256099942544/9257395921",
"form":"app_open",
"is_default":true,
"placement_id":"appopen01"
}
]
}
在测试模式下初始化时,即使没有在 Hive 控制台注册 AdMob 广告密钥,也会收到测试广告密钥列表。在商业模式下初始化时,将收到在 Hive 控制台注册的 AdMob 广告密钥列表。
每种广告形式(form
)都使用一个广告作为默认广告(即"is_default":true
的广告)。当首次注册某种广告形式时,首次注册的广告将成为默认广告。默认广告在创建广告实例(initialize()
)时不需要输入广告键(hiveAdKey
)。要更改默认广告,必须在HiveHive 控制台中删除现有的默认广告并重新注册广告。
广告回调监听器设置¶
每次创建广告实例时,实现 AdizListener
可以根据广告状态变化接收回调。
名称 | 说明 | 必需实现 |
---|---|---|
.OnAdLoad(OnAdLoadCB) | 广告加载成功 | O |
.OnAdFail(OnAdLoadFailedCB) | 失败(可以通过`error.errorCode()`和`error.errorMessage()`了解失败原因) | O |
.OnAdShow(OnAdShowCB) | 广告展示成功 | O |
.OnAdClick(OnAdClickCB) | 广告点击 | O |
.OnAdPaidEvent(OnAdPaidEventCB) | 广告曝光后收到付费事件的时刻,广告收入信息被传递 | O |
.OnAdClose(OnAdCloseCB) | 广告结束
| X |
.OnAdReward(OnAdRewardCB) | 在奖励广告(`rewarded`, `rewarded interstitial`)中,用户在广告展示后获得奖励的时刻 | X |
private void OnAdLoadCB()
{
// 广告加载完成后调用。
// 如果广告加载成功,则应在所需时刻调用广告实例的 .show() 来显示广告。
Debug.Log(TAG + "::OnAdLoadCB");
// AdizInterstitial 加载完成后显示
// requestShowAd();
}
private void OnAdLoadFailedCB(AdizError error) {
// 广告加载失败或由于其他原因导致广告展示失败时调用。
Debug.Log(TAG + "::OnAdLoadFailedCB errorCode "+error.errorCode);
Debug.Log(TAG + "::OnAdLoadFailedCB errorMessage "+error.errorMessage);
}
private void OnAdShowCB()
{
// 广告显示时调用。
Debug.Log(TAG + "::OnAdShowCB");
}
private void OnAdCloseCB()
{
// 广告关闭时调用。
Debug.Log(TAG + "::OnAdCloseCB");
// AdizInterstitial 广告曝光后移除
// requestDestroyAd();
}
private void OnAdClickCB()
{
// 点击广告时调用。
Debug.Log(TAG + "::OnAdClickCB");
}
private void OnAdRewardCB(RewardItem rewardItem)
{
// 奖励广告和奖励插页广告观看广告后会调用此方法。
Debug.Log(TAG + "::OnAdRewardCB:: rewardItem.itemType : " + rewardItem.getItemType() + " rewardItem.itemAmount : " + rewardItem.getItemAmount());
// 仅在奖励和奖励插页广告中传递
}
private void OnAdPaidEventCB(AdRevenueData adRevenueData)
{
// 当广告产生收益时调用。
Debug.Log(TAG + "::OnAdPaidEventCB:: adRevenueData.revenue : " + adRevenueData.getRevenue() + " adRevenueData.currency : " + adRevenueData.getCurrency());
}
错误代码¶
当在 Adiz.Initialize
和 AdizListener
中接收到 OnAdFail()
时,AdizError
错误代码和错误信息如下所示。
公共代码¶
编号 | 案例 | 解释 |
---|---|---|
0 | 成功 | 成功 |
Adiz 错误代码¶
编号 | 案例 | 说明 |
---|---|---|
-1 | InvalidParam | 无效的参数 |
-2 | NotSupported | 不支持 |
-3 | InProgress | 进程进行中状态 |
-4 | Network | 网络错误 |
-5 | NeedInitialize | 需要初始化 |
-6 | ResponseFail | 响应失败 |
-7 | Timeout | 网络超时 |
-99 | Unknown | 未知错误 |
广告平台错误代码¶
编号 | 案例 | 解释 |
---|---|---|
-101 | NeedLoad | 广告未加载 |
-102 | NeedReload | 由于广告展示时间到期需要重新加载 |
-103 | NotEnoughInventory | 调解响应成功,但由于库存不足没有填充广告 |
-104 | MissingAppId | 调解请求的AppID错误 |
-105 | InternalNetworkError | 调解网络相关错误 |
-106 | InvalidUnitId | 无效的单元ID |
-107 | MediationNoFill | 调解适配器无法处理广告请求 |
-108 | AlreadyLoaded | 已经加载状态 |
-109 | CannotRequestAds | 无法请求广告 |
-201 | GdprConsentError | GDPR同意错误 |
-202 | IsNotPrivacyOptionsRequired | 无法显示GDPR同意弹窗或不需要显示的状态 |
广告展示与广告结束¶
展示和结束广告,请按照以下步骤操作。
- 根据要展示的广告形式,在广告类中创建广告实例。如果要展示的广告不是默认广告,则必须输入在初始化中获得的广告键或位置 ID。如果不输入广告键(
hiveAdKey
)或位置 ID(placementId
),则会创建默认广告实例。位置 ID 可以在 Hive 控制台中设置,更多详细信息请参考控制台指南中的Admob 设置页面。 - 加载要展示的广告(
load()
)。 - 加载要展示的广告(
load()
)。 - 展示加载的广告(
show()
)。要重新展示广告,必须先调用load()
,然后再调用show()
。 - 要结束广告,请调用
destroy()
。
全屏广告 (Interstitial)¶
占据整个屏幕的全屏广告。
// 创建 AdizInterstitial 实例
private AdizInterstitial InterstitialAd = null;
public void requestInitAd(string interstitialAdKey) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(interstitialAdKey)) {
// 初始化默认的 AdizInterstitial 实例 (AdEventHandlers)
InterstitialAd = AdizInterstitial.Initialize(eventHandlers);
} else {
// 初始化 AdizInterstitial 实例 (hiveAdKey, AdEventHandlers)
InterstitialAd = AdizInterstitial.Initialize(interstitialAdKey, eventHandlers);
}
}
public void requestInitAdWithPlacementId(string interstitialPlacementId) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(interstitialPlacementId)) {
// 初始化默认的 AdizInterstitial 实例 (AdEventHandlers)
InterstitialAd = AdizInterstitial.Initialize(eventHandlers);
} else {
// 初始化 AdizInterstitial 实例 (placementId, AdEventHandlers)
InterstitialAd = AdizInterstitial.InitializeWithPlacementId(interstitialPlacementId, eventHandlers);
}
}
public void requestLoadAd() {
// Load AdizInterstitial
if(InterstitialAd != null && InterstitialAd.IsInitialized()) InterstitialAd.Load();
}
public void requestShowAd() {
// 显示 AdizInterstitial
if(InterstitialAd != null && InterstitialAd.IsLoaded()) InterstitialAd.Show();
}
public void requestDestroyAd() {
// 销毁 AdizInterstitial
if(InterstitialAd != null) InterstitialAd.Destroy();
InterstitialAd = null;
}
横幅广告 (Banner)¶
这是显示特定尺寸横幅的横幅广告。横幅广告不会接收 OnAdClose()
回调。因此,必须在其他位置调用 destroy()
来结束广告。
BannerSize
遵循标准横幅尺寸。
尺寸点(宽度x高度) | 说明 | 支持对象 | BannerSize 常量 |
---|---|---|---|
320x50 | 横幅 | 手机和平板 | BannerSize.NORMAL |
320x100 | 大横幅 | 手机和平板 | BannerSize.MEDIUM |
300x250 | IAB 中等矩形 | 手机和平板 | BannerSize.LARGE |
468 x 60 | IAB 全尺寸横幅 | 平板 | BannerSize.FULL |
PositionType
是最顶部或最底部。默认值是最底部。
对齐 | 描述 | PositionType 常量 |
---|---|---|
最顶部对齐 | 指定屏幕最顶部对齐(iOS是以SafeArea为基准的最顶部对齐) | PositionType.TOP |
最底部对齐(默认值) | 指定屏幕最底部对齐(iOS是以SafeArea为基准的最底部对齐) | PositionType.BOTTOM |
// 创建 AdizBanner 实例
private AdizBanner BannerAd = null;
public void requestInitAd(string bannerAdKey) {
// 设置横幅广告大小
private BannerSize bannerSize = BannerSize.NORMAL;
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(bannerAdKey)) {
// 初始化默认的 AdizBanner 实例 (AdEventHandlers)
BannerAd = AdizBanner.Initialize(bannerSize, eventHandlers);
} else {
// 初始化 AdizBanner 实例 (hiveAdKey, AdEventHandlers)
BannerAd = AdizBanner.Initialize(bannerAdKey, bannerSize, eventHandlers);
}
}
public void requestInitAdWithPlacementId(string bannerPlacementId) {
// 设置横幅大小
private BannerSize bannerSize = BannerSize.NORMAL;
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(bannerPlacementId)) {
// 初始化默认的 AdizBanner 实例 (AdEventHandlers)
BannerAd = AdizBanner.Initialize(bannerSize, eventHandlers);
} else {
// 初始化 AdizBanner 实例 (placementId, AdEventHandlers)
BannerAd = AdizBanner.InitializeWithPlacementId(bannerPlacementId, bannerSize, eventHandlers);
}
}
public void requestLoadAd() {
// Load AdizBanner
if(BannerAd != null && BannerAd.IsInitialized()) BannerAd.Load();
}
public void requestShowAd() {
// 设置位置类型
private PositionType bannerPosition = PositionType.TOP;
// 显示 AdizBanner
if(BannerAd != null && BannerAd.IsLoaded()) BannerAd.Show(bannerPosition);
}
public void requestDestroyAd() {
// 销毁 AdizBanner
if(BannerAd != null) BannerAd.Destroy();
BannerAd = null;
}
原生广告 (Native)¶
这是展示特定尺寸的原生模板的原生广告。原生广告已针对竖屏进行了优化,因此建议在竖屏游戏(竖屏游戏)中使用。原生广告不会接收 OnAdClose()
回调。因此,必须在其他位置调用 destroy()
来结束广告。
当前模板支持 small
或 medium
尺寸。
尺寸点(宽度x高度) | 模板 | 对齐 | BannerSize 常量 |
---|---|---|---|
355x91(比例调整) | 小尺寸 | 顶部 / 底部 | BannerSize.NORMAL |
355x370(比例调整) | 中等尺寸 | 居中(固定) | BannerSize.MEDIUM, BannerSize.LARGE, BannerSize.FULL |
small
模板中的 PositionType
是最顶部或最底部,默认值是最底部。
对齐 | 描述 | PositionType 常量 |
---|---|---|
最顶部对齐 | 指定屏幕最顶部对齐(iOS是基于SafeArea的最顶部对齐指定) | PositionType.TOP |
最底部对齐(默认值) | 指定屏幕最底部对齐(iOS是基于SafeArea的最底部对齐指定) | PositionType.BOTTOM |
medium
模板无法选择对齐方式,默认使用居中对齐。
// 创建 AdizNative 实例
private AdizNative NativeAd = null;
public void requestInitAd(string nativeAdKey) {
// 设置横幅大小
private BannerSize bannerSize = BannerSize.NORMAL;
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(nativeAdKey)) {
// 初始化默认的 AdizNative 实例 (AdEventHandlers)
NativeAd = AdizNative.Initialize(bannerSize, eventHandlers);
} else {
// 初始化 AdizNative 实例 (hiveAdKey, AdEventHandlers)
NativeAd = AdizNative.Initialize(nativeAdKey, bannerSize, eventHandlers);
}
}
public void requestInitAdWithPlacementId(string nativePlacementId) {
// 设置横幅大小
private BannerSize bannerSize = BannerSize.NORMAL;
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(nativePlacementId)) {
// 初始化默认的 AdizNative 实例 (AdEventHandlers)
NativeAd = AdizNative.Initialize(bannerSize, eventHandlers);
} else {
// 初始化 AdizNative 实例 (placementId, AdEventHandlers)
NativeAd = AdizNative.InitializeWithPlacementId(nativePlacementId, bannerSize, eventHandlers);
}
}
public void requestLoadAd() {
// Load AdizNative
if(NativeAd != null && NativeAd.IsInitialized()) NativeAd.Load();
}
public void requestShowAd() {
// 设置位置类型
private PositionType bannerPosition = PositionType.TOP;
// 显示 AdizNative
if(NativeAd != null && NativeAd.IsLoaded()) NativeAd.Show(bannerPosition);
}
public void requestDestroyAd() {
// 销毁 AdizNative
if(NativeAd != null) NativeAd.Destroy();
NativeAd = null;
}
奖励广告 (Rewarded)¶
用户在观看广告超过一定时间后会获得奖励的奖励广告。完成奖励发放后,将通过 OnAdReward()
回调接收奖励项目的信息。
// 创建 AdizRewarded 实例
private AdizRewarded RewardVideoAd = null;
public void requestInitAd(string rewardedAdKey) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdReward(OnAdRewardCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(rewardedAdKey)) {
// 初始化默认的 AdizRewarded 实例 (AdEventHandlers)
RewardVideoAd = AdizRewarded.Initialize(eventHandlers);
} else {
// 初始化 AdizRewarded 实例 (hiveAdKey, AdEventHandlers)
RewardVideoAd = AdizRewarded.Initialize(rewardedAdKey, eventHandlers);
}
}
public void requestInitAdWithPlacementId(string rewardedPlacementId) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdReward(OnAdRewardCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(rewardedPlacementId)) {
// 初始化默认的 AdizRewarded 实例 (AdEventHandlers)
RewardVideoAd = AdizRewarded.Initialize(eventHandlers);
} else {
// 初始化 AdizRewarded 实例 (placementId, AdEventHandlers)
RewardVideoAd = AdizRewarded.InitializeWithPlacementId(rewardedPlacementId, eventHandlers);
}
}
public void requestLoadAd() {
// Load AdizRewarded
if(RewardVideoAd != null && RewardVideoAd.IsInitialized()) RewardVideoAd.Load();
}
public void requestShowAd() {
// 显示 AdizRewarded
if(RewardVideoAd != null && RewardVideoAd.IsLoaded()) RewardVideoAd.Show();
}
public void requestDestroyAd() {
// 销毁 AdizRewarded
if(RewardVideoAd != null) RewardVideoAd.Destroy();
RewardVideoAd = null;
}
奖励式插页广告 (Rewarded Interstitial)¶
用户在观看广告超过一定时间后会获得奖励的奖励式插页广告。完成奖励发放后,将通过 OnAdReward()
回调接收奖励项目的信息。
// 创建 AdizRewardedInterstitial 实例
private AdizRewardedInterstitial RewardedInterstitialAd = null;
public void requestInitAd(string rewardedInterstitialAdKey) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdReward(OnAdRewardCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(rewardedInterstitialAdKey)) {
// 初始化默认的 AdizRewardedInterstitial 实例 (AdEventHandlers)
RewardedInterstitialAd = AdizRewardedInterstitial.Initialize(eventHandlers);
} else {
// 初始化 AdizRewardedInterstitial 实例 (hiveAdKey, AdEventHandlers)
RewardedInterstitialAd = AdizRewardedInterstitial.Initialize(rewardedInterstitialAdKey, eventHandlers);
}
}
public void requestInitAdWithPlacementId(string rewardedInterstitialPlacementId) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdClick(OnAdClickCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdReward(OnAdRewardCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(rewardedInterstitialPlacementId)) {
// 初始化默认的 AdizRewardedInterstitial 实例 (AdEventHandlers)
RewardedInterstitialAd = AdizRewardedInterstitial.Initialize(eventHandlers);
} else {
// 初始化 AdizRewardedInterstitial 实例 (placementId, AdEventHandlers)
RewardedInterstitialAd = AdizRewardedInterstitial.InitializeWithPlacementId(rewardedInterstitialPlacementId, eventHandlers);
}
}
public void requestLoadAd() {
// Load AdizRewardedInterstitial
if(RewardedInterstitialAd != null && RewardedInterstitialAd.IsInitialized()) RewardedInterstitialAd.Load();
}
public void requestShowAd() {
// 显示 AdizRewardedInterstitial
if(RewardedInterstitialAd != null && RewardedInterstitialAd.IsLoaded()) RewardedInterstitialAd.Show();
}
public void requestDestroyAd() {
// 销毁 AdizRewardedInterstitial
if(RewardedInterstitialAd != null) RewardedInterstitialAd.Destroy();
RewardedInterstitialAd = null;
}
应用开启广告 (AppOpen)¶
当应用状态从后台切换到前台时,展示预先加载的(load()
)广告的应用开启广告。在广告加载后经过3小时,如果调用show()
,则会自动重新加载广告后展示广告。一旦广告展示过一次后,广告将不会自动加载。
// 创建 AdizAppOpen 实例
private AdizAppOpen AppOpenAd = null;
public void requestInitAd(string appOpenAdKey) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdClick(OnAdClickCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(appOpenAdKey)) {
// 初始化默认的 AdizAppOpen 实例 (AdEventHandlers)
AppOpenAd = AdizAppOpen.Initialize(eventHandlers);
} else {
// 初始化 AdizAppOpen 实例 (hiveAdKey, AdEventHandlers)
AppOpenAd = AdizAppOpen.Initialize(appOpenAdKey, eventHandlers);
}
}
public void requestInitAdWithPlacementId(string appOpenPlacementId) {
AdEventHandlers eventHandlers = new AdEventHandlers.Builder()
.OnAdLoad(OnAdLoadCB)
.OnAdShow(OnAdShowCB)
.OnAdClose(OnAdCloseCB)
.OnAdFail(OnAdLoadFailedCB)
.OnAdClick(OnAdClickCB)
.OnAdPaidEvent(OnAdPaidEventCB)
.Build();
if(string.IsNullOrEmpty(appOpenPlacementId)) {
// 初始化默认的 AdizAppOpen 实例 (AdEventHandlers)
AppOpenAd = AdizAppOpen.Initialize(eventHandlers);
} else {
// 初始化 AdizAppOpen 实例 (placementId, AdEventHandlers)
AppOpenAd = AdizAppOpen.InitializeWithPlacementId(appOpenPlacementId, eventHandlers);
}
}
public void requestLoadAd() {
// Load AdizAppOpen
if(AppOpenAd != null && AppOpenAd.IsInitialized()) AppOpenAd.Load();
}
public void requestShowAd() {
// Show AdizAppOpen
Debug.Log("[appOpenAd] appOpenAd don't request Show");
}
public void requestDestroyAd() {
// 销毁 AdizAppOpen
if(AppOpenAd != null) AppOpenAd.Destroy();
AppOpenAd = null;
}
移除 HiveAdiz¶
要移除 HiveAdiz,请删除 Unity 项目中的以下文件夹。
- 资产/HiveAdiz
- 资产/HiveAdiz_示例