기본 요건
맞춤 이벤트 설정을 완료합니다.
네이티브 광고 요청
폭포식 구조 미디에이션 체인에서 맞춤 이벤트 광고 항목에 도달하면
loadNativeAd()
메서드는 다음 경우에 제공한 클래스 이름에서 호출됩니다.
맞춤 만들기
이벤트를 사용합니다. 이 경우
이 메서드는 SampleCustomEvent
에 있으며 이 메서드는 다음을 호출합니다.
SampleNativeCustomEventLoader
의 loadNativeAd()
메서드
네이티브 광고를 요청하려면 Adapter
를 확장하는 클래스를 만들거나 수정하여
loadNativeAd()
를 구현합니다. Adapter
를 확장하는 클래스가 이미 있는 경우
거기에 loadNativeAd()
를 구현합니다. 또한 구현할 새 클래스를 만듭니다.
UnifiedNativeAdMapper
맞춤 이벤트 예에서는
SampleCustomEvent
는 Adapter
클래스를 확장한 다음
SampleNativeCustomEventLoader
입니다.
자바
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.Adapter; import com.google.android.gms.ads.mediation.MediationAdConfiguration; import com.google.android.gms.ads.mediation.MediationAdLoadCallback; import com.google.android.gms.ads.mediation.MediationNativeAdCallback; ... public class SampleCustomEvent extends Adapter { private SampleNativeCustomEventLoader nativeLoader; @Override public void loadNativeAd( @NonNull MediationNativeAdConfiguration adConfiguration, @NonNull MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> callback) { nativeLoader = new SampleNativeCustomEventLoader(adConfiguration, callback); nativeLoader.loadAd(); } }
SampleNativeCustomEventLoader
는 다음 작업을 담당합니다.
네이티브 광고 로드
UnifiedNativeAdMapper
클래스 구현Google 모바일 광고 SDK에 광고 이벤트 콜백을 수신하고 보고합니다.
Ad Manager UI에 정의된 선택적 매개변수는
포함되어 있습니다. 매개변수는
adConfiguration.getServerParameters().getString(MediationConfiguration.CUSTOM_EVENT_SERVER_PARAMETER_FIELD)
이 매개변수는 일반적으로 광고 네트워크 SDK가
를 사용해야 합니다.
자바
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.Adapter; import com.google.android.gms.ads.mediation.MediationNativeAdConfiguration; import com.google.android.gms.ads.mediation.MediationAdLoadCallback; import com.google.android.gms.ads.mediation.MediationNativeAdCallback; ... public class SampleNativeCustomEventLoader extends SampleNativeAdListener { /** Configuration for requesting the native ad from the third-party network. */ private final MediationNativeAdConfiguration mediationNativeAdConfiguration; /** Callback that fires on loading success or failure. */ private final MediationAdLoadCallback<UnifiedNativeAdMapper, MediationNativeAdCallback> mediationAdLoadCallback; /** Callback for native ad events. */ private MediationNativeAdCallback nativeAdCallback; /** Constructor */ public SampleNativeCustomEventLoader( @NonNull MediationNativeAdConfiguration mediationNativeAdConfiguration, @NonNull MediationAdLoadCallback<MediationNativeAd, MediationNativeAdCallback> mediationAdLoadCallback) { this.mediationNativeAdConfiguration = mediationNativeAdConfiguration; this.mediationAdLoadCallback = mediationAdLoadCallback; } /** Loads the native ad from the third-party ad network. */ public void loadAd() { // Create one of the Sample SDK's ad loaders to request ads. Log.i("NativeCustomEvent", "Begin loading native ad."); SampleNativeAdLoader loader = new SampleNativeAdLoader(mediationNativeAdConfiguration.getContext()); // All custom events have a server parameter named "parameter" that returns // back the parameter entered into the UI when defining the custom event. String serverParameter = mediationNativeAdConfiguration .getServerParameters() .getString(MediationConfiguration .CUSTOM_EVENT_SERVER_PARAMETER_FIELD); Log.d("NativeCustomEvent", "Received server parameter."); loader.setAdUnit(serverParameter); // Create a native request to give to the SampleNativeAdLoader. SampleNativeAdRequest request = new SampleNativeAdRequest(); NativeAdOptions options = mediationNativeAdConfiguration.getNativeAdOptions(); if (options != null) { // If the NativeAdOptions' shouldReturnUrlsForImageAssets is true, the adapter should // send just the URLs for the images. request.setShouldDownloadImages(!options.shouldReturnUrlsForImageAssets()); request.setShouldDownloadMultipleImages(options.shouldRequestMultipleImages()); switch (options.getMediaAspectRatio()) { case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_LANDSCAPE: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_LANDSCAPE); break; case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_PORTRAIT: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_PORTRAIT); break; case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_SQUARE: case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_ANY: case NativeAdOptions.NATIVE_MEDIA_ASPECT_RATIO_UNKNOWN: default: request.setPreferredImageOrientation(SampleNativeAdRequest.IMAGE_ORIENTATION_ANY); } } loader.setNativeAdListener(this); // Begin a request. Log.i("NativeCustomEvent", "Start fetching native ad."); loader.fetchAd(request); } }
광고를 성공적으로 가져왔는지 또는 오류가 발생했는지에 따라
다음 중 하나를 호출합니다.
onSuccess()
드림
또는
onFailure()
onSuccess()
는 구현하는 클래스의 인스턴스를 전달하여 호출됩니다.
MediationNativeAd
일반적으로 이러한 메서드는
어댑터가 구현하는 서드 파티 SDK를 사용해야 합니다. 이 예에서 샘플 SDK는
관련 콜백이 있는 SampleAdListener
가 있습니다.
자바
@Override public void onNativeAdFetched(SampleNativeAd ad) { SampleUnifiedNativeAdMapper mapper = new SampleUnifiedNativeAdMapper(ad); mediationNativeAdCallback = mediationAdLoadCallback.onSuccess(mapper); } @Override public void onAdFetchFailed(SampleErrorCode errorCode) { mediationAdLoadCallback.onFailure(SampleCustomEventError.createSampleSdkError(errorCode)); }
네이티브 광고 매핑
SDK마다 네이티브 광고를 위한 고유한 형식이 있습니다. 돌아올지도 몰라요 '제목'이 포함된 개체 다른 필드는 'headline' 또한 노출 및 처리 과정을 추적하는 데 사용되는 방법은 클릭수는 SDK마다 다를 수 있습니다.
UnifiedNativeAdMapper
는 이러한 차이를 조정하고
미디에이션된 SDK의 네이티브 광고 객체를
Google 모바일 광고 SDK에
대해 살펴보았습니다 맞춤 이벤트는 이 클래스를 확장하여
자체 매퍼를 만들어야 합니다. 여기 보이는 광고 매퍼는
예시 맞춤 이벤트 프로젝트:
자바
package com.google.ads.mediation.sample.customevent; import com.google.android.gms.ads.mediation.UnifiedNativeAdMapper; import com.google.android.gms.ads.nativead.NativeAd; ... public class SampleUnifiedNativeAdMapper extends UnifiedNativeAdMapper { private final SampleNativeAd sampleAd; public SampleUnifiedNativeAdMapper(SampleNativeAd ad) { sampleAd = ad; setHeadline(sampleAd.getHeadline()); setBody(sampleAd.getBody()); setCallToAction(sampleAd.getCallToAction()); setStarRating(sampleAd.getStarRating()); setStore(sampleAd.getStoreName()); setIcon( new SampleNativeMappedImage( ad.getIcon(), ad.getIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE)); setAdvertiser(ad.getAdvertiser()); List<NativeAd.Image> imagesList = new ArrayList<NativeAd.Image>(); imagesList.add(new SampleNativeMappedImage(ad.getImage(), ad.getImageUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE)); setImages(imagesList); if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); } Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras); setOverrideClickHandling(false); setOverrideImpressionRecording(false); setAdChoicesContent(sampleAd.getInformationIcon()); } @Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); } // The Sample SDK doesn't do its own impression/click tracking, instead relies on its // publishers calling the recordImpression and handleClick methods on its native ad object. So // there's no need to pass a reference to the View being used to display the native ad. If // your mediated network does need a reference to the view, the following method can be used // to provide one. @Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { super.trackViews(containerView, clickableAssetViews, nonClickableAssetViews); // If your ad network SDK does its own impression tracking, here is where you can track the // top level native ad view and its individual asset views. } @Override public void untrackView(View view) { super.untrackView(view); // Here you would remove any trackers from the View added in trackView. } }
이제 생성자 코드를 자세히 살펴보겠습니다.
미디에이션된 네이티브 광고 객체에 대한 참조 보유
생성자는 사용되는 네이티브 광고 클래스인 SampleNativeAd
매개변수를 받습니다.
샘플 SDK에서 생성합니다. 매퍼는
클릭 및 노출 이벤트를 전달할 수 있습니다. SampleNativeAd
:
로컬 변수로 저장됩니다.
매핑된 애셋 속성 설정
생성자는 SampleNativeAd
객체를 사용하여
UnifiedNativeAdMapper
이 스니펫은 미디에이션 대상 광고의 가격 데이터를 가져와서 매퍼의 가격:
자바
if (sampleAd.getPrice() != null) { NumberFormat formatter = NumberFormat.getCurrencyInstance(); String priceString = formatter.format(sampleAd.getPrice()); setPrice(priceString); }
이 예에서 미디에이션된 광고는 가격을 double
로 저장하지만
Ad Manager에서는 동일한 애셋에 String
를 사용합니다. 이
매퍼가 이러한 유형의 변환을 처리합니다.
이미지 애셋 매핑하기
이미지 확장 소재 매핑은
double
또는 String
이미지는 자동으로 다운로드되거나
URL 값으로 반환됩니다. 픽셀의 dpi 배율도 달라질 수 있습니다.
Google 모바일 광고 SDK는 이러한 세부정보를 관리할 수 있도록
NativeAd.Image
클래스. 서브클래스를 만들어야 하는 것과 거의 같은 방식으로
미디에이션된 네이티브 광고를 매핑하려면 UnifiedNativeAdMapper
의
이미지 확장 소재를 매핑할 때 NativeAd.Image
의 서브클래스입니다.
다음은 맞춤 이벤트의 SampleNativeMappedImage
클래스의 예입니다.
자바
public class SampleNativeMappedImage extends NativeAd.Image { private Drawable drawable; private Uri imageUri; private double scale; public SampleNativeMappedImage(Drawable drawable, Uri imageUri, double scale) { this.drawable = drawable; this.imageUri = imageUri; this.scale = scale; } @Override public Drawable getDrawable() { return drawable; } @Override public Uri getUri() { return imageUri; } @Override public double getScale() { return scale; } }
SampleNativeAdMapper
는 이 줄에서 매핑된 이미지 클래스를 사용하여
매퍼 아이콘 이미지 애셋:
자바
setIcon(new SampleNativeMappedImage(ad.getAppIcon(), ad.getAppIconUri(), SampleCustomEvent.SAMPLE_SDK_IMAGE_SCALE));
추가 번들에 필드 추가
일부 미디에이션된 SDK는
Ad Manager 네이티브 광고 형식입니다. UnifiedNativeAdMapper
클래스에는 setExtras()
메서드가 포함되어 있어 이 애셋을
있습니다. SampleNativeAdMapper
는 샘플 SDK의
'놀라움의 정도' 저작물:
자바
Bundle extras = new Bundle(); extras.putString(SampleCustomEvent.DEGREE_OF_AWESOMENESS, ad.getDegreeOfAwesomeness()); this.setExtras(extras);
게시자는 NativeAd
클래스를 사용하여 데이터를 가져올 수 있습니다. getExtras()
메서드를 사용하여 축소하도록 요청합니다.
AdChoices
맞춤 이벤트는
UnifiedNativeAdMapper
의 setAdChoicesContent()
메서드 발췌문은 다음과 같습니다.
AdChoices 아이콘을 제공하는 방법을 보여주는 SampleNativeAdMapper
:
자바
public SampleNativeAdMapper(SampleNativeAd ad) { ... setAdChoicesContent(sampleAd.getInformationIcon()); }
노출 및 클릭 이벤트
Google 모바일 광고 SDK와 미디에이션 대상 SDK는 모두 하나의 SDK에서만 이러한 이벤트를 추적하면 됩니다. 거기 맞춤 이벤트가 사용할 수 있는 두 가지 접근 방식입니다. 미디에이션된 SDK에서는 자체적으로 노출 및 클릭을 추적할 수 있습니다.
Google 모바일 광고 SDK로 클릭 및 노출 추적하기
미디에이션 대상 SDK가 자체적으로 노출 및 클릭 추적을 수행하지는 않지만
클릭 및 노출을 기록하는 메서드를 제공하는 경우 Google 모바일 광고 SDK는
이 이벤트를 추적하고 어댑터에 알려야 합니다. 이
UnifiedNativeAdMapper
클래스에는 다음 두 가지 메서드가 포함됩니다.
recordImpression()
및 handleClick()
맞춤 이벤트를 구현하여 미디에이션 대상에서 해당 메서드를 호출할 수 있습니다.
네이티브 광고 객체:
자바
@Override public void recordImpression() { sampleAd.recordImpression(); } @Override public void handleClick(View view) { sampleAd.handleClick(view); }
SampleNativeAdMapper
는 샘플 SDK의 네이티브
해당 객체에 대해 적절한 메서드를 호출하여 클릭을 보고할 수 있습니다.
노출수 등이 있습니다 handleClick()
메서드는
단일 매개변수: 네이티브 광고 애셋에 해당하는 View
객체
알 수 있습니다.
미디에이션된 SDK로 클릭 및 노출 추적
일부 미디에이션된 SDK는 자체적으로 클릭 및 노출을 추적하려고 할 수도 있습니다. 포함
이 경우 기본 클릭 및 노출 추적을
다음 두 호출을 작성하여
UnifiedNativeAdMapper
:
자바
setOverrideClickHandling(true); setOverrideImpressionRecording(true);
클릭 및 노출 추적을 재정의하는 맞춤 이벤트는 다음과 같아야 합니다.
onAdClicked()
및 onAdImpression()
이벤트를 Google 모바일에 보고
선택합니다.
노출과 클릭을 추적하려면 미디에이션 대상 SDK가
추적을 사용 설정하세요. 맞춤 이벤트는
trackViews()
메서드를 호출하고 이 메서드를 사용하여 네이티브 광고의 뷰를 미디에이션 대상
추적할 SDK입니다. 맞춤 이벤트 예시 프로젝트의 샘플 SDK는
이 가이드의 코드 스니펫을 발췌한 경우)은 이 접근 방식을 사용하지 않습니다. 만약
맞춤 이벤트 코드가 다음과 같을 것입니다.
자바
@Override public void trackViews(View containerView, Map<String, View> clickableAssetViews, Map<String, View> nonClickableAssetViews) { sampleAd.setNativeAdViewForTracking(containerView); }
미디에이션 대상 SDK가 개별 애셋 추적을 지원하는 경우 애셋 내부를
clickableAssetViews
를 호출하여 어떤 뷰를 클릭 가능하도록 설정해야 하는지 확인합니다. 이 지도는
NativeAdAssetNames
의 애셋 이름으로 키가 지정됩니다. UnifiedNativeAdMapper
맞춤 이벤트가 재정의할 수 있는 상응하는 untrackView()
메서드를 제공합니다.
보기에 대한 참조를 해제하고 네이티브 광고에서 연결 해제
객체를 지정합니다.
Google 모바일 광고 SDK로 미디에이션 이벤트 전달하기
미디에이션에서 지원하는 모든 콜백은
MediationNativeAdCallback
문서.
맞춤 이벤트에서 이러한 콜백을 최대한 많이 전달하는 것이 중요합니다. 앱이 이와 동등한 이벤트를 Google 모바일 광고 SDK에 오신 것을 환영합니다. 다음은 콜백을 사용하는 예입니다.
네이티브 광고의 맞춤 이벤트 구현이 완료되었습니다. 전체 예 사용 가능 날짜: GitHub