새로운 Android 용 통합 메시징 플랫폼 SDK를 사용하여 개인 맞춤이 아닌 AdMob 광고를 요청하는 방법
현재 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 일 수정
나는 이 게시물에있는 것과 같은 질문을 하는 새로운 대화를 시작 했지만 아무런 응답이 없습니다.
답변
새로운 통합 메시징 플랫폼을 통해 Google은 동의 관리 플랫폼 역할을하고 있습니다. 이러한 CMP는 TCF 문자열을 사용하여 사용자 동의 기본 설정을 저장합니다. Google은이 TCF 문자열을 확인하여 어떤 광고를 표시 할 수 있는지 확인합니다.
Google 문서에 따라 :
Google은 다음 기준이 모두 충족되면 개인 맞춤 광고를 게재합니다.
- 최종 사용자는 Google이 기기에 정보를 저장 및 / 또는 액세스하는 것에 동의합니다.
- 개인 맞춤 광고 프로필 만들기
- 개인 맞춤 광고 선택
그리고 Google이 다음을 수행 할 수 있도록 합법적 인 이해 (또는 게시자가 CMP를 구성하는 경우 동의)가 설정됩니다.
- 기본 광고 선택
- 광고 실적 측정
- 시장 조사를 적용하여 청중 인사이트 생성
- 제품 개발 및 개선
개인 맞춤 광고에 대한 동의 요구 사항이 충족되지 않으면 Google은 다음 기준이 모두 충족 될 때 개인 맞춤이 아닌 광고를 게재 합니다.
- 장치에 정보 저장 및 / 또는 액세스
Google이 다음을 수행 할 수 있도록 합법적 인 이해 (또는 게시자가 CMP를 구성하는 경우 동의)가 설정됩니다.
- 기본 광고 선택
-
광고 실적 측정 -
시장 조사를 적용하여 청중 인사이트 생성 -
제품 개발 및 개선 - 공급 업체 목록에서 Google을 활성화합니다.
10 월 20 일 업데이트 :이 정보를 제공하기 위해 비 개인 광고 SO @Georg를 표시하는 데 더 이상 3,4,5가 필요하지 않습니다.
위의 조건이 충족되지 않으면 Google에 광고가 게재되지 않습니다.
이 정보가 귀하의 질문에 답하기를 바라지 만 더 많은 정보가 필요하면 알려주십시오!
다음 문장을 기억하십시오.
절대 포기하지 마시고 잔은 항상 반쯤 찼습니다 :-)-> 낙관적이 되십시오!
따라서 유럽에서 유효한 것을 변경할 수있는 해결책이 더 이상 존재하지 않을 것입니다. 우리가 할 수있는 일은 다음과 같습니다.
사용자가 자금 선택 양식에서 "동의"를 누르거나 "제출"을 누르면 대화 상자가 닫힐 때 일부 매개 변수가 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
}
}
}
}