맞춤 이벤트 만들기

맞춤 이벤트를 사용하면 AdMob 미디에이션을 사용하는 게시자가 지원되는 광고 네트워크가 아닌 서드 파티 광고 네트워크에 대한 폭포식 구조 미디에이션을 추가할 수 있습니다. 이 가이드에서는 Unity 프로젝트에서 Android 및 iOS용으로 빌드된 기존 맞춤 이벤트를 사용하는 방법을 설명합니다.

기본 요건

  • 시작하기의 모든 단계를 완료하세요. Unity 앱에 Google 모바일 광고 Unity 플러그인이 있어야 합니다.

  • Android 및 iOS용으로 제작된 맞춤 이벤트 어댑터 맞춤 이벤트 어댑터를 만들려면 AndroidiOS의 맞춤 이벤트 가이드를 참고하세요.

맞춤 이벤트 정의

맞춤 이벤트가 미디에이션에 참여하려면 AdMob 웹 인터페이스에서 맞춤 이벤트를 정의해야 합니다. Android 및 iOS 미디에이션 그룹 모두에 맞춤 이벤트를 추가합니다.

이 스크린샷은 맞춤 이벤트 설정 샘플을 보여줍니다.

매개변수 작성 방법
클래스 이름 (iOS)

iOS의 경우 맞춤 이벤트를 구현하는 클래스의 이름을 입력합니다.

클래스가 Swift로 구현된 경우 클래스 이름 앞에 앱 / 프레임워크 모듈의 이름을 추가해야 합니다 (예: appName.className).

프로젝트에 대상이 여러 개 있거나 프로젝트 이름이 대상 이름과 다른 경우 대상 이름이 필요합니다. 타겟 이름은 appName_targetName.className과 같이 표시됩니다. 또한 영숫자 문자가 아닌 대시 등의 문자는 밑줄로 바꿔야 합니다.

클래스 이름 (Android) Android의 경우 Class Name에 지정하는 값이 Android의 정규화된 클래스 이름 (예: com.google.ads.mediation.sample.customevent.SampleCustomEvent)이어야 합니다.
라벨 이벤트의 고유한 이름을 입력합니다.
매개변수 맞춤 이벤트에 문자열 인수를 전달하려는 경우(예: 광고 단위 ID)

맞춤 이벤트 라이브러리 가져오기

맞춤 이벤트가 제대로 작동하려면 추가 라이브러리를 포함해야 할 수 있습니다. 예를 들어, 다음 라이브러리를 포함해야 할 수 있습니다.

  • Android 서드 파티 SDK
  • Android 서드 파티 맞춤 이벤트
  • iOS용 서드 파티 광고 SDK
  • iOS 서드 파티 맞춤 이벤트

라이브러리 유형

다음과 같은 여러 가지 방법으로 Android 또는 iOS 코드를 Unity 프로젝트로 가져올 수 있습니다.

  • Unity용 외부 종속 항목 관리자를 사용하여 사전 빌드된 Android 또는 iOS 아티팩트 가져오기
  • AAR 플러그인 및 Android 라이브러리 가져오기
  • 자바 및 Kotlin 소스 파일 가져오기
  • iOS 소스 파일 및 정적 라이브러리 가져오기

사용하는 라이브러리의 패키징 방법에 따라 라이브러리마다 다른 가져오기 전략이 필요할 수 있습니다. 각 옵션은 나중에 자세히 설명합니다.

(권장) 사전 빌드된 Android 또는 iOS 아티팩트 가져오기

Unity용 외부 종속 항목 관리자를 사용하여 Maven 또는 CocoaPods에서 사전 빌드된 아티팩트를 가져옵니다. 이 플러그인은 GoogleMobileAds 플러그인에 포함되어 있습니다.

기존 아티팩트를 가져오려면 구성 파일을 만들어 가져오기를 정의합니다. 파일 이름과 경로의 요구사항은 다음과 같습니다.

  • 파일이 /Editor/ 폴더에 있어야 합니다.
  • 파일 이름은 Dependencies.xml로 끝나야 합니다.

예를 들어 AdPub라는 가상의 광고 네트워크에 대한 맞춤 이벤트 어댑터를 가져오려면 파일을 만듭니다.

Assets/AdPub/Editor/AdPubDependencies.xml

다음으로, AdPubDependencies.xml 파일 내에 종속 항목을 정의합니다. 가져오기 구성 규칙은 Unity용 외부 종속 항목 관리자 시작하기에서 확인할 수 있습니다. 다음 코드 스니펫에는 가상의 'AdPub' 광고 네트워크를 위한 Android 및 iOS SDK와 맞춤 이벤트 라이브러리가 포함되어 있습니다.

Assets/AdPub/Editor/AdPubDependencies.xml

<dependencies>
  <androidPackages>
    <androidPackage spec="com.adpub.android:adpub-sdk:1.0.0" />
    <androidPackage spec="com.adpub.android:adpub-custom-event:1.0.0">
      <repositories>
        <repository>https://repo.maven.apache.org/maven2/</repository>
        <repository>https://dl.google.com/dl/android/maven2/</repository>
      </repositories>
    </androidPackage>
  </androidPackages>
  <iosPods>
    <iosPod name="AdPubSDK" version="1.0" />
    <iosPod name="AdPubCustomEvent" version="1.0">
      <sources>
        <source>https://github.com/CocoaPods/Specs</source>
      </sources>
    </iosPod>
  </iosPods>
</dependencies>

맞춤 이벤트 아티팩트에 이미 필수 광고 네트워크 SDK의 종속 항목이 있는 경우 SDK 종속 항목을 명시적으로 정의할 필요가 없습니다.

외부 종속 항목 관리자는 구성 변경을 자동으로 모니터링하고 종속 항목을 해결합니다. 다음 메뉴 명령어를 사용하여 수동 확인을 실행할 수도 있습니다.

Assets > External Dependency Manager > Android Resolver > Force Resolve

AAR 플러그인 및 Android 라이브러리 가져오기

Unity는 *.aar 파일 및 Android 라이브러리 프로젝트 가져오기를 지원합니다. Android 맞춤 이벤트가 이러한 방식으로 패키징된 경우 Unity 프로젝트에 이러한 파일을 포함하는 방법에 관한 안내는 AAR 플러그인 및 Android 라이브러리를 참고하세요.

자바 및 Kotlin 소스 파일 가져오기

Unity 2018.2 이상부터 Android 맞춤 이벤트 코드가 컴파일되지 않은 *.java 또는 *.kt 파일로 구성된 경우 자바 또는 Kotlin 소스 파일을 플러그인으로 사용할 수 있습니다.

iOS 소스 파일 및 정적 라이브러리 가져오기

Unity는 *.framework 아티팩트, *.h, *.m 소스 파일을 지원합니다. iOS 아티팩트 및 소스 파일 가져오기는 Unity 기본 플러그인 가이드에 설명되어 있습니다.

광고 검사기를 사용하여 맞춤 이벤트 테스트하기

광고 검사기를 사용하면 맞춤 이벤트를 애플리케이션으로 올바르게 가져왔는지 테스트할 수 있습니다. 광고 검사기는 최소한의 코드로 동작만으로 또는 프로그래매틱 방식으로 열 수 있습니다.

(선택사항) C# 스크립트에서 서드 파티 SDK 네이티브 메서드 호출

서드 파티 광고 네트워크 SDK에는 Android 또는 iOS 메서드를 직접 호출해야 하는 특별한 요구사항이 있을 수 있습니다. 이러한 메서드를 직접 호출하는 프로세스는 다음과 같습니다.

  1. 플랫폼 클라이언트의 공통 인터페이스 정의
  2. 지원되지 않는 플랫폼의 기본 클라이언트 구현
  3. Android 메서드 호출을 위한 Android 클라이언트 구현
  4. iOS 메서드 호출을 위한 iOS 클라이언트 구현
  5. 클라이언트 팩토리를 구현하여 iOS와 Android 클라이언트 간 조건부 전환
  6. 모든 서드 파티 광고 네트워크 SDK 기능에 액세스하기 위한 API 정의

다음 섹션에서는 Android 및 iOS에서 메서드를 호출할 수 있는 C# API에서 'AdPub'이라는 가상의 광고 네트워크에 이러한 단계를 구현하는 방법을 보여줍니다.

Android

package com.adpub.android;

public class AdPubSdk
{
    public static void setHasUserConsent(boolean hasUserConsent);
}

iOS

@interface AdPubSdk : NSObject
+ (void)setHasUserConsent:(BOOL)hasUserConsent;
@end

플랫폼 클라이언트의 공통 인터페이스 정의

기본 Android 및 iOS API를 나타내는 메서드로 IAdPubClient 인터페이스를 만듭니다.

Assets/AdPub/Common/IAdPubClient.cs

namespace AdPub.Common
{
    public interface IAdPubClient
    {
        ///<summary>
        /// Sets a flag indicating if the app has user consent for advertisement.
        ///</summary>
        void SetHasUserConsent(bool hasUserConsent);
    }
}

지원되지 않는 플랫폼의 기본 클라이언트 정의

메서드 이름만 기록하는 IAdPubClient 인터페이스를 구현하는 DefaultClient 클래스를 만듭니다. Unity 편집기와 Android 또는 iOS 이외의 모든 플랫폼에 이 구현을 사용하세요.

Assets/AdPub/Common/DefaultClient.cs

namespace AdPub.Common
{
    public class DefaultClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
            Debug.Log("SetHasUserConsent was called.");
        }
    }
}

iOS 플랫폼 클라이언트 구현

iOS에서 IAdPubClient 인터페이스를 구현하는 iOSAdPubClient 클래스를 만듭니다. 이 구현은 InteropServices를 사용하여 iOS AdPubSdk 클래스의 setHasUserConsent() 메서드를 호출합니다.

Assets/AdPub/Platforms/iOS/iOSAdPubClient.cs

// Wrap this class in a conditional operator to make sure it only runs on iOS.
#if UNITY_IOS

// Reference InteropServices to include the DLLImportAttribute type.
using System.Runtime.InteropServices;

using AdPub.Common;

namespace AdPub.Platforms.Android
{
    public class iOSAdPubClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
            GADUAdPubSetHasUserConsent(hasUserConsent);
        }

        [DllImport("__Internal")]
        internal static extern void GADUAdPubSetHasUserConsent(bool hasUserConsent);
    }
}
#endif

그런 다음 위에서 정의한 GADUAdPubSetHasUserConsent() 메서드를 구현합니다. C 메서드 GADUAdPubSetHasUserConsent()AdPubClientBridge.m를 만들어 Unity의 메서드 호출을 처리하고 AdPubSDK를 호출합니다.

AdPubClientBridge는 iOS 소스 파일이며 Unity 네이티브 플러그인 가이드에 설명된 대로 Plugins/iOS 폴더 내에 있어야 합니다.

Assets/AdPub/Plugins/iOS/AdPubClientBridge.m

#import <AdPubSDK/AdPubSDK.h>

void GADUAdPubSetHasUserConsent(BOOL hasUserConsent) {
  [AdPubSDK setHasUserConsent:hasUserConsent];
}

Android 플랫폼 클라이언트 구현

Android에서 IAdPubClient 인터페이스를 구현하는 AndroidAdPubCient 클래스를 만듭니다. 이 구현은 Android 자바 도우미 클래스를 사용하여 Android 정적 메서드 setHasUserConsent()를 호출합니다.

Android 자바 도우미 클래스는 Android 런타임 중에만 사용할 수 있으므로 코드 스니펫과 같이 UNITY_ANDROID 컴파일러 지시어를 사용하여 컴파일 오류를 방지할 수 있습니다. 또는 Unity 2017.4 이상에서 어셈블리 정의를 사용하여 이 문제를 해결할 수 있습니다.

Assets/AdPub/Platforms/Android/AndroidAdPubClient.cs

// Wrap this class in a conditional operator to make sure it only runs on Android.
#if UNITY_ANDROID

// Reference the UnityEngine namespace which contains the JNI Helper classes.
using UnityEngine;

using AdPub.Common;

namespace AdPub.Platforms.Android
{
    public class AndroidAdPubClient : IAdPubClient
    {
        public void SetHasUserConsent(bool hasUserConsent)
        {
             // Make a reference to the com.adpub.AdPubSDK.
            AndroidJavaClass adPubSdk = new AndroidJavaClass("com.adpub.AdPubSdk");

            // Call the native setHasUserConsent method of com.adpub.AdPubSDK.
            adPubSdk.CallStatic("setHasUserConsent", hasUserConsent);
        }
    }
}
#endif

팩토리 메서드를 만들어 올바른 클라이언트 구현 반환

이제 모든 플랫폼에 클라이언트가 구현되었으므로 AdPubClientFactory 클래스를 만들어 런타임 플랫폼에 따라 IAdPubClient 인터페이스의 올바른 구현을 반환합니다. 이 클래스는 컴파일러 지시어를 사용하여 올바른 IAdPubClient 클라이언트를 반환합니다.

Assets/AdPub/Common/AdPubClientFactory.cs

namespace AdPub.Common
{
    public class AdPubClientFactory
    {
        // Return the correct platform client.
        public static IAdPubClient GetClient()
        {
#if   !UNITY_EDITOR && UNITY_ANDROID
            return new AdPub.Platforms.Android.AndroidAdPubClient();
#elif !UNITY_EDITOR && UNITY_IOS
            return new AdPub.Platforms.iOS.iOSAdPubClient();
#else
            // Returned for the Unity Editor and unsupported platforms.
            return new DefaultClient();
#endif
        }
    }
}

각 인터페이스 메서드의 공개 API 정의

IAdPubClient 인터페이스에서 각 클라이언트 메서드에 대한 메서드 호출이 있는 AdPubApi 클래스를 만듭니다. 이 클래스는 AdPubClientFactory를 사용하여 IAdPubClient의 인스턴스를 가져오고 기본 SDK 기능을 위해 이 클라이언트를 호출합니다.

Assets/AdPub/AdPubApi.cs

using AdPub.Common;

namespace AdPub
{
    public class AdPubApi
    {
        private static readonly IAdPubClient client = GetAdPubClient();

        // Returns the correct client for the current runtime platform.
        private static IAdPubClient GetAdPubClient()
        {
            return AdPubClientFactory.GetClient();
        }

        // Sets the user consent using the underlying SDK functionality.
        public static void SetHasUserConsent(bool hasUserConsent)
        {
            client.SetHasUserConsent(hasUserConsent);
        }
    }
}

새로 정의된 API 호출

위에서 정의한 API를 호출하는 방법은 다음과 같습니다.

Assets/Scripts/AdPubController.cs

using UnityEngine;
using AdPub;

public class AdPubController : MonoBehaviour
{
    // TODO: Get consent from the user and update this userConsent field.
    public bool userConsent;

    // Called on startup of the GameObject it's assigned to.
    public void Start()
    {
        // Pass the user consent to AdPub.
        AdPubApi.SetHasUserConsent(userConsent);
    }
}

서드 파티 광고 네트워크 어댑터의 추가적인 예

iOS 및 Android 메서드 호출을 래핑하기 위해 C# API를 구현하는 서드 파티 미디에이션 어댑터의 추가 예를 보려면 Google 모바일 광고 Unity 플러그인 GitHub 저장소를 방문하세요.