선생님, 개발을 잘하고 싶어요.

[안드로이드 잡학] 앱에 AdMob 추가하기, 실제 코드 적용하기 본문

개발/android 개발

[안드로이드 잡학] 앱에 AdMob 추가하기, 실제 코드 적용하기

알고싶은 승민 2020. 5. 10. 22:22

도입

사이드 프로젝트에 광고를 넣어 보면서 귀찮았던 부분, 신경 쓰인 부분을 정리해 보았습니다.

설정하기

다음 공식 문서들을 참조해서 기본적인 세팅을 할 수 있어요.

 

AdMob 홈페이지: AdMob 어플리케이션을 등록할 수 있다. 

AdMob Android SDK 시작하기: 기본적인 SDK 사용법을 알 수 있다.

 

Android SDK 시작하기 링크를 보면, 기본적으로 Test 배너를 띄울 수 있을 것이라고 생각됩니다.

 

귀찮았던 것

테스트용 Unit Id

AdMob 홈페이지를 통해 발급받은, 광고 ID를 가지고 테스트를 하다 보면, 무효 활동으로 계정이 신고될 수 있다고 합니다.

따라서 우리는

  1. 구글의 샘플 광고 ID를 사용
  2. 테스트 기기를 사용하도록 설정

해야합니다. 하나씩 둘러보죠.

 

샘플 광고 ID 사용

가장 손 쉬운 방법은, 구글에서 제공하는 샘플 광고 ID를 그대로 View에 설정하는 겁니다.

<com.google.android.gms.ads.AdView
    ads:adSize="BANNER"
    ads:adUnitId="ca-app-pub-3940256099942544/6300978111" <!-- 디버그 용으로 샘플 광고 단위 사용 -->
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

하지만 이렇게 할 경우, 릴리즈 시점에 모든 xml을 수정해 주어야 하는 번거로움이 있겠죠

 

그래서 프로그래밍 적으로 뷰에 추가해 주는 방법을 사용할 수 있습니다.

val adView = AdView(this)
adView.adSize = AdSize.BANNER
adView.adUnitId = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544/6300978111" else /* 진짜 광고 ID */

 

저는 디버그 빌드와, 릴리즈 빌드일 때 구분을 쉽게 하기 위해서 프로그래밍으로 뷰에 추가하는 방법을 선택했습니다.

 

테스트 기기 사용

사실, 샘플 광고 ID를 사용해서 보는 방법은, 실제 우리 광고 ID를 사용하지 않아 사용자에게 보이는 화면과 다를 것입니다.

그래서, 아예 사용자의 광고 클릭으로 집계가 안되도록, 테스트 기기를 등록하는 방식을 사용하면 좋습니다.

 

  1. 애뮬레이터를 사용하는 경우
  2. 실제 디바이스를 사용하는 경우

애뮬레이터를 사용하는 경우, 별다른 설정 없어도, 자동으로 테스트 기기로 인식하기 때문에 걱정하실 필요 없습니다.

 

실제 디바이스를 사용하는 경우는 조금 다른데요. 이때는, 해당 기기를 테스트 기기로 등록해 주셔야 합니다.

그런데 공식 문서 제공하는 방식은 Deprecate되어 있습니다.

 

다른 방법으로 돌아갑시다. 

 

  1. 테스트 기기로 설정할 디바이스에 앱을 설치하고 로그를 본다
  2. setTestDeviceIds를 로그에서 검색한다.
  3. 디바이스 ID를 긁어온다.
  4. MobileAds.setRequestConfiguration를 호출한다.

MobileAds를 초기화 해주는 작업 다음에 4번 작업을 추가적으로 해주시면 됩니다.

class MyApplication: Application() {

    override fun onCreate() {
        MobileAds.initialize(this)
    
        // 공식 문서상에선, AdRequest.Builder().addTestDevice()를 호출하라고 하지만
        //현재 Deprecated 상태이고, setRequestConfiguration은 어플리케이션 레벨에서
        //전역으로 한 번 설정하면 끝이다!
        MobileAds.setRequestConfiguration(
          RequestConfiguration.Builder()
          .setTestDeviceIds(listOf("아까 Logcat 에서 긁어온 아이디"))
          .build()
        )
    }
}

 

디버그 하기 위해서...

Ads가 네트워크 통신을 통해서 광고를 받아오는데, 그에 비해 Logcat에 찍히는 디버그 정보가 부실합니다.

이럴 때, 디바이스의 설정에 가보면 추가적으로 디버그 로그를 받아오실 수 있습니다.

설정 > 구글 > 광고 > 광고 디버그 로깅 사용 on

 

다양한 화면에서 재활용 하기

adView를 프로그래밍으로 세팅한다고 말씀드렸죠? 그리고 이러한 배너는 다양한 화면에서 쓰입니다.

재활용해봅시다.

fun FrameLayout.replaceAdMobBanner(): AdView {
    val adView = AdView(context).apply {
        adSize = AdSize.BANNER
        adUnitId = context.getString(if (BuildConfig.DEBUG) "테스트용 ID" else "실제 광고 ID")
        adListener = object : AdListener() {
            override fun onAdLoaded() {
                Timber.d("onAdLoaded")
            }

            override fun onAdFailedToLoad(errorCode: Int) {
                Timber.d("onAdFailedToLoad $errorCode")
            }
        }
    }
    
    // 광고를 요청
    adView.loadAd(AdRequest.Builder().build())

    // FrameLayout에 광고 배너 설치
    this.addView(adView)
    
    return adView
}

 

아예 FrameLayout의 확장 함수로 구성해 놓으면, 광고가 필요한 곳마다. 비어있는 FrameLayout을 만들고, 해당 Layout에 이 확장 함수만 호출해주면 됩니다. 정말 쉽죠😁

Comments