광고 슬라이더
네이티브 광고는 레이아웃을 앱 쪽에서 정의할 수 있는 광고 유형입니다. 이를 통해 앱 디자인 특성을 고려해 광고의 시각적 스타일과 배치를 바꿀 수 있습니다.
광고 렌더링은 네이티브 플랫폼 도구로 수행되어 광고 성능과 품질이 향상됩니다.
네이티브 광고는 광고 경험을 개선합니다. 그 결과 사용자 흥미를 잃지 않으면서 더 많은 광고를 노출할 수 있어 장기적으로 광고 수익을 극대화할 수 있습니다.
사전 요구 사항
- 빠른 시작에 설명된 SDK 통합 단계를 따릅니다.
- 미리 광고 SDK를 초기화합니다.
- Yandex Mobile Ads SDK의 최신 버전을 사용 중인지 확인합니다. 미디에이션을 사용하는 경우 통합 빌드도 최신 버전인지 확인합니다.
구현
네이티브 광고(슬라이더) 연동의 주요 단계:
SliderAdLoader광고 로더를 생성하고 설정합니다.- 광고 로더 이벤트 리스너를 등록합니다:
SliderAdLoadListener. - 광고를 로드합니다.
- 로드된 광고를 표시합니다.
네이티브 광고 연동의 특징
-
Yandex Mobile Ads SDK 메서드 호출은 모두 메인 스레드에서 수행해야 합니다.
-
onAdFailedToLoad()콜백에서 오류가 발생하면 바로 새 광고를 다시 로드하지 마세요. 부득이하면 광고 로드 재시도 횟수를 제한하세요. 제한이 걸린 환경에서 반복적인 실패 요청과 연결 문제를 줄이는 데 도움이 됩니다. -
광고와 상호작용하는 화면의 수명 주기 동안
SliderAd광고 객체와 로더SliderAdLoader에 대한 강한 참조를 유지하는 것을 권장합니다. -
슬라이더가 로드되면 모든 에셋을 렌더링해야 합니다. 광고에서 사용할 수 있는 에셋 목록은
SliderAd객체에서 가져올 수 있습니다. -
슬라이더에는 여러 광고가 포함되며, 각 광고를 표시해야 합니다.
-
슬라이더 안의 각 광고에는 에셋 집합이 있습니다.
NativeAd객체에서 광고에 포함된 컴포넌트 목록을 가져올 수 있습니다. 필수 광고 에셋은 모두 렌더링해야 합니다. 에셋 설명은 네이티브 광고 에셋 페이지를 참고하세요. -
광고 컨테이너 크기는 광고 콘텐츠를 기준으로 계산하는 것을 권장합니다.
-
슬라이더의 광고는 동일한 공유 컨테이너 안에 표시해야 합니다. 그렇지 않으면 노출이 집계되지 않습니다.
-
동영상이 있는 광고는 일반적으로 성과가 더 좋습니다. 동영상 광고를 표시하려면 광고 컨테이너와
MediaView컴포넌트 크기가 최소 300×160 dp(밀도 무관 픽셀) 이상이어야 합니다. -
가능한 모든 에셋을 포함한 레이아웃을 사용하는 것을 권장합니다. 경험상 전체 에셋 세트를 포함한 레이아웃이 전환율이 더 높습니다.
슬라이더 로드
네이티브 광고 슬라이더를 로드하려면 SliderAdLoader 객체를 만듭니다.
광고 요청 매개변수는 NativeAdRequestConfiguration.Builder 클래스 객체로 설정합니다. 요청 매개변수로 광고 단위 ID, 이미지 로드 방식, 연령, 성별 등 광고 선정 품질을 높일 수 있는 데이터를 사용할 수 있습니다.
광고 로드 결과 알림을 받으려면 SliderAdLoadListener 인스턴스를 만들어 슬라이더 로더의 이벤트 리스너로 설정합니다.
광고를 로드하려면 loadSlider() 메서드를 호출합니다.
아래 예시는 Activity에서 네이티브 광고를 로드하는 방법을 보여 줍니다.
class SliderNativeAdActivity : AppCompatActivity(R.layout.activity_slider_native_ad) {
private val nativeAdView get() = binding.nativeAd.root
private var sliderAdLoader: SliderAdLoader? = null
private lateinit var binding: ActivityCustomNativeAdBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCustomNativeAdBinding.inflate(layoutInflater)
setContentView(binding.root)
sliderAdLoader = createSliderAdLoader()
sliderAdLoader?.loadSlider(
// Methods in the NativeAdRequestConfiguration.Builder class can be used here to specify individual options settings.
NativeAdRequestConfiguration.Builder("your-ad-unit-id").build()
)
}
private fun createSliderAdLoader(): SliderAdLoader {
return sliderAdLoader ?: SliderAdLoader(this).apply {
setSliderAdLoadListener(object : SliderAdLoadListener {
override fun onSliderAdLoaded(p0: SliderAd) {
// The slider ad was loaded successfully. Now you can show loaded ads.
}
override fun onSliderAdFailedToLoad(p0: AdRequestError) {
// Ad failed to load with AdRequestError.
// Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
}
})
}
}
}
class CustomSliderNativeAdActivity extends AppCompatActivity {
private NativeAdView mNativeAdView = mBinding.nativeAd.getRoot();
@Nullable
private SliderAdLoader mSliderAdLoader = null;
private ActivityCustomNativeAdBinding mBinding;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mBinding = ActivityCustomNativeAdBinding.inflate(getLayoutInflater());
setContentView(mBinding.getRoot());
mSliderAdLoader = createSliderAdLoader();
if (mSliderAdLoader != null) {
// Methods in the NativeAdRequestConfiguration.Builder class can be used here to specify individual options settings.
mSliderAdLoader.loadSlider(
new NativeAdRequestConfiguration.Builder("your-ad-unit-id").build()
);
}
}
private SliderAdLoader createSliderAdLoader() {
if (mSliderAdLoader != null) {
return mSliderAdLoader;
}
final SliderAdLoader newSliderAdLoader = new SliderAdLoader(this);
newSliderAdLoader.setSliderAdLoadListener(new SliderAdLoadListener() {
@Override
public void onSliderAdLoaded(@NonNull SliderAd sliderAd) {
// The slider ad was loaded successfully. Now you can show loaded ads.
}
@Override
public void onSliderAdFailedToLoad(@NonNull final AdRequestError error) {
// Ad failed to load with AdRequestError.
// Attempting to load a new ad from the onAdFailedToLoad() method is strongly discouraged.
}
});
return mSliderAdLoader;
}
}
네이티브 광고 슬라이더 렌더링
슬라이더가 로드되면 모든 에셋을 렌더링해야 합니다.
성공적으로 로드된 슬라이더에는 동일한 컨텍스트를 가진 네이티브 광고가 하나 이상 포함됩니다. 슬라이더의 광고는 동일한 공유 컨테이너 안에 표시해야 합니다. 그렇지 않으면 노출이 집계되지 않습니다.
슬라이더 레이아웃을 구성하는 방법은 두 가지입니다.
- 템플릿을 사용한 레이아웃
- 네이티브 광고 슬라이더 레이아웃 수동 설정
템플릿을 사용한 레이아웃
네이티브 광고 슬라이더를 다루는 가장 쉬운 방법은 표준 레이아웃 템플릿을 쓰는 것입니다. 기본 형태에서는 코드가 몇 줄만 필요합니다.
템플릿에는 필수 에셋이 모두 들어 있고, 서로의 배치도 정의되어 있습니다. 지원되는 모든 네이티브 광고 유형과 호환됩니다.
템플릿으로 슬라이더를 만들 때는 SliderAd 객체를 루트 NativeAdView 컨테이너에 연결하고, 슬라이더 안의 모든 광고를 템플릿에 연결합니다.
코드 예시
private fun showAd(sliderAd: SliderAd) {
try {
val sliderViewBinder = NativeAdViewBinder.Builder(sliderAdView).build()
sliderAd.bindSliderAd(sliderViewBinder)
val nativeAds = sliderAd.nativeAds
for (nativeAd in nativeAds) {
val nativeBannerView = NativeBannerView(this)
nativeBannerView.setAd(nativeAd)
sliderAdView.addView(nativeBannerView)
}
} catch (exception: NativeAdException) {
//log error
}
}
private void showAd(@NonNull final SliderAd sliderAd) {
try {
final NativeAdViewBinder sliderViewBinder = new NativeAdViewBinder.Builder(mSliderAdView).build();
sliderAd.bindSliderAd(sliderViewBinder);
final List<NativeAd> nativeAds = sliderAd.getNativeAds();
for (final NativeAd nativeAd : nativeAds) {
final NativeBannerView nativeBannerView = new NativeBannerView(this);
nativeBannerView.setAd(nativeAd);
mSliderAdView.addView(nativeBannerView);
}
} catch (final NativeAdException exception) {
//log error
}
}
네이티브 광고 슬라이더 템플릿은 사용자화할 수 있습니다. 자세한 내용은 템플릿으로 레이아웃 설정을 참고하세요.
네이티브 광고 슬라이더 레이아웃 수동 설정
템플릿 설정만으로는 원하는 결과를 얻기 어려울 때, 네이티브 광고 슬라이더 레이아웃을 직접 구성할 수 있습니다.
이 방식에서는 광고 컴포넌트를 서로 상대적으로 배치해 네이티브 광고용 슬라이더를 구성합니다. 광고에는 필수·선택 표시 에셋이 모두 있을 수 있습니다. 전체 목록은 네이티브 광고 에셋에서 확인하세요.
Совет
슬라이더의 각 광고에는 가능한 모든 에셋을 포함한 레이아웃을 쓰는 것을 권장합니다. 경험상 에셋이 완전한 레이아웃이 클릭률이 더 높습니다.
SliderAd 객체를 루트 NativeAdView에 연결하고, 슬라이더의 각 광고를 자식 NativeAdView에 연결합니다.
슬라이더 안의 각 광고는 표준 네이티브 광고 레이아웃 방식으로 배치합니다.
코드 예시
private fun showAd(sliderAd: SliderAd) {
try {
val sliderViewBinder = NativeAdViewBinder.Builder(sliderAdView).build()
sliderAd.bindSliderAd(sliderViewBinder)
val nativeAds = sliderAd.nativeAds
for (nativeAd in nativeAds) {
val nativeAdView: NativeAdView =
mLayoutInflater.inflate(R.layout.widget_native_ad, sliderAdView, false)
val viewBinder = NativeAdViewBinder.Builder(nativeAdView)
.setAgeView(age)
.setBodyView(body)
.setCallToActionView(callToAction)
.setDomainView(domain)
.setFaviconView(favicon)
.setFeedbackView(feedback)
.setIconView(icon)
.setMediaView(media)
.setPriceView(price)
.setRatingView(rating)
.setReviewCountView(reviewCount)
.setSponsoredView(sponsored)
.setTitleView(title)
.setWarningView(warning)
.build()
nativeAd.bindNativeAd(viewBinder)
sliderAdView.addView(nativeAdView)
}
} catch (exception: NativeAdException) {
//log error
}
}
private void showAd(@NonNull final SliderAd sliderAd) {
try {
final NativeAdViewBinder sliderViewBinder = new NativeAdViewBinder.Builder(mSliderAdView).build();
sliderAd.bindSliderAd(sliderViewBinder);
final List<NativeAd> nativeAds = sliderAd.getNativeAds();
for (final NativeAd nativeAd : nativeAds) {
final NativeAdView nativeAdView = mLayoutInflater.inflate(R.layout.widget_native_ad, mSliderAdView, false);
final NativeAdViewBinder viewBinder = new NativeAdViewBinder.Builder(nativeAdView)
.setAgeView(age)
.setBodyView(body)
.setCallToActionView(callToAction)
.setDomainView(domain)
.setFaviconView(favicon)
.setFeedbackView(feedback)
.setIconView(icon)
.setMediaView(media)
.setPriceView(price)
.setRatingView(rating)
.setReviewCountView(reviewCount)
.setSponsoredView(sponsored)
.setTitleView(title)
.setWarningView(warning)
.build();
nativeAd.bindNativeAd(viewBinder);
mSliderAdView.addView(nativeAdView);
}
} catch (final NativeAdException exception) {
//log error
}
}
네이티브 광고 슬라이더 연동 테스트
광고 테스트용 데모 광고 단위 사용
네이티브 광고 슬라이더 연동과 앱 자체를 검증할 때는 테스트 광고를 사용하는 것을 권장합니다.
모든 슬라이더 요청에 테스트 광고가 반환되도록 데모 광고 게재 위치 ID를 제공합니다. 연동 확인에 사용하세요.
네이티브 광고 슬라이더용 데모 adUnitId: demo-native-slider-yandex.
Важно
스토어에 앱을 출시하기 전에 데모 광고 단위 ID를 Yandex Advertising Network 인터페이스에서 받은 실제 ID로 반드시 바꾸세요.
광고 연동 테스트
SDK에 내장된 분석기로 네이티브 광고 슬라이더 연동을 점검할 수 있습니다.
이 도구는 슬라이더가 올바르게 연동되었는지 확인하고 로그에 상세 보고서를 출력합니다.
보고서를 보려면 Android 앱 디버깅용 Logcat 도구에서 YandexAds 키워드를 검색하세요.
adb logcat -v brief '*:S YandexAds'
연동이 성공하면 다음과 같은 메시지가 표시됩니다.
adb logcat -v brief '*:S YandexAds'
mobileads$ adb logcat -v brief '*:S YandexAds'
I/YandexAds(13719): [Integration] Slider native ad was integrated successfully
네이티브 광고 슬라이더 연동에 문제가 있으면 원인과 해결 방법 권장 사항이 담긴 상세 보고서를 받을 수 있습니다.