Android

[Modified ad behavior 오류 해결 방법] 귀하의 앱에서 Google AdMob 광고 게재가 중지되었습니다.

회사에서 라포활동의 일환으로 캠핑을 갔고 오랜만에 저녁에 불멍을 하며 사람들 노는 모습도 보고 얘기도 듣고 너무 추워서 장작을 5개나 추가 구매하여 태우고 있었다. 그러던 중에 휴대폰 메일을 보다가 광고 정지 관련 메일이 눈에 들어왔다. 메일 제목과 내용은 다음과 같다.

메일 제목

귀하의 앱에서 Google AdMob 광고 게재가 중지되었습니다

메일 내용


캠핑 가기전 날 밤에 배포한 앱의 문제는 아니여서 천만다행이었다.  2019년도에 팀 워크샵 갔을 때 다음날 아침 7시에 앱이 삭제되는 메일을 받아서 너무나도 빨리 집에가서 처리하고 싶은 마음이 굴뚝같았던 기억이 떠오르며 놀란 가슴을 쓸어내렸다. 구글플레이에서 온 메일이 아닌, 구글 AdMob에서 온 메일이였기 때문이다. adMob 사이트에 로그인하여 하여 확인해보니 문제점은 바로 “Modified ad behavior” 이다. 처음보는 위반 내용이었다.

오류 해결을 위해 그리고 나와 같은 사람들이 있는지 알아보기 위해 구글링을 시작했다. 그리하여 연관자료를 몇 개 찾았다. 해결책인지 확인하기 위해 지금부터 작업을 시작해보려한다. 수정 버튼을 클릭하면 다음과 같이 안내가이드를 제공하지만 정확하지 않다.

문제 설명
Modified ad behavior 해결해야 하는 문제
게시자는 Google 광고의 양식이나 타겟팅을 변경할 수 없습니다. AdSense 광고 코드를 “떠다니는 상자 스크립트”에서 구현하거나 숨겨진 키워드 또는 IFRAME을 사용하여 광고 타겟팅을 변경하는 것이 이에 해당합니다.

수정된 광고 코드: 광고 프레임 크기 조정

게시자는 어떤 식 으로든 Google 광고의 동작을 변경할 수 없다. 여기에는 광고 프레임의 크기를 조정하여 광고의 일부를 잘라내거나 Ads by Google이라는 별명을 숨기는 것이 포함된다

다음 코드는 다른 개발자 작성한 코드 내용을 스택오버플로에서 가져온 것이다.

/** Constructor */
   public AppOpenManager(MyApplication myApplication) {
       this.myApplication = myApplication;
       this.myApplication.registerActivityLifecycleCallbacks(this);
       ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
   }
   public void showAdIfAvailable() {
       // Only show ad if there is not already an app open ad currently showing
       // and an ad is available.
       Log.e(LOG_TAG, "showAdIfAvailable: " + (!isShowingAd) );
       Log.e(LOG_TAG, "showAdIfAvailable: " + (isAdAvailable()) );
       if (!isShowingAd && isAdAvailable()) {
           Log.e(LOG_TAG, "Will show ad.");

           FullScreenContentCallback fullScreenContentCallback =
                   new FullScreenContentCallback() {
                       @Override
                       public void onAdDismissedFullScreenContent() {
                           // Set the reference to null so isAdAvailable() returns false.
                           AppOpenManager.this.appOpenAd = null;
                           isShowingAd = false;
                           fetchAd();
                       }

                       @Override
                       public void onAdFailedToShowFullScreenContent(AdError adError) {
                           Log.e("TAGGGG", "onAdFailedToShowFullScreenContent: " + adError.getMessage() );
                       }

                       @Override
                       public void onAdShowedFullScreenContent() {
                           isShowingAd = true;
                       }
                   };

           appOpenAd.show(currentActivity, fullScreenContentCallback);

       } else {
           Log.e(LOG_TAG, "Can not show ad.");
           fetchAd();
       }
   }
   /** Request an ad */
   public void fetchAd() {
       // Have unused ad, no need to fetch another.
       if (isAdAvailable()) {
           return;
       }

       loadCallback =
               new AppOpenAd.AppOpenAdLoadCallback() {
                   /**
                    * Called when an app open ad has loaded.
                    *
                    * @param ad the loaded app open ad.
                    */
                   @Override
                   public void onAppOpenAdLoaded(AppOpenAd ad) {
                       AppOpenManager.this.appOpenAd = ad;
                       AppOpenManager.this.loadTime = (new Date()).getTime();
                   }

                   /**
                    * Called when an app open ad has failed to load.
                    *
                    * @param loadAdError the error.
                    */
                   @Override
                   public void onAppOpenAdFailedToLoad(LoadAdError loadAdError) {
                       // Handle the error.
                   }

               };
       AdRequest request = getAdRequest();
       AppOpenAd.load(
               myApplication, AD_UNIT_ID, request,
               AppOpenAd.APP_OPEN_AD_ORIENTATION_PORTRAIT, loadCallback);
   }

   /** Utility method to check if ad was loaded more than n hours ago. */
   private boolean wasLoadTimeLessThanNHoursAgo(long numHours) {
       long dateDifference = (new Date()).getTime() - this.loadTime;
       long numMilliSecondsPerHour = 3600000;
       return (dateDifference < (numMilliSecondsPerHour * numHours));
   }

   /** Utility method that checks if ad exists and can be shown. */
   public boolean isAdAvailable() {
       return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4);
   }
   /** Creates and returns ad request. */
   private AdRequest getAdRequest() {
       return new AdRequest.Builder().build();
   }

//    /** Utility method that checks if ad exists and can be shown. */
//    public boolean isAdAvailable() {
//        return appOpenAd != null;
//    }

   @Override
   public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle bundle) {

   }

   @Override
   public void onActivityStarted(@NonNull Activity activity) {
       currentActivity = activity;
   }

   @Override
   public void onActivityResumed(@NonNull Activity activity) {
       currentActivity = activity;
   }

   @Override
   public void onActivityPaused(@NonNull Activity activity) {

   }

   @Override
   public void onActivityStopped(@NonNull Activity activity) {

   }

   @Override
   public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle bundle) {

   }

   @Override
   public void onActivityDestroyed(@NonNull Activity activity) {
       currentActivity = null;
   }
   @OnLifecycleEvent(ON_START)
   public void onStart() {
       showAdIfAvailable();
       Log.d(LOG_TAG, "onStart");
   }
}

Modified ad behavior 오류 해결 방법

1. 광고를 노출하는 화면단 xml파일에서 광고 노출용 레이아웃에 패딩값이 너무 높아서 광고가 잘려서 보이는 문제가 발생하는지 확인해야한다.

2. 권장되지 않는 배너구현권장되지 않는 전면광고와 관련이 있을 수 있으니 체크해야한다.

그래서 하나하나 살펴보았다. 나의 경우 레이아웃xml에 광고 레이아웃 사이즈를 줄이지 않았지만 그녀석을 감싸고 있는 레이아웃의 높이값이 android:layout_height=”100dp”으로 고정함으로써 광고 레이아웃이 잘리는 현상이 발생한 것으로 예상된다.

구글플레이 스토어에 등록 후 adMob사이트로 돌아와 검토요청 버튼을 눌러 마무리하였다.

[정책 위반이 발생한 layout xml]

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:id="@+id/adb_layout"
            android:layout_marginTop="5dp"
            android:gravity="center|bottom">

            <FrameLayout
                android:id="@+id/ad_view_container"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"/>
            <View
                android:layout_below="@+id/ad_view_container"
                android:layout_width="match_parent"
                android:layout_height="10dp"
                android:background="@color/colorxml_color_03"/>
        </RelativeLayout>

[정책 해결한 layout xml]

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/adb_layout"
            android:layout_marginTop="5dp"
            android:gravity="center|bottom">

            <FrameLayout
                android:id="@+id/ad_view_container"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"/>
            <View
                android:layout_below="@+id/ad_view_container"
                android:layout_width="match_parent"
                android:layout_height="10dp"
                android:background="@color/colorxml_color_03"/>
        </RelativeLayout>

다음날 정책위반이 처리되었다는 메일을 받았다. AdMob 담당자들은 구글플레이 스토어에 등록되지않았지만 확인이 가능한 모양이다. 광고는 몇 시간 뒤 다시 노출되기 시작했다.

[관련정보]

[REFERENCE]

Leave a Reply

error: Content is protected !!