跳转至

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 项目时,会生成作为 DynamicFramework 运行的 UnityFramewok 目标。

  1. EDM4U 设置 (1.2.179 版本) 在 Unity 的 iOS Resolver Settings(菜单: Assets > External Dependency Manager > iOS Resolver > Settings)中确认是否已设置 static_framework 构建设置。

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

    (string Name, string Source)[] dynamicFrameworks = {
            // ("AdFitSDK.framework","Pods/AdFitSDK/Frameworks"),
            // ("AdPopcornSSP.xcframework", "Pods/AdPopcornSSP"), 
            // ("AppLovinSDK.xcframework", "Pods/AppLovinSDK/applovin-ios-sdk-13.0.0"),
            // ("BidmadSDK.xcframework", "Pods/BidmadSDK"),
            // ("NaverAdsServices.xcframework", "Pods/Naver-Ads-Services/NaverAdsServices/xcframework"), 
            ("OMSDK_Navercorp.xcframework","Pods/NAMSDK/NAMSDK/xcframework/libraries"),
            ("OMSDK_Pubmatic.xcframework","Pods/OpenWrapSDK/OpenWrapSDK"),
            // ("OMSDK_Teadstv.xcframework", "Pods/TeadsSDK/Frameworks"), 
            // ("TeadsSDK.xcframework", "Pods/TeadsSDK/Frameworks"), 
    };
    

    取消注释仅在检查static_framework并构建时进行。使用动态框架时,取消注释以激活上述代码可能会导致冲突。

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

    source 'https://github.com/Com2uSPlatformCorp/HiveAdKit-iOS.git'
    source 'https://cdn.cocoapods.org/'
    
    平台 :ios, '12.0'
    
    target 'UnityFramework' do
        pod 'BidmadAdFitAdapter', '3.12.7.10.0'
        pod 'BidmadAdpieAdapter', '1.6.1.10.0'
        pod 'BidmadAdPopcornAdapter', '2.6.5.10.0'
        pod 'BidmadAppLovinAdapter', '13.0.0.10.0'
        pod 'BidmadAtomAdapter', '1.0.0.10.0'
        pod 'BidmadFyberAdapter', '8.3.2.10.0'
        pod 'BidmadGoogleAdManagerAdapter', '11.10.0.10.0'
        pod 'BidmadGoogleAdMobAdapter', '11.10.0.10.0'
        pod 'BidmadIronSourceAdapter', '8.3.0.0.10.0'
        pod 'BidmadPangleAdapter', '6.2.0.7.10.0'
        pod 'BidmadPartners/AdMobBidding', '1.0.5'
        pod 'BidmadPubmaticAdapter', '3.2.0.10.0'
        pod 'BidmadSDK', '6.11.0'
        pod 'BidmadTeadsAdapter', '5.0.27.10.0'
        pod 'BidmadUnityAdsAdapter', '4.12.3.10.0'
        pod 'BidmadVungleAdapter', '7.4.1.10.0'
        pod 'HiveAdKit_ADOP_PrivacyInfo', '1.5.1'
        pod 'OpenBiddingHelper', '6.11.0'
    end
    target 'Unity-iPhone' do
    end
    use_frameworks! 
    
  4. 执行 pod install 后打开工作区进行 Xcode 设置。检查 General 标签时,所需的动态框架会自动嵌入,如下所示。

Note

[关于Facebook SDK发布的相关问题]
Facebook SDK仅以DynamicFramework方式提供,而广告模块仅提供StaticFramework,但Podfile的设置仅支持这两种方式中的一种。因此,在Unity中构建时,为了应用Facebook,需要根据以下方法进行额外设置,以解决Facebook SDK和广告模块之间的冲突。
在Xcode构建的主目标中添加额外的库依赖。


将FBSDKAMKit、FBSDKCoreKit_Baseic、FBSDKCoreKit、FBSDKLoginKit、FBSDKShareKit框架添加为DynamicFramework。

???+ 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_示例