Unity
Adiz Unity¶
Adiz Unity 是 Hive 提供的一个 Unity 广告模块,旨在简化使用 AdMob 提供的广告曝光功能。Adiz Unity 提供的广告类型如下。
- 插页式广告
- 横幅广告
- 原生广告
- 激励广告
- 激励插页式广告
- 应用打开广告
请参考下面的指南以安装和使用 Adiz Unity。
安装或更新¶
- 设置Adiz Unity开发环境。
- 从这里下载最新版本的Adiz并解压。
- 在Unity中,选择资产 > 导入包 > 自定义包…选项,选择.unitypackage文件,然后点击导入。
- 检查资产文件夹下是否已创建Adiz文件和文件夹。
- 下载并安装最新版本的EDM4U。Hive SDK v4包含EDM4U。如果您使用的是Hive SDK v4,则无需单独安装EDM4U。
要更新当前使用的 Adiz 版本,请通过点击 此处 卸载 Adiz,然后下载并安装最新版本。
Unity 设置¶
安卓¶
将 AdMobId
值以 ca-app-pub-XXXXX~YYYYY 的格式添加到在 Unity 项目中创建的 Assets/Plugins/Android/AndroidManifest.xml 文件中。
<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>
检查 使用 Jetifier。 在 Unity 的 Android Resolver Settings (Assets > External Dependency Manager > Android Resolver > Settings)。
玩家设置 > 玩家 > 构建 设置屏幕,请检查以下四项。
在使用 Proguard 时,Adiz 模块的 ProGuard 规则已包含。因此,无需将 ProGuard 规则添加到项目中。
iOS¶
在资产 > 外部依赖管理器 > iOS 解析器 > 设置中,禁用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.1
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 }
# 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
<
将 GADApplicationIdentifier
键添加到 Unity 构建过程中生成的 Xcode 项目的 Info.plist 文件中,并将 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 广告密钥。在商业发布期间禁用测试模式。
有两种方法可以激活测试模式。
- 在Hive控制台中注册测试设备后,将其设置为演示广告(推荐):
请参阅控制台指南中的Test Device Management部分。 - 使用Adiz类的
setTestMode()
方法:
请参阅下面的示例代码。
Warning
在开发阶段未处于测试模式时,过多点击广告可能被视为无效流量,您的AdMob账户可能会被报告,导致广告无法显示。
使用 Adiz.SetTestMode() 方法¶
using hiveAdiz; // Activate test mode. Comment out this line for production deployment.
Adiz.SetTestMode(true);
// 激活 Adiz 模块日志记录。日志记录仅应在测试模式下使用。对于生产部署,请注释掉以下行。
Adiz.SetLogEnable(true);
测试设备广告曝光¶
在以下情况下,您需要注册一个测试设备以曝光测试广告。
在测试设备上显示广告有两种方式。
Note
如果您进行测试而没有注册测试设备显示实际广告,则可能会被视为无效流量,您的AdMob帐户可能会被阻止,从而阻止进一步的广告展示。当您注册测试设备时,在广告曝光期间将显示“测试模式”或“测试广告”(针对原生广告)。在商业分发期间,您必须停用测试设备。
横幅广告、插页广告或奖励广告
原生广告
使用 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)
。将复制的测试设备ID输入到DEVICE_ID
中。
using hiveAdiz;
public void Initialize() {
// 테스트 디바이스 설정
Adiz.SetTestDevice("33BE2250B43518CCDA7DE426D04EE231");
Adiz.Initialize(new CommonHandlers.Builder()
.OnResult(InitResultCB)
.Build());
}
广告检查器使用¶
广告检查器是一个应用内覆盖工具,实时分析在测试设备上请求和显示实际广告的过程。它会告知您加载广告所需的时间,并在广告未能显示时提供失败原因。您还可以指定特定的广告网络,以检查广告是否正确显示,如果存在问题,您可以在代码级别进行调试。所有这些都与广告检查器用户界面一起完成。它包含在 Google Mobile Ads SDK Android 20.0.0 和 Google Mobile Ads SDK iOS 7.68.0 或更高版本中,可以通过调用 AdizDeveloperTool.OpenAdInspector
来使用。
要使用广告检查器,必须设置注册测试设备。
Adiz AppID 配置¶
设置在 Hive 控制台 AppCenter 中注册的 Adiz AppID。如果未设置,将使用包名称或捆绑 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 消息时,IDFA 消息将在 iOS 14.5 及以上版本的 Adiz 初始化期间自动显示。当用户在 IDFA 消息窗口中点击“继续”时,将显示 ATT 同意弹窗。
当用户在ATT同意弹窗中点击“允许”时,IDFA被激活,并显示用户特定的广告。
Note
来自欧洲和英国的用户将看到GDPR同意弹窗。如果用户从未同意GDPR条款,ATT同意弹窗将在GDPR同意弹窗之后立即显示,而不会显示IDFA消息。如果用户之前同意过GDPR条款,IDFA消息将在显示ATT同意弹窗之前正常显示。
GDPR 同意弹窗曝光(欧洲,英国)¶
如果游戏面向欧洲和英国(欧洲经济区和英国),则必须显示 GDPR(通用数据保护条例)同意弹窗。只有当用户的设备 IP 地址来自欧洲或英国(欧洲经济区和英国)时,GDPR 同意弹窗才会显示。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() { // Call privacy options form if(AdizConsentManager.IsPrivacyOptionsRequired()) { AdizConsentManager.ShowPrivacyOptionsForm(new CommonHandlers.Builder() .OnResult(CommonResultCB) .Build()); } } // ....
为GDPR同意年龄以下的用户设置标签 (TFUA)¶
您可以使用未成年人同意标签(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 测试设备设置¶
只有当设备的 IP 地址来自欧洲或英国时,GDPR 同意弹窗才会显示。在开发阶段,可以强制显示 GDPR 同意弹窗,而不考虑 IP 地址,以测试弹窗的显示。为此,您需要设置一个 GDPR 测试设备。请按照以下步骤设置 GDPR 测试设备。以下内容与如何在测试设备上展示广告相同。
- 通过初始化来初始化Adiz。这是一个初始化步骤,用于检查测试设备ID,无需编写GDPR同意消息。
输出Android Studio或Xcode日志以检查设备ID。示例日志如下。
- Android: from
使用新的 ConsentDebugSettings.Builder().addTestDeviceHashedId("33BE2250B43518CCDA7DE426D04EE231") 将其设置为调试设备。
33BE2250B43518CCDA7DE426D04EE231
- iOS: 在
<UMP SDK>要为此设备启用调试模式,请设置: UMPDebugSettings.testDeviceIdentifiers = @[B74F6468-1516-467C-99AD-CC5973C5DB52]
B74F6468-1516-467C-99AD-CC5973C5DB52
- 复制设备 ID。
- 在现有的 Adiz 初始化代码中执行
AdizGDPRManager.setTestDevice(DEVICE_ID)
,然后再执行Adiz.initialize
。 - 编写GDPR 同意消息,并重新初始化 Adiz,以检查 GDPR 同意弹出窗口是否正确出现。
using hiveAdiz; public void Initialize() { // GDPR 测试设备设置 AdizGDPRManager.SetTestDevice("33BE2250B43518CCDA7DE426D04EE231"); Adiz.Initialize(new CommonHandlers.Builder() .OnResult(InitResultCB) .Build()); }
COPPA儿童定向标签设置¶
根据儿童在线隐私保护法案(COPPA),应用开发者可以通过在广告请求时使用儿童定向标签设置(tagForChildDirectedTreatment,TFCD)来指定谷歌是否应将内容视为面向儿童。如果您希望将其视为面向儿童,必须在执行Adiz.initialize
之前调用AdizConsentManager.SetUserPrivacySettings
。在使用Adiz与Hive SDK时,儿童定向标签会自动应用,因此无需额外配置。
using hiveAdiz;
public void Initialize() {
bool isTagForChildDirectedTreatment = false; // Change to true if it is for children
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 | |||
---|---|---|---|---|---|
步骤 1:设置 | Android iOS | 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.1"/>
<!-- AppLovin -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-applovin:2.1.1"/>
<!-- Liftoff -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-liftoff:2.1.1"/>
<!-- Meta -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-meta:2.1.1"/>
<!-- Pangle -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-pangle:2.1.1"/>
<!-- Unity Ads -->
<androidPackage spec="com.com2us.android.adiz:hive-adiz-adapter-unityads:2.1.1"/>
</androidPackages>
<iosPods>
<sources>
<source>https://github.com/Com2uSPlatformCorp/HiveAdiz-iOS.git</source>
</sources>
<iosPod name="HiveAdizUnityPlugin" version="2.1.1"/>
<iosPod name="HiveAdizAdapterAppLovin" version="2.1.1"/>
<iosPod name="HiveAdizAdapterLiftoff" version="2.1.1"/>
<iosPod name="HiveAdizAdapterMeta" version="2.1.1"/>
<iosPod name="HiveAdizAdapterPangle" version="2.1.1"/>
<iosPod name="HiveAdizAdapterUnityAds" version="2.1.1"/>
</iosPods>
</dependencies>
要验证 Adiz 适配器配置是否已正确应用,请运行应用程序并检查 广告检查器 屏幕上的配置列表。
Adiz 初始化¶
这是在显示所有类型广告之前必须执行的步骤。通过初始化 Adiz,您将收到显示广告所需的广告密钥。如果您处于测试模式,您将收到一个测试密钥。如果您使用的是 Hive SDK,请在调用 AuthV4.setup
后进行 Adiz 初始化。
警告
如果您使用GDPR设置,则必须在完成Hive Adiz初始化后运行AuthV4.setup
。如果在显示ATT(应用跟踪透明度)同意通知后出现GDPR同意屏幕,则应用可能会在苹果的应用审核中被拒绝。
using hiveAdiz;
public void Start() {
/* omitted */
// 要使用 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()
{
// This will be called when the ad is displayed.
Debug.Log(TAG + "::OnAdShowCB");
}
private void OnAdCloseCB()
{
// 这是在广告关闭时调用的。
Debug.Log(TAG + "::OnAdCloseCB");
// 显示 AdizInterstitial 广告后移除
// requestDestroyAd();
}
private void OnAdClickCB()
{
// This is called when the ad is clicked.
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 | 需要加载 | 广告尚未加载 |
-102 | 需要重新加载 | 由于广告曝光时间到期,需要重新加载 |
-103 | 库存不足 | 调解响应成功,但由于库存不足没有广告填充 |
-104 | 缺少AppId | 调解请求的AppID错误 |
-105 | 内部网络错误 | 调解网络相关错误 |
-106 | 无效的单元ID | 无效的单元ID |
-107 | 调解无填充 | 调解适配器无法处理广告请求 |
-108 | 已加载 | 已经处于加载状态 |
-109 | 无法请求广告 | 无法请求广告 |
-201 | GDPR同意错误 | GDPR同意错误 |
-202 | 不需要隐私选项 | 无法显示GDPR同意弹出窗口,或处于不需要显示的状态 |
广告曝光和广告终止¶
按照以下步骤曝光和终止广告。
- 为您想要显示的每种广告类型在广告类中创建一个广告实例。如果您想要显示的广告不是默认广告,您必须输入从初始化中获得的广告密钥或投放 ID。如果您不输入广告密钥(
hiveAdKey
)或投放 ID(placementId
),将会创建一个默认广告实例。投放 ID 可以在 Hive 控制台中设置,更多详细信息,请参阅控制台指南中的Admob 设置页面。 - 加载您想要显示的广告(
load()
)。 - 加载您想要显示的广告(
load()
)。 - 显示加载的广告(
show()
)。要重新显示广告,您必须再次调用load()
,然后调用show()
。 - 要关闭广告,请调用
destroy()
。
插页广告¶
占据整个屏幕的全屏广告。
// 创建 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() {
// Show 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
是最上面或最下面的。默认值是最下面的。
对齐方式 | 描述 | 位置类型常量 |
---|---|---|
顶部对齐 | 指定屏幕顶部的对齐方式(iOS根据安全区域指定顶部对齐) | PositionType.TOP |
底部对齐(默认) | 指定屏幕底部的对齐方式(iOS根据安全区域指定底部对齐) | 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() {
// 加载 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;
}
奖励广告¶
这是一个奖励广告,用户在观看广告一段时间后会获得奖励。一旦奖励被授予,奖励项目的信息将通过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() {
// 加载 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;
}
奖励插页广告¶
这是一个奖励插页广告,用户在观看广告一定时间后会获得奖励。一旦奖励被授予,奖励项目的信息将通过OnAdReward()
回调接收。
// Create AdizRewardedInterstitial Instance
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() {
// Show 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_示例