跳转至

Unity

Hive AdKit for ADOP: Unity

Hive AdKit for ADOP(以下简称 AdKit for ADOP)使用 ADOP 的 API,并根据 ADOP 开发指南进行开发。与 Hive SDK 或单独模块一起使用 AdKit for ADOP 时,日志将被发送到分析服务器,从而省略单独的广告分析工作。 本指南是为 Hive SDK 用户编写的 AdKit for ADOP 应用指南,旨在修复在应用 ADOP 提供的 Unity 包过程中出现的错误,并减少试错,以提高使用的便利性。了解支持 AdKit for ADOP 的版本和应用方法。

安装

  1. 下载并安装 AdKit for ADOP 的最新版本。
  2. 在 Unity 工具栏中选择 Assets > Import Package > Custom Package...,然后选择 .unitypackage 文件并点击 Import
  3. 导入完成后,请确认在 Assets 文件夹下生成了 Hive AdKit 及 ADOP 相关文件和文件夹。
  4. 下载并安装EDM4U的最新版本。
    • Hive SDK v4包含EDM4U。如果您使用的是Hive SDK v4,请跳过此步骤。
Warning

在进行 AdKit 测试时,务必应用 测试 广告密钥。

更新

请删除正在使用的 AdKit,并安装最新版本以进行更新。

设置

请根据以下操作系统指南设置 AdKit。

  • Android
    在 Unity 项目中创建的 Assets/Plugins/Android/AndroidManifest.xml 文件中添加 ca-app-pub-XXXXX~YYYYY 格式的 `AdMobId` 值。
    <application>
        <!-- AdKit -->
        <meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="ca-app-pub-XXXXX~YYYYY"/>
        <meta-data android:name="com.google.android.gms.ads.AD_MANAGER_APP" android:value="true" />
        <!-- AdKit -->
        </application>
    
  • iOS
    在 Unity 构建时生成的 Xcode 项目的 Info.plist 文件中添加 GADApplicationIdentifier,并将格式为 ca-app-pub-XXXXX~YYYYY 的 AdMobId 值输入为 String 类型。
    <key>GADApplicationIdentifier</key>
    <string>ca-app-pub-XXXXX~YYYYY</string>
    
    iOS 14 及以上请将 ADOP 的 SKAdNetwork 列表 添加到 Info.plist 文件中。 (使用 Assets/Bidmad/Editor/BidmadPostProcessBuild.cs 文件在构建时自动添加。)

应用

iOS

当构建iOS项目时,会创建一个名为UnityFramewok的目标,该目标作为DynamicFramework运行。

  1. EDM4U 设置(基于 1.2.179)
    检查 Unity 的 iOS Resolver Settings 中是否配置了 static_framework 构建设置(菜单:Assets > External Dependency Manager > iOS Resolver > Settings)。

Assets/HIVEAdKit/Editor/AdKitPostprocess.cs文件中,取消注释dynamicFramework导入。注释位置如下。

```cs
(string Name, string Source)[] dynamicFrameworks = {
        // ("AdFitSDK.framework","Pods/AdFitSDK/Frameworks"),
        // ("AdMixer.xcframework","Pods/AdMixer"),
        // ("AdMixerMediation.xcframework", "Pods/AdMixerMediation"), 
        ("BidmadAppLovinAdapter.xcframework", "Pods/BidmadAppLovinAdapter"),
        // ("BidmadMobwithAdapter.xcframework", "Pods/BidmadMobwithAdapter"),
        // ("BidmadORTBAdapter.xcframework", "Pods/BidmadORTBAdapter"),
        // ("BidmadSDK.xcframework", "Pods/BidmadSDK"),
        ("OpenBiddingHelper.xcframework","Pods/OpenBiddingHelper"),
        // ("TaboolaSDK.xcframework","Pods/TaboolaSDK"),
        // ("AppLovinSDK.xcframework", "Pods/AppLovinSDK/applovin-ios-sdk-13.3.1"),
        // ("OMSDK_Teadstv.xcframework", "Pods/TeadsSDK/Frameworks"), 
        // ("TeadsSDK.xcframework", "Pods/TeadsSDK/Frameworks"), 
};

```

取消注释仅在检查static_framework和构建时进行。如果在使用动态框架时取消注释以激活上述代码,可能会发生崩溃。

  1. 构建项目。构建完成后,打开生成的项目根路径中的Podfile以检查文件设置。

    source 'https://github.com/Com2uSPlatformCorp/HiveAdKit-iOS.git'
    source 'https://cdn.cocoapods.org/'
    
    platform :ios, '13.0'
    
    target 'UnityFramework' do
      pod 'BidmadAdFitAdapter', '3.12.7.11.0'
      pod 'BidmadAdmixerAdapter', '2.0.2.11.1'
      pod 'BidmadAppLovinAdapter', '13.3.1.11.0'
      pod 'BidmadFyberAdapter', '8.3.7.11.0'
      pod 'BidmadGoogleAdManagerAdapter', '12.6.0.11.0'
      pod 'BidmadGoogleAdMobAdapter', '12.6.0.11.0'
      pod 'BidmadMobwithAdapter', '1.0.0.11.2'
      pod 'BidmadORTBAdapter', '1.0.0.11.2'
      pod 'BidmadPangleAdapter', '7.2.0.5.11.0'
      pod 'BidmadPartners/AdMobBidding', '1.0.7'
      pod 'BidmadSDK', '6.12.4'
      pod 'BidmadTaboolaAdapter', '3.8.33.11.2'
      pod 'BidmadTeadsAdapter', '5.2.0.11.2'
      pod 'BidmadUnityAdsAdapter', '4.15.0.11.0'
      pod 'BidmadVungleAdapter', '7.5.1.11.0'
      pod 'HiveAdKit_ADOP_PrivacyInfo', '1.5.3'
      pod 'OpenBiddingHelper', '6.12.3'
    end
    target 'Unity-iPhone' do
    end
    use_frameworks! :linkage => :static
    

在运行 pod install 后,打开工作区并继续进行 Xcode 设置。当检查常规选项卡时,必要的动态框架会自动嵌入,如下所示。

Note

[与 Facebook SDK 分发相关的问题]
Facebook SDK 仅以 DynamicFramework 格式提供,而广告模块仅以 StaticFramework 格式提供。然而,Podfile 设置只支持这两种方法中的一种。因此,在 Unity 中构建时,为了解决 Facebook SDK 和广告模块之间的冲突,必须根据下面的方法配置额外的设置。
将额外的库依赖项添加到 Xcode 构建的主目标中。


将 FBSDKAMKit、FBSDKCoreKit_Baseic、FBSDKCoreKit、FBSDKLoginKit 和 FBSDKShareKit 框架添加为动态框架。

???+ note 要获取在分发应用程序时填写个人信息调查表所需的信息,请参考隐私调查指南

ADOP Proguard 设置

如果您正在使用Proguard,则需要添加以下ADOP Proguard设置。

  -keep class com.adop.sdk.** { *; }
  -keep class ad.helper.openbidding.** { *; }
  -keep class com.adop.sdk.adapter.**{ *; }
  -keepnames class * implements java.io.Serializable
  -keepclassmembers class * implements java.io.Serializable {
      static final long serialVersionUID;
      private static final java.io.ObjectStreamField[] serialPersistentFields;
      !static !transient <fields>;
      private void writeObject(java.io.ObjectOutputStream);
      private void readObject(java.io.ObjectInputStream);
      java.lang.Object writeReplace();
      java.lang.Object readResolve();
  }
  -keepclassmembers class * {
      @android.webkit.JavascriptInterface <methods>;
  }

  # Pangle
  -keep class com.bytedance.sdk.** { *; }
  -keep class com.bykv.vk.openvk.component.video.api.** { *; }

  # Tapjoy
  -keep class com.tapjoy.** { *; }
  -keep class com.moat.** { *; }
  -keepattributes JavascriptInterface
  -keepattributes *Annotation*
  -keep class * extends java.util.ListResourceBundle {
  protected Object[][] getContents();
  }
  -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
  public static final *** NULL;
  }
  -keepnames @com.google.android.gms.common.annotation.KeepName class *
  -keepclassmembernames class * {
  @com.google.android.gms.common.annotation.KeepName *;
  }
  -keepnames class * implements android.os.Parcelable {
  public static final ** CREATOR;
  }
  -keep class com.google.android.gms.ads.identifier.** { *; }
  -dontwarn com.tapjoy.**

ADOP 测试广告密钥

必须使用 ADOP 颁发的广告密钥。

    // ANDROID 환경
    public static string adopAppDomain =                    "common-serving-bidmad.adop.co.kr";
    public static string rewardVideoUnitId =                "7d9a2c9e-5755-4022-85f1-6d4fc79e4418";
    public static string InterstitialAdUnitId =             "e9acd7fc-a962-40e4-aaad-9feab1b4f821";
    public static string AdaptiveBannerAdUnitId =           "944fe870-fa3a-4d1b-9cc2-38e50b2aed43";

    // IOS 환경
    public static string adopAppDomain =                    "common-serving-bidmad.adop.co.kr";
    public static string rewardVideoUnitId =                "29e1ef67-98d2-47b3-9fa2-9192327dd75d";
    public static string InterstitialAdUnitId =             "228b95a9-6f42-46d8-a40d-60f17f751eb1";
    public static string AdaptiveBannerAdUnitId =           "1c3e3085-333f-45af-8427-2810c26a72fc";

    // 기타 환경 (모바일이 아닌 환경은 미지원)
    public static string adopAppDomain = "NotSuport";
    public static string rewardVideoUnitId = "NotSuport";
    public static string InterstitialAdUnitId = "NotSuport";
    public static string AdaptiveBannerAdUnitId = "NotSuport";

Hive AdKit 初始化

要初始化 ADOP 广告,必须发放 adopAppDomain。发放的 adopAppDomain 必须作为 ADOP 广告初始化方法的参数使用。

Warning

从 AdKit 1.5.1 版本开始,之前使用的 AppKey 已更改为 AppDomain。AppDomain 与现有 AppKey 不兼容,因此为了初始化 Hive AdKit,您需要重新申请 AppDomain。 有关 AppDomain 的信息,请联系 TechLabs 平台业务部运营团队。

Note

在执行初始化时,如果是欧洲和英国(EEA & UK)地区,将自动显示GDPR同意弹窗。在其他地区将直接执行初始化。

Warning

如果使用Hive SDK,则必须在完成Hive AdKit初始化后执行AuthV4.setup。如果在显示ATT(应用追踪透明度)同意通知后出现GDPR同意屏幕,则应用可能会在Apple应用审核中被拒绝。

  • 如果游戏针对欧洲和英国(EEA & UK)地区,请确保GDPR同意弹窗符合GDPR消息编写指南的要求。
  • // 상용 배포시
    HIVEAdKit.InitializeWithShowGDPRConsent(adopAppDomain, false, null, consentState => {
        /* 
        동의 = 1, 비동의 = 0, 알수없음 = -1, 필요없음 = -2
        초기화 완료 콜백으로 GDPR 동의 상태 결과 값 consentState가 전달됩니다. 결과값에 따른 별도 처리가 필요하지 않습니다. 
        */
        Debug.Log(TAG + "::InitializeWithShowGDPRConsent consentState : " + consentState);
    });
    
    // GDPR 테스트 사용시
    HIVEAdKit.GDPR.Reset();
    HIVEAdKit.InitializeWithShowGDPRConsent(adopAppDomain, true, testDeviceId, consentState => {
        /* 
        동의 = 1, 비동의 = 0, 알수없음 = -1, 필요없음 = -2
        초기화 완료 콜백으로 GDPR 동의 상태 결과 값 consentState가 전달됩니다. 결과값에 따른 별도 처리가 필요하지 않습니다. 
        */
        Debug.Log(TAG + "::InitializeWithShowGDPRConsent consentState : " + consentState);
    });
    

使用回调

要使用回调,必须将BidmadManager注册为GameObject。

GameObject bidmadManager = new GameObject("BidmadManager");
bidmadManager.AddComponent<BidmadManager>();
DontDestroyOnLoad(bidmadManager);

附加信息设置功能

// GameData 示例
[Serializable]
public class SendInfo 
{
    public int level;
    public int gold;
}
SendInfo addtionalInfo = new SendInfo();
addtionalInfo.level = 1;
addtionalInfo.gold = 100;

// 以 JSON 对象形式发送
HIVEAdKit.SetAdditionalInfo(JsonUtility.ToJson(addtionalInfo));

奖励类型广告

这是在观看广告超过一定时间后给予奖励的奖励型广告。一次只能加载一个广告。

    // Set Event Callback
    EventHandlers eventHandlers = new EventHandlers.Builder()
                                                   .OnAdLoaded(OnAdLoadedCB)
                                                   .OnAdOpening(OnAdOpeningCB)
                                                   .OnAdClosed(OnAdClosedCB)
                                                   .OnAdFailed(OnAdFailedCB)
                                                   .OnAdReward(OnAdRewardCB)
                                                   .Build();
    
    // Create RewardVideoAd Instance
    RewardVideoAd = HIVEAdKit.RewardVideo.Initialize(rewardVideoUnitId, eventHandlers);
    
    // Load RewardVideoAd
    HIVEAdKit.RewardVideo.LoadAd(RewardVideoAd, "Unity-RewardVideo-Load-AdPlacementInfo");
    
    // Show RewardVideoAd
    if( HIVEAdKit.RewardVideo.IsLoaded(RewardVideoAd) ) {
       HIVEAdKit.RewardVideo.Show(RewardVideoAd, "Unity-RewardVideo-Show-AdPlacementInfo");
    }
    

插屏广告

占据整个屏幕的全屏广告。

    // Set Event Callback
    EventHandlers eventHandlers = new EventHandlers.Builder()
                                                   .OnAdLoaded(OnAdLoadedCB)
                                                   .OnAdOpening(OnAdOpeningCB)
                                                   .OnAdClosed(OnAdClosedCB)
                                                   .OnAdFailed(OnAdFailedCB)
                                                   .OnAdClick(OnAdClickCB)
                                                   .Build();
    
    // Create InterstitialAd Instance                                               
    InterstitialAd = HIVEAdKit.Interstitial.Initialize(InterstitialAdUnitId, eventHandlers);
    
    // Load InterstitialAd
    HIVEAdKit.Interstitial.LoadAd(InterstitialAd, "Unity-Interstitial-Load-AdPlacementInfo");
    
    // Show InterstitialAd
    if( HIVEAdKit.Interstitial.IsLoaded(InterstitialAd) ) {
       HIVEAdKit.Interstitial.Show(InterstitialAd, "Unity-Interstitial-Show-AdPlacementInfo");
    }
    

自适应横幅类型广告

这是一个占据屏幕部分的滚动横幅。可以通过输入 BannerPosition 值或特定的 yPos 值来调整横幅位置。 当输入 yPos 值调整横幅位置时,横幅位置会在底部对齐状态下向上移动指定的 yPos 值。

// BannerPosition을 사용하는 예제입니다.
// Set Event Callback
EventHandlers eventHandlers = new EventHandlers.Builder()
                                               .OnAdLoaded(OnAdLoadedCB)
                                               .OnAdClosed(OnAdClosedCB)
                                               .OnAdFailed(OnAdFailedCB)
                                               .OnAdClick(OnAdClickCB)
                                               .Build();

// Create AdaptiveBanner Instance at Top of View
AdaptiveBannerAd = HIVEAdKit.AdaptiveBanner.Initialize(AdaptiveBannerAdUnitId, HIVEAdKit.AdaptiveBanner.BannerPosition.Top, eventHandlers);

// Create AdaptiveBanner Instance at Bottom of View
AdaptiveBannerAd = HIVEAdKit.AdaptiveBanner.Initialize(AdaptiveBannerAdUnitId, HIVEAdKit.AdaptiveBanner.BannerPosition.Bottom, eventHandlers);

// Automatic Load & Show AdaptiveBanner
HIVEAdKit.AdaptiveBanner.LoadAd(AdaptiveBannerAd, "Unity-AdaptiveBanner-Load-AdPlacementInfo");

// Destroy AdaptiveBanner
HIVEAdKit.AdaptiveBanner.Destroy(AdaptiveBannerAd);


// yPos 값을 지정하여 사용하는 예제입니다.
// Set Event Callback
EventHandlers eventHandlers = new EventHandlers.Builder()
                                               .OnAdLoaded(OnAdLoadedCB)
                                               .OnAdClosed(OnAdClosedCB)
                                               .OnAdFailed(OnAdFailedCB)
                                               .OnAdClick(OnAdClickCB)
                                               .Build();

// Set yPos
var yPos  = 100;
AdaptiveBannerAd = HIVEAdKit.AdaptiveBanner.Initialize(AdaptiveBannerAdUnitId, yPos, eventHandlers);

// Automatic Load & Show AdaptiveBanner
HIVEAdKit.AdaptiveBanner.LoadAd(AdaptiveBannerAd, "Unity-AdaptiveBanner-Load-AdPlacementInfo");

// Destroy AdaptiveBanner
HIVEAdKit.AdaptiveBanner.Destroy(AdaptiveBannerAd);


测试广告

在开发过程中,重要的是设置测试广告,即使点击测试广告也不会向广告主收费。如果在非测试模式下过多点击广告,将被视为无效活动,这可能导致该账户被举报,请注意。有关测试广告的使用方法,可以在Google 开发者网站上查看。

删除

Hive 要删除 AdKit for ADOP,请删除以下列表中的 Unity 项目内的文件夹。

    • 资产/Bidmad
    • 资产/HIVEAdKit
    • 资产/HIVEAdKit_示例