Header Bidding
NAM SDK 에서는 배너 광고에 한해서 Header bidding 을 지원합니다.
Header bidding 은 NAM 서버를 거치지 않고, 앱에서 외부 Ad DSP (APS)로 바로 광고(auction)을 요청하는 과정입니다.
광고가 로드 되기까지 응답 속도는 느려질 수 있으나 더 좋은(비싼) 광고를 받을 수 있습니다.
Dependency
앱수준의 build.gradle
파일에 관련 repositories 와 dependencies 를 설정합니다.
- Kotlin DSL
- Groovy
dependencies {
implementation("com.naver.gfpsdk:extension-aps")
}
dependencies {
implementation 'com.naver.gfpsdk:extension-aps'
}
명시적으로 APS SDK 종속성을 추가하려 는 경우, NAM SDK 와 호환되는 APS SDK 버전은 9.8.8 버전 이상입니다.
APS 초기화 및 MRAID 설정
NAM SDK 는 MRAID 1.0, 2.0, 3.0 버전을 지원하고 있습니다. 따라서 아래와 같은 설정이 필요합니다.
- Kotlin
- Java
class SampleApplication : Application() {
override fun onCreate() {
super.onCreate()
AdRegistration.getInstance("APS_KEY", this)
AdRegistration.enableTesting(true) // release 시에는 false 로 설정
// MRAID 설정
AdRegistration.setMRAIDSupportedVersions(arrayOf("1.0", "2.0", "3.0"))
AdRegistration.setMRAIDPolicy(MRAIDPolicy.CUSTOM)
}
}
public class SampleApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
AdRegistration.getInstance("APS_KEY", this);
AdRegistration.enableTesting(true); // release 시에는 false 로 설정
// MRAID 설정
AdRegistration.setMRAIDSupportedVersions(new String[] {"1.0", "2.0", "3.0"});
AdRegistration.setMRAIDPolicy(MRAIDPolicy.CUSTOM);
}
}
APS 배너 광고 연동 예제
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/banner_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
- Kotlin
- Java
class BannerSampleActivity : AppCompatActivity() {
private lateinit var bannerAdContainer: RelativeLayout
private lateinit var bannerAdView: GfpBannerAdView // GFP SDK banner ad view
private lateinit var adParam: AdParam // GFP SDK Ad Param
private lateinit var dtbAdRequest: DTBAdRequest
private var apsCompleted = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_banner_sample)
bannerAdContainer = findViewById(R.id.banner_container)
initialize()
requestAPS()
}
override fun onDestroy() {
super.onDestroy()
bannerAdView.destroy()
}
private fun initialize() {
adParam = AdParam.Builder()
.setAdUnitId("GFP_AD_UNIT_ID")
.build()
bannerAdView = GfpBannerAdView(this, adParam)
bannerAdContainer.addView(bannerAdView)
}
private fun requestAPS() {
adParam.apsParam = null // 요청 전 ApsParam 초기화
dtbAdRequest = DTBAdRequest()
dtbAdRequest.sizes = DTBAdSize(320, 100, "YOUR_UUID")
dtbAdRequest.loadAd(object: DTBAdCallback {
override fun onFailure(adError: AdError) {
apsCompleted = true
internalLoadAd()
}
override fun onSuccess(dtbAdResponse: DTBAdResponse) {
apsCompleted = true
val adSizes = dtbAdResponse.dtbAds
if (adSizes != null && adSizes.isNotEmpty()) {
val apsAdParam = ApsUtils.createGfpApsAdParam(dtbAdResponse)
adParam.apsParam = apsAdParam
}
internalLoadAd()
}
})
}
private fun internalLoadAd() {
if (apsCompleted) {
bannerAdView.loadAd()
}
}
}
public class BannerSampleActivity extends AppCompatActivity {
private RelativeLayout bannerAdContainer;
private GfpBannerAdView bannerAdView; // GFP SDK banner ad view
private AdParam adParam; // GFP SDK Ad Param
private DTBAdRequest dtbAdRequest;
private boolean apsCompleted = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_banner_sample);
bannerAdContainer = findViewById(R.id.banner_container);
initialize();
requestAPS();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (bannerAdView != null) {
bannerAdView.destroy();
}
}
private void initialize() {
adParam = new AdParam.Builder()
.setAdUnitId("GFP_AD_UNIT_ID")
.build();
bannerAdView = new GfpBannerAdView(this, adParam);
bannerAdContainer.addView(bannerAdView);
}
private void requestAPS() {
adParam.setApsParam(null); // 요청 전 ApsParam 초기화
dtbAdRequest = new DTBAdRequest();
dtbAdRequest.setSizes(new DTBAdSize(320, 100, "YOUR_UUID"));
dtbAdRequest.loadAd(new DTBAdCallback() {
@Override
public void onFailure(@NonNull AdError adError) {
apsCompleted = true;
internalLoadAd();
}
@Override
public void onSuccess(@NonNull DTBAdResponse dtbAdResponse) {
apsCompleted = true;
List<DTBAdSize> adSizes = dtbAdResponse.getDTBAds();
if (adSizes != null && !adSizes.isEmpty()) {
GfpApsAdParam apsAdParam =
ApsUtils.createGfpApsAdParam(dtbAdResponse);
adParam.setApsParam(apsAdParam);
}
internalLoadAd();
}
});
}
private void internalLoadAd() {
if (apsCompleted) {
bannerAdView.loadAd();
}
}
}
APS 호출시 하나의 AdParam instance 로 여러번의 APS 광고를 요청할 경우, 요청 직전에 adParam.setApsParam(null) 를 호출함으로써 adParam 내의 GfpApsAdParam 값을 초기화 해줘야 합니다.
APS 호출시 AdParam 의 instance 값에 APS 응답값을 추가해줘야 합니다. dtbAdRequest.loadAd()의 응답으로 onSuccess() 가 왔을 때 adParam.setApsParam(GfpApsAdParam) 를 통해서 adParam 에 GfpApsAdParam 객체를 넘겨줘야 합니다.
이때, GfpApsAdParam 은 ApsUtils.createGfpApsAdParam(DTBAdResponse) 을 통해 생성할 수 있습니다.
APS 가이드
APS 에 대한 자세한 사용법은 APS Android 가이드 를 참조하시면 됩니다.
아마존 계정으로 로그인이 필요합니다.