https://wnsgml517.tistory.com/219
광고 구현 글은 여기로 !!
앱을 출시하게 되면, 테스트 키(구글 예시 키)로 설정했던 광고는 릴리즈 키로 바꿔야한다.
릴리즈 키는 외부에 노출되면 안된다. 숨겨야 한다는 것
광고 키를 숨길려면 local.properties에 값을 가지고 있어야 한다. 그래야 .gitignore로 인해서 github에 키가 노출되지 않으니 말이다.
build.gradle(:presentation) 여기서 1) 디버그 모드일 때 2) 릴리즈 모드일 때 키를 구분해주었다.
(당장 앱 출시할 때 방법을 몰라서 계속 물리적으로 키를 바꿔서 설정했다..^^ㅠㅠ)
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
buildConfigField "String", "GOOGLE_APP_BANNER_KEY", "${properties['google_app_banner_release_key']}"
buildConfigField "String", "GOOGLE_APP_REWARD_KEY", "${properties['google_app_reward_release_key']}"
}
debug {
buildConfigField "String", "GOOGLE_APP_BANNER_KEY", "${properties['google_app_banner_debug_key']}"
buildConfigField "String", "GOOGLE_APP_REWARD_KEY", "${properties['google_app_reward_debug_key']}"
}
}
빌드 모드(디버그, 릴리즈 default. 설정에 따라서 다른 모드도 추가할 수 있음)에 따라서 GOOGLE_APP_KEY를 관리할 수 있는 것이다.
자세히 알아보고 싶다면, 아래 클릭
Android에서 buildTypes는 보통 릴리즈(release) 모드와 디버그(debug) 모드처럼 서로 다른 빌드 변형(build variant)에 대한 설정을 정의하는 데 사용된다. 이 빌드 타입은 앱이 어떻게 빌드되고 패키징될지 결정하는 중요한 요소이다.
예시에서 buildConfigField를 사용해 릴리즈와 디버그 모드에 따라 다른 키 값을 정의하고 있어요. 이를 통해 빌드 타입에 따라 앱에 주입되는 상수가 달라지도록 할 수 있는 거죠.
이 구분이 이루어지는 원리는 Gradle이 빌드 과정에서 선택된 빌드 타입을 기준으로 BuildConfig라는 클래스를 생성한다는 점이에요. 이 클래스에는 buildConfigField로 정의된 상수 값들이 들어가게 되고, 앱을 실행할 때 릴리즈 모드냐 디버그 모드냐에 따라 해당하는 값이 앱에 주입되게 돼요.
위의 예시를 보자면,
- 릴리즈 모드에서는 GOOGLE_APP_BANNER_KEY에 google_app_banner_release_key 값이 들어가요.
- 디버그 모드에서는 google_app_banner_debug_key 값이 사용돼요.
이렇게 하면 디버깅할 때와 실제로 배포할 때 각각 맞는 키를 적용할 수 있어요.
여기까지는 순조로웠다. 왜냐하면 그냥 디버그용(테스트용) 키만 릴리즈용 키로 바꾸면 되었기 때문이다.
보상형 광고는 원래 코틀린 코드 내에서 id를 설정해주기 때문에 상관이 없었는데,
문제는 xml에서 id를 설정하는 배너 광고였다.
배너 광고는 xml에서 바로 하나의 화면으로 차지하게 되고, 바로 xml 내에서 id를 설정해준다.
저 id를 xml내에서 gradle에서 정의한 값으로 설정을 바로 하려니, id를 계속 인식못하고 앱이 죽는 것이다...
그래서 kotlin코드 내에서 id를 동적으로 설정해줘야 하는 상황이었다.
<com.google.android.gms.ads.AdView
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:id="@+id/ad_banner"
android:layout_width="match_parent"
android:layout_height="50dp"
android:visibility="@{vm.onClickedShowDetail == null && vm.showAdvertisement == true ? View.VISIBLE : View.GONE}"
ads:layout_constraintBottom_toTopOf="@+id/ll_bottom_navigation"
ads:layout_constraintEnd_toEndOf="parent"
ads:layout_constraintStart_toStartOf="parent"
ads:adSize="BANNER"
ads:adUnitId="배너 테스트 아이디"/>
계속 오류가 났던 이유는 화면 로드 전에 id를 가진 광고 배너가 보여져야하는데, id가 없는 배너 화면(xml)을 그린 후에
액티비티가 실행되면서 id를 뒤늦게 설정해주면서 계속 id를 missing 했다는 오류가 뜨지 않았나 싶다.
이것 저것 id를 xml이 아닌 코틀린 코드에서 설정해보고 그랬는데 도무지 되지 않았다.
그래서 저 배너 부분을 frameLayout 형태로 바꿨다.
<FrameLayout
android:id="@+id/ad_banner"
android:layout_width="match_parent"
android:layout_height="50dp"
android:visibility="@{vm.onClickedShowDetail == null && vm.showAdvertisement == true ? View.VISIBLE : View.GONE}"
app:layout_constraintBottom_toTopOf="@+id/ll_bottom_navigation"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
그리고서 동적으로 만들어지도록 코드구현을 했더니 성공하였다 (근데 광고 뜨는 속도가 체감상 매우 느리다. 더 좋은 방법이 있겠지,,?)
Adview 객체를 선언하고 id를 그 객체를 frameLayout에 addView를 해줬더니 광고가 제대로 떴다.
private fun loadBannerAd() {
val adView = AdView(this)
adView.setAdSize(AdSize.BANNER)
adView.adUnitId = BuildConfig.GOOGLE_APP_BANNER_KEY
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)
binding.adBanner.addView(adView)
}
'Floney' 카테고리의 다른 글
[Floney] Android Appsflyer 앱링크 설정 (2) | 2024.11.07 |
---|---|
[Floney] 정기 결제 구현 (1) | 2024.10.19 |
[Floney] Android 구글 광고 달기 (보상형 광고, 배너 광고) (1) | 2024.09.07 |
[Floney] 내가 맡은 부분 자체 QA (0) | 2024.06.08 |
[Floney] 커스텀 기간 설정 캘린더 직접 구현 (라이브러리 X) (0) | 2024.04.15 |