跳转至

iOS 版

Adiz iOS

Adiz iOS 是 Hive 提供的 iOS 广告模块,旨在简化使用 AdMob 提供的广告曝光功能。Adiz iOS 提供的广告类型如下:

  • 插页广告
  • 横幅广告
  • 原生广告
  • 奖励广告
  • 奖励插页广告
  • 应用启动广告

要安装和使用 Adiz iOS,请按照下面的指南进行。

前提条件

配置 Adiz iOS 开发环境

安装

GADApplicationIdentifier 键添加到 Xcode 项目的 Info.plist 文件中,并将 AdMobId 值(格式为 ca-app-pub-XXXXX~YYYYY)作为该键的值添加。

GADApplicationIdentifier
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 允许您以两种方式显示测试广告。

  1. 启用测试模式:仅显示由 AdMob 发布的测试广告。
  2. 注册测试设备并显示广告:为了测试目的显示真实广告。注册设备以显示测试广告,以确保在测试期间不会发生无效流量。

启用测试模式

在开发阶段,启用测试模式,以便点击测试广告不会对广告客户产生费用。当启用测试模式时,仅显示测试广告。在测试模式下,您无需在 Hive 控制台中输入 AdMob 广告密钥即可显示测试广告。对于商业分发,请禁用测试模式。

Note

如果在开发阶段的测试模式下点击广告过多,可能会被视为无效流量,并且您的AdMob账户可能会被报告,从而阻止您展示广告。

import HiveAdiz

// 激活测试模式。对于商业发行,请注释掉下面的行。
Adiz.setTestMode(true)

// 为Adiz模块启用日志记录。日志记录仅应在测试模式下使用。对于商业分发,请注释掉下面的行。
Adiz.setLogEnable(true)
#import <HiveAdiz/HiveAdiz-Swift.h>

// 激活测试模式。对于商业分发,请注释掉下面的行。
[Adiz setTestMode: true];

// 为Adiz模块启用日志记录。日志记录仅应在测试模式下使用。对于商业分发,请注释掉下面的行。
[Adiz setLogEnable: true];

设置测试设备以显示广告

您应该在以下情况下注册测试设备以显示测试广告:

  • 当测试在 Hive 控制台中注册的 AdMob 广告密钥是否正常工作时
  • 当您想确保 GDPR 同意弹窗在您编写 GDPR 消息 后正常工作时
  • 当您需要运行 广告检查器 以分析和调试广告请求时

在未注册测试设备的情况下测试真实广告可能会被视为无效流量,从而导致您的AdMob帐户被封锁,并且无法再显示广告。当您注册测试设备时,在广告展示期间将显示“测试模式”或“测试广告”(针对原生广告)。测试设备在生产部署时应禁用。


横幅广告、插页广告或激励广告


本地广告


要注册测试设备,首先识别测试设备 ID。测试设备 ID(例如,B74F6468-1516-467C-99AD-CC5973C5DB52)可以通过以下两种方法找到:

  1. 在调用 Adiz.Initialize() 后检查 Logcat 日志:
    要为此设备启用调试模式,请设置: UMPDebugSettings.testDeviceIdentifiers = @[B74F6468-1516-467C-99AD-CC5973C5DB52]
  2. 在调用 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。

func setTestDevice(testId: String) {
        Adiz.setTestDevice(testId)
}
- (void)setTestDevice: (NSString *)testId {
        [Adiz setTestDevice: testId];
}


使用广告检查器

广告检查器是一个应用内覆盖工具,允许实时分析在测试设备上请求和显示实际广告的过程。它会告知您加载广告所需的时间,并在显示失败时提供失败的原因。此外,您可以指定特定的广告网络,以检查广告是否正确显示,如果存在任何问题,您可以在代码级别进行调试。所有这些过程都是通过广告检查器用户界面进行的。它包含在 Google Mobile Ads SDK iOS 版本 7.68.0 及以上版本中,可以通过调用 AdizDeveloperTool.OpenAdInspector 来使用。

要使用广告检查器,必须满足以下两个条件:

  • 使用 Adiz.setTestDevice这里 设置测试设备
  • 使用 Adiz.Initialize这里 完成初始化
func openAdInspector(viewController: UIViewController) {
        AdizDeveloperTool.openAdInspector(viewController)
}
- (void)openAdInspector: (UIViewController *)viewController {
        [AdizDeveloperTool openAdInspector: viewController];
}

设置 Adiz appID

在 Hive 控制台 AppCenter 中设置您注册的 Adiz AppID。如果未配置,将使用 Bundle ID。

Adiz.setAppId(appId)
[Adiz setAppId: appId];

设置 Hive 控制台服务器

设置您想要使用的 Hive 控制台服务器。默认值为 real。即使您使用商业服务器,如果启用了测试模式,仍会显示测试广告。

  • Hive 测试控制台服务器: AdizZoneType.test
  • Hive 沙盒控制台服务器: AdizZoneType.sandbox
  • Hive 商业控制台服务器: AdizZoneType.real
Adiz.setZone(AdizZoneType.real)
[Adiz setZone: AdizZoneTypeReal];

曝露用户特定广告

随着 iOS 14.5+ 中引入的 ATT(应用追踪透明度),隐私保护得到了加强。因此,只有在用户同意在 ATT 同意弹窗中进行活动追踪的情况下,才能曝露用户特定广告。为了通过曝露用户特定广告来最大化广告收入,有必要创建一个 IDFA(广告商标识符)消息。

按照AdMob仪表板上的指南创建并发布您的IDFA消息。

 

在创建和发布IDFA消息后,设置用户跟踪权限。按照以下步骤将密钥添加到Info.plist

  1. 在 Xcode 项目窗口的项目导航器中选择您的项目。
  2. 在 TARGETS 列表中,选择您的应用。
  3. 点击 Info 标签。
  4. 在 Info 标签中点击 Custom iOS Target Properties 部分。
  5. 在 Custom iOS Target Properties 列表中右键单击。
  6. 点击 Add Row 菜单。
  7. 在 Key 字段中输入 NSUserTrackingUsageDescription,并添加在 Localization file > Base.Iproj folder > InfoPlist.strings 中指定的值。

 

接下来,按照本地化文件中指定的内容,撰写请求应用用户权限批准的消息(常规设置 > 请求权限设置)。如果您不输入权限请求弹出消息,应用可能会因缺少关于用户访问权限的额外说明指南而在审核过程中被拒绝。

 

一旦完成,ATT 同意弹出窗口将在您 初始化 Adiz 时自动显示。如果用户在 ATT 同意弹出窗口上点击“允许”,则 IDFA 将被激活,从而为用户启用个性化广告。

如果您的游戏面向欧洲和英国欧洲经济区英国),则必须显示GDPR(通用数据保护条例)同意弹窗。只有当用户的设备IP地址来自欧洲或英国欧洲经济区英国)时,才会显示GDPR同意弹窗。Adiz支持GoogleUMP用户消息平台)来显示GDPR同意弹窗。

AdMob控制台中创建GDPR消息后,当您初始化Adiz时,GDPR弹出窗口将显示给来自欧洲和英国的用户。

警告

即使您针对的是欧洲和英国以外的地区,您也必须在AdMob 控制台中创建GDPR 消息,以确保Adiz 的初始化能够正确执行。

创建 GDPR 消息

访问 Google AdMob 控制台以创建 GDPR 消息。在创建 GDPR 消息之前,请参考 GDPR 消息创建指南

在创建GDPR消息后,GDPR同意弹出窗口将在Adiz初始化期间自动显示。

实施GDPR同意/撤回选项

GDPR同意弹出窗口应允许用户随时修改他们的同意。例如,最初不同意GDPR的用户可能希望同意以接收个性化广告,反之亦然。为了适应这种情况,开发人员必须实现用户再次同意或撤回先前同意的功能。要实现GDPR同意/撤回功能,请按照以下步骤操作:

  1. 在您的应用中实现一个按钮 UI,以重新加载 GDPR 同意弹出窗口。
  2. 在实现 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) {
           // 无需进行任何错误处理。
       }];
   }
    }

未满同意年龄的标签设置

使用TagUnder Age of ConsentTFUA),您可以配置广告请求,将居住在欧洲经济区(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测试设备。以下内容与在测试设备上显示广告相同。

  1. 初始化 Adiz。此初始化的目的是检查测试设备ID,因此您无需提前创建GDPR同意消息。
  2. 在Logcat日志输出中找到设备ID。以下是一个示例消息: 要为此设备启用调试模式,请设置:UMPDebugSettings.testDeviceIdentifiers = @[B74F6468-1516-467C-99AD-CC5973C5DB52]

获取设备 ID(示例:B74F6468-1516-467C-99AD-CC5973C5DB52)。

  1. 复制设备 ID。
  2. 在现有的 Adiz 初始化代码中,在执行 Adiz.initialize 之前添加 Adiz.setTestDevice(DEVICE_ID)
  3. 创建 GDPR 同意消息 并重新初始化 Adiz,以确保 GDPR 同意弹出窗口正确出现。
func initialize(_ appId: String) {
// ...
// 在 Adiz.initialize 之前设置 TestDevice。示例 @"B74F6468-1516-467C-99AD-CC5973C5DB52"
Adiz.setTestDevice("B74F6468-1516-467C-99AD-CC5973C5DB52")

// HiveAdiz 初始化
Adiz.initialize(targetViewController) { error, json in
    // ...
}
}
(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) 用户在展示奖励广告(rewardedrewarded 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.InitializeAdizListener 的错误代码和错误消息如下:

常见代码

数字 案例 解释
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同意弹出窗口

广告曝光与终止

要曝光和终止广告,请按照以下步骤操作:

  1. 从广告类创建广告实例,以便为您想要公开的每种广告类型创建实例。如果您想要公开的广告不是默认广告,则需要输入从初始化中获得的广告密钥。如果您不输入广告密钥(hiveAdKey),则会创建一个默认广告实例。
  2. 加载(load())您想要公开的广告。
  3. 显示(show())已加载的广告。要重新公开广告,您必须再次调用load(),然后调用show()
  4. 要终止广告,请调用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

横幅广告展示特定大小的横幅。横幅广告不会接收 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() 来终止广告。 

目前,模板支持smallmedium尺寸。

尺寸点(宽 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