Unity
Hive AdKit for ADOP: Unity¶
Hive AdKit for ADOP (이하 AdKit for ADOP)는 ADOP의 API를 사용하며 ADOP 개발 가이드에 따라 개발되었습니다. AdKit for ADOP를 Hive SDK, 또는 개별 모듈과 함께 사용하면 애널리틱스 서버로 로그가 전송되어 별도의 광고 분석 작업을 생략할 수 있습니다. 이 가이드는 Hive SDK 사용자가 ADOP에서 제공하는 Unity 패키지를 적용하는 과정에 발생하는 오류를 수정하고 시행착오를 줄여 사용의 편의를 돕기 위해 작성된 AdKit for ADOP 적용 가이드입니다. AdKit for ADOP를 지원하는 버전과 적용 방법에 대해 알아보세요.
설치¶
- AdKit for ADOP 최신 버전을 다운로드 하고 설치하세요.
- Unity 툴바의 Assets > Import Package > Custom Package...에서 .unitypackage 파일을 선택하고 Import를 클릭하세요.
- Import 완료 후 Assets 폴더 하위에 Hive AdKit 및 ADOP 관련 파일과 폴더가 생성되었는지 확인하세요.
- 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` 값을 추가하세요. - iOS
Unity 빌드 시 생성된 Xcode 프로젝트의 Info.plist 파일에GADApplicationIdentifier
를 추가하고, ca-app-pub-XXXXX~YYYYY 형식의 AdMobId 값을 String 타입으로 입력하세요. iOS 14 이상에서는 ADOP의 SKAdNetwork 목록을 Info.plist 파일에 추가하세요. (Assets/Bidmad/Editor/BidmadPostProcessBuild.cs 파일 사용하여 빌드 시 자동 추가됩니다.)
적용하기¶
iOS¶
iOS 프로젝트 빌드 시 DynamicFramework로 동작하는 UnityFramewok 타겟이 생성됩니다.
-
EDM4U 설정 (1.2.179 기준) Unity의 iOS Resolver Settings(메뉴: Assets > External Dependency Manager > iOS Resolver > Settings)에서 static_framework 빌드 설정이 되어있는지 확인합니다.
-
Assets/HIVEAdKit/Editor/AdKitPostprocess.cs 파일에서
dynamicFramework
Import 주석을 해제합니다. 주석 위치는 아래와 같습니다.(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를 체크하고 빌드할 때에만 진행합니다. Dynamic Framework 사용 시 주석을 해제해 위 코드를 활성화하면 충돌이 발생할 수 있습니다.
-
프로젝트를 빌드합니다. 빌드 완료 후, 생성된 프로젝트 루트 경로에서 Podfil을 열어 파일 설정을 확인합니다.
source 'https://github.com/Com2uSPlatformCorp/HiveAdKit-iOS.git' source 'https://cdn.cocoapods.org/' platform :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!
-
pod install
실행 후 워크스페이스를 열어 Xcode 설정을 진행합니다. General 탭을 확인 시 필요한 Dynamic Framework가 아래와 같이 자동으로 임베딩되어 있습니다.
Note
[Facebook SDK 배포 관련 이슈]
Facebook SDK는 DynamicFramework 방식으로만 제공하고 광고모듈은 StaticFramework만 제공하고 있으나, Podfile의 설정은 두 방식 중 하나만 지원합니다. 이에 따라, Unity에서 빌드 시 Facebook을 적용하려면 아래의 방법에 따라 추가 설정하여 Facebook SDK와 광고모듈의 충돌을 해결해야 합니다.
Xcode 빌드의 메인 타겟에 추가 라이브러리 종속성을 추가합니다.
FBSDKAMKit, FBSDKCoreKit_Baseic, FBSDKCoreKit, FBSDKLoginKit, FBSDKShareKit 프레임워크를 DynamicFramework로 추가합니다.
???+ note 앱 배포 시 개인정보 설문 양식을 작성하기 위한 정보를 얻으려면 Privacy Survey 가이드를 참고하세요.
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에 관한 정보는 테크랩스 플랫폼 사업부 운영팀에 문의 바랍니다.
Note
초기화 수행시 유럽 및 영국(EEA & UK) 지역인 경우 GDPR 동의 팝업이 자동으로 노출됩니다. 그 외 지역에서는 초기화를 바로수행합니다.
Warning
Hive SDK를 사용한다면 Hive AdKit 초기화를 완료한 후에 AuthV4.setup
을 실행해야 합니다. ATT(APP Tracking Transparency) 동의 알림을 노출한 후에 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);
});
Callback 사용하기¶
Callback을 사용하기 위해서는 BidmadManager를 GameObject로 등록해야 합니다.
GameObject bidmadManager = new GameObject("BidmadManager");
bidmadManager.AddComponent<BidmadManager>();
DontDestroyOnLoad(bidmadManager);
부가정보 설정기능¶
// GameData Example
[Serializable]
public class SendInfo
{
public int level;
public int gold;
}
SendInfo addtionalInfo = new SendInfo();
addtionalInfo.level = 1;
addtionalInfo.gold = 100;
// JSON Obejct 형태로 전송
HIVEAdKit.SetAdditionalInfo(JsonUtility.ToJson(addtionalInfo));
Rewarded 타입 광고¶
일정 시간 이상 광고 시청 시 보상이 주어지는 보상형 광고입니다. 한 번에 하나의 광고만 로드할 수 있습니다.
// 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");
}
Interstitial 타입 광고¶
화면 전체를 차지하는 전면 광고입니다.
// 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");
}
Adaptive Banner 타입 광고¶
화면의 일부를 차지하는 롤링 배너입니다. BannerPosition값 또는 특정 yPos값을 입력하여 배너 위치를 조정할 수 있습니다. yPos값을 입력해 배너 위치를 조정할 때, 배너 위치는 Bottom 정렬 상태에서 지정한 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 프로젝트 내 폴더를 삭제하세요.
-
- Assets/Bidmad
- Assets/HIVEAdKit
- Assets/HIVEAdKit_Example