새로운 Android 용 통합 메시징 플랫폼 SDK를 사용하여 개인 맞춤이 아닌 AdMob 광고를 요청하는 방법

Aug 18 2020

현재 Google의 (지원 중단 된) 동의 라이브러리 를 사용 하여 유럽 사용자의 개인 맞춤 광고에 대한 동의를 요청하고 있습니다. 문서에는 사용자의 동의 상태가 이미 PERSONALIZED 또는 NON_PERSONALIZED로 설정된 경우 다음 을 사용하여 동의를 Google 모바일 광고 SDK에 전달할 수 있다고 명시되어 있습니다 .

Bundle extras = new Bundle();
extras.putString("npa", "1");

AdRequest request = new AdRequest.Builder()
    .addNetworkExtrasBundle(AdMobAdapter.class, extras)
    .build();

이제 새로운 Android 용 통합 메시징 플랫폼 SDK 로 마이그레이션하려고합니다 . 문서는 매우 간단하지만 동의를 사용 하는 방법이 아니라 동의 를 얻는 방법 만 설명합니다 . 이는 Android 용 새 UMP SDK를 사용할 때 개인 맞춤 광고에 동의하지 않은 사용자를 위해 AdMob 광고를 요청할 때 더 이상 is 를 설정할 필요가 없음을 의미합니까 ?"npa""1"


2020 년 8 월 25 일 수정

어제 모바일 광고 SDK 팀의 누군가가 제가 여기서 물어 본 것과 동일한 질문에 응답 한이 대화를 발견했습니다 . 그는 이렇게 말합니다.

npa = 1 을 통한 레거시 "동의 전달" 은 추후 공지가있을 때까지 SDK에 의해 존중됩니다.


2020 년 8 월 31 일 수정

나는 이 게시물에있는 것과 같은 질문을 하는 새로운 대화를 시작 했지만 아무런 응답이 없습니다.

답변

1 Alexander Oct 07 2020 at 21:12

새로운 통합 메시징 플랫폼을 통해 Google은 동의 관리 플랫폼 역할을하고 있습니다. 이러한 CMP는 TCF 문자열을 사용하여 사용자 동의 기본 설정을 저장합니다. Google은이 TCF 문자열을 확인하여 어떤 광고를 표시 할 수 있는지 확인합니다.

Google 문서에 따라 :

Google은 다음 기준이 모두 충족되면 개인 맞춤 광고를 게재합니다.

  1. 최종 사용자는 Google이 기기에 정보를 저장 및 / 또는 액세스하는 것에 동의합니다.
  2. 개인 맞춤 광고 프로필 만들기
  3. 개인 맞춤 광고 선택

그리고 Google이 다음을 수행 할 수 있도록 합법적 인 이해 (또는 게시자가 CMP를 구성하는 경우 동의)가 설정됩니다.

  1. 기본 광고 선택
  2. 광고 실적 측정
  3. 시장 조사를 적용하여 청중 인사이트 생성
  4. 제품 개발 및 개선

개인 맞춤 광고에 대한 동의 요구 사항이 충족되지 않으면 Google은 다음 기준이 모두 충족 될 때 개인 맞춤이 아닌 광고를 게재 합니다.

  1. 장치에 정보 저장 및 / 또는 액세스

Google이 다음을 수행 할 수 있도록 합법적 인 이해 (또는 게시자가 CMP를 구성하는 경우 동의)가 설정됩니다.

  1. 기본 광고 선택
  2. 광고 실적 측정
  3. 시장 조사를 적용하여 청중 인사이트 생성
  4. 제품 개발 및 개선
  5. 공급 업체 목록에서 Google을 활성화합니다.

10 월 20 일 업데이트 :이 정보를 제공하기 위해 비 개인 광고 SO @Georg를 표시하는 데 더 이상 3,4,5가 필요하지 않습니다.

위의 조건이 충족되지 않으면 Google에 광고가 게재되지 않습니다.

이 정보가 귀하의 질문에 답하기를 바라지 만 더 많은 정보가 필요하면 알려주십시오!

Frank Nov 03 2020 at 05:44

다음 문장을 기억하십시오.

절대 포기하지 마시고 잔은 항상 반쯤 찼습니다 :-)-> 낙관적이 되십시오!

따라서 유럽에서 유효한 것을 변경할 수있는 해결책이 더 이상 존재하지 않을 것입니다. 우리가 할 수있는 일은 다음과 같습니다.

사용자가 자금 선택 양식에서 "동의"를 누르거나 "제출"을 누르면 대화 상자가 닫힐 때 일부 매개 변수가 Android의 기본 공유 환경 설정에 저장됩니다 !! IOS에서도 똑같은 일이 일어나고 있습니다 (그래서 누구나이 솔루션을 신속하게 프로그래밍 할 수 있습니다.

제한된 앱을 제공하는 것이 "우리"의 권리입니다. 즉, 제한이있는 라이트 버전과 구매할 정식 버전을 제공 할 수 있습니다.

그래서 우리가 할 수있는 것은 pref 키를 읽는 것입니다.

투명성 및 동의 프레임 워크에 대한 기본 설정 키는 다음과 같습니다. https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#in-app-details

읽으려면 다음과 같은 기본 키가 필요합니다 (Android 또는 IOS).

IABTCF_PurposeLegitimateInterests

IABTCF_VendorConsents

IABTCF_PurposeConsents

따라서 이러한 값에 따라 양식이 닫힌 후 광고가 게재되는지 또는 광고가 게재되지 않는지 확인할 수 있습니다.

그런 다음 앱에서 중요한 옵션을 차단하고 대화 상자를 표시 할 수 있습니다.

"광고가 사용 중지되었습니다. 현재 앱의 라이트 버전을 사용하고 있습니다. 마음을 바꾸거나 프로 버전 등을 구입할 수 있습니다."

-> "광고 활성화"설명 뒤에 버튼을 추가하고 양식을 다시 표시하거나 "프로 구매"

당신이 여기서 무엇을하고 있는지는 당신에게 달려 있습니다!

내 수업은 kotlin 또는 java에 있습니다!

해야 할 일 : Google의 UMP SDK를 gradle의 종속성에 넣고 AdMob 계정에서 앱에 대한 자금 선택을 설정하십시오! 그런 다음 펀딩 선택 양식을 설정하는 루틴을 작성하십시오.

자금 선택에서 "Google"만 공급 업체로 추가하십시오!

https://developers.google.com/admob/ump/android/quick-start

모든 것을 계속 실행하려면 여전히 많은 것을 직접 프로그래밍해야하지만이 수업은 적어도 광고가 게재되는지 여부에 관계없이 정보를 얻는 데 도움이 될 것입니다. 또한 이것에 대해 더 깊이 파고 들기 위해 모든 것이 어떻게 작동하는지 스스로에게 알려야합니다.

기억하세요 !!!

admob에서 항상 테스트 ID로 테스트하십시오! 프로덕션 ID를 사용하지 마십시오. 그렇지 않으면 계정에 문제가 발생할 수 있습니다! 먼저 테스트를 수행하려는 경우에만 테스트 ID로 AdMob에서 새 테스트 앱을 만듭니다 !!!

수업 사용 방법 :

Consentfunctions consentfunction; 


consentfunction = new Consentfunctions(this);



// Check if Ads are serving

if (consentfunction.AdsAreServing()) {

// No need to do anything because everything is fine

} else {

// Decide what to do here. Block important functions of your app
//  and open a help page with explanations etc. etc


}

자바 코드 :

public class ConsentFunctions {

private ConsentInformation consentInformation;

SharedPreferences.Editor editor;


  private Context mContext;



private String consinfosaved;

private String vendorconsent;

private SharedPreferences preferences;

private String LegitimateInterests;


public ConsentFunctions(Context context){

    mContext = context;


    preferences = PreferenceManager.getDefaultSharedPreferences(mContext);
    



    consentInformation = UserMessagingPlatform.getConsentInformation(mContext);


}



public Boolean AdsAreServing() {

    vendorconsent = preferences.getString("IABTCF_VendorConsents", "");
    LegitimateInterests = preferences.getString("IABTCF_PurposeLegitimateInterests", "");


    // Not required = not in europe -- return true because everything is fine !
    if (consentInformation.getConsentStatus() == ConsentInformation.ConsentStatus.NOT_REQUIRED) {
        return true;
    }


    Boolean vendoractive = vendorconsent.contains("1");
    consinfosaved = preferences.getString("IABTCF_PurposeConsents", "0");

    switch (consinfosaved) {


        case "1011":    // Personal 1 - rest legitimate interest
        case "1111111011":  // Personal 2
        case "1111001011":  // Personal 3
        case "1000001011":  // Non personal ok
        case "1100001011":  // Non Peronal ok
        case "11":   // Non Personal ok - rest is legitimate interest
        case    "1111001001":
        case "1":  // Non personalized


        {

            // Check also if vendor is activated
            if (!vendoractive) {
                return false;

            }
            else {

                // Legitimate must be always =  0100111011 and vendor contains 1
                if (LegitimateInterests.equals("0100111011") || LegitimateInterests.equals("0100001011"))
                return true;
                else
                    return false;

            }

        }


        default: {


            return false;



        }



    }


}


}

Kotlin 코드 :

class ConsentFunctionsKotlin(private val mContext: Context) {


private val consentInformation: ConsentInformation
var editor: SharedPreferences.Editor


private var consinfosaved: String? = null
private var vendorconsent: String? = null
private val preferences: SharedPreferences
private var LegitimateInterests: String? = null



init {
    preferences = PreferenceManager.getDefaultSharedPreferences(mContext)
   
    consentInformation = UserMessagingPlatform.getConsentInformation(mContext)
}





fun AdsAreServing(): Boolean {
    vendorconsent = preferences.getString("IABTCF_VendorConsents", "")
    LegitimateInterests = preferences.getString("IABTCF_PurposeLegitimateInterests", "")


    // Not required = not in europe -- return true because everything is fine !
    if (consentInformation.consentStatus == ConsentInformation.ConsentStatus.NOT_REQUIRED) {
        return true
    }


    val vendoractive = vendorconsent!!.contains("1")
    consinfosaved = preferences.getString("IABTCF_PurposeConsents", "0")

    return when (consinfosaved) {
        "1111001001","1011", "1111111011", "1111001011", "1000001011", "1100001011", "11", "1" -> {


            // Check also if vendor is activated
            if (!vendoractive) {
                false
            } else {

                // Legitimate must be always =  0100111011 and vendor contains 1
                if (LegitimateInterests == "0100111011" || LegitimateInterests == "0100001011") true else false
            }
        }
        else -> {
            false
        }
    }


}

}