วิธีขอโฆษณา AdMob ที่ไม่ได้ปรับให้เหมาะกับแต่ละบุคคลด้วย Unified Messaging Platform SDK ใหม่สำหรับ Android

Aug 18 2020

ฉันกำลังใช้ไลบรารีคำยินยอมของ Google (เลิกใช้แล้ว) เพื่อขอคำยินยอมสำหรับโฆษณาที่ปรับตามโปรไฟล์ของผู้ใช้ในยุโรป เอกสารประกอบระบุว่าหากสถานะการยินยอมของผู้ใช้ถูกตั้งค่าเป็น PERSONALIZED หรือ NON_PERSONALIZED แล้วคุณสามารถส่งต่อคำยินยอมไปยัง SDK โฆษณาบนอุปกรณ์เคลื่อนที่ของ Googleด้วย:

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

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

ตอนนี้ผมต้องการที่จะย้ายไปอยู่ที่ใหม่แบบครบวงจรแพลตฟอร์มการส่งข้อความ SDK สำหรับ Android เอกสารนี้ค่อนข้างตรงไปตรงมา แต่จะอธิบายวิธีขอความยินยอมเท่านั้นไม่ใช่วิธีใช้คำยินยอม นี้ไม่ได้หมายความว่าเมื่อใช้ SDK ขานใหม่สำหรับ Android ของเราไม่ได้มีการตั้งค่า"npa"เป็น"1"เมื่อขอโฆษณา AdMob สำหรับผู้ใช้ที่ไม่ยินยอมให้มีการโฆษณาที่ปรับเปลี่ยน?


แก้ไข 25 ส.ค. 2563

เมื่อวานนี้ฉันพบบทสนทนานี้ซึ่งมีคนจากทีม SDK โฆษณาบนอุปกรณ์เคลื่อนที่ตอบคำถามเดียวกันกับที่ฉันถามที่นี่ เขาบอกว่า:

"การส่งต่อความยินยอม" แบบเดิมผ่านnpa = 1จะได้รับเกียรติจาก SDK ของเราจนกว่าจะมีการแจ้งให้ทราบต่อไป


แก้ไข 31 ส.ค. 2563

ฉันเริ่มการสนทนาใหม่โดยถามคำถามเดียวกันกับคำถามในโพสต์นี้ แต่ไม่ได้รับคำตอบใด ๆ

คำตอบ

1 Alexander Oct 07 2020 at 21:12

ด้วยแพลตฟอร์มการส่งข้อความใหม่ Unified Google จะทำงานเป็นแพลตฟอร์มผู้จัดการได้รับความยินยอม CMP เหล่านี้ใช้สตริง TCF เพื่อจัดเก็บค่ากำหนดความยินยอมของผู้ใช้ Google ตรวจสอบสตริง TCF นี้เพื่อดูว่าโฆษณาใดสามารถแสดงได้

ตามเอกสารของ Google :

Google จะแสดงโฆษณาที่ปรับให้เหมาะกับแต่ละบุคคลเมื่อเป็นไปตามเกณฑ์ทั้งหมดต่อไปนี้:

  1. ผู้ใช้ปลายทางให้ความยินยอมจาก Google ในการจัดเก็บและ / หรือเข้าถึงข้อมูลบนอุปกรณ์
  2. สร้างโปรไฟล์โฆษณาในแบบของคุณ
  3. เลือกโฆษณาที่ปรับให้เหมาะกับแต่ละบุคคล

และผลประโยชน์โดยชอบด้วยกฎหมาย (หรือคำยินยอมที่ผู้เผยแพร่กำหนดค่า CMP ของตนเพื่อขอ) กำหนดให้ Google:

  1. เลือกโฆษณาพื้นฐาน
  2. วัดประสิทธิภาพโฆษณา
  3. ใช้การวิจัยตลาดเพื่อสร้างข้อมูลเชิงลึกของผู้ชม
  4. พัฒนาและปรับปรุงผลิตภัณฑ์

หากไม่ตรงตามข้อกำหนดการยินยอมสำหรับโฆษณาที่ปรับให้เหมาะกับแต่ละบุคคล Google จะแสดงโฆษณาที่ไม่ได้ปรับให้เหมาะกับแต่ละบุคคลเมื่อเป็นไปตามเกณฑ์ทั้งหมดต่อไปนี้:

  1. จัดเก็บและ / หรือเข้าถึงข้อมูลบนอุปกรณ์

ผลประโยชน์โดยชอบด้วยกฎหมาย (หรือคำยินยอมซึ่งผู้เผยแพร่กำหนดค่า CMP ของตนเพื่อขอ) กำหนดขึ้นเพื่อให้ Google:

  1. เลือกโฆษณาพื้นฐาน
  2. วัดประสิทธิภาพโฆษณา
  3. ใช้การวิจัยตลาดเพื่อสร้างข้อมูลเชิงลึกของผู้ชม
  4. พัฒนาและปรับปรุงผลิตภัณฑ์
  5. เปิดใช้งาน Google ในรายชื่อผู้ให้บริการ

อัปเดต 20 ตุลาคม: ไม่จำเป็นต้องใช้ 3,4,5 อีกต่อไปเพื่อแสดงโฆษณาที่ไม่ใช่ส่วนบุคคล SO @Georg เพื่อให้ข้อมูลนี้

หากไม่ตรงตามเงื่อนไขข้างต้น 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

เราต้องการคีย์ pref ต่อไปนี้เพื่ออ่าน (Android หรือ IOS):

IABTCF_PurposeLegitimateInterests

IABTCF_VendorConsents

IABTCF_PurposeConsents

ดังนั้นขึ้นอยู่กับค่าเหล่านี้เราสามารถตรวจสอบได้ว่ามีการแสดงโฆษณาหรือโฆษณา "ไม่" แสดงหลังจากปิดแบบฟอร์ม

จากนั้นคุณสามารถบล็อกตัวเลือกที่สำคัญในแอปของคุณและอาจแสดงกล่องโต้ตอบ:

"โฆษณาถูกปิดใช้งานคุณกำลังใช้แอปเวอร์ชัน light อยู่ในขณะนี้คุณสามารถเปลี่ยนใจหรือซื้อเวอร์ชันโปร ฯลฯ เป็นต้น"

-> อาจเพิ่มปุ่มหลังจากคำอธิบาย "เปิดใช้งานโฆษณา" และแสดงแบบฟอร์มอีกครั้งหรือ "ซื้อ Pro"

ขึ้นอยู่กับว่าคุณมาทำอะไรที่นี่!

ชั้นเรียนของฉันอยู่ใน kotlin หรือ java!

สิ่งที่คุณต้องทำ: ใส่ UMP SDK จาก Google เพื่อการพึ่งพาของคุณในการไล่ระดับและตั้งค่าตัวเลือกการระดมทุนสำหรับแอปของคุณในบัญชีผู้ดูแลระบบของคุณ! จากนั้นเขียนกิจวัตรของคุณเพื่อตั้งค่าแบบฟอร์มตัวเลือกการระดมทุน

ในการเลือกระดมทุนเพิ่มเฉพาะ "Google" เป็นผู้ให้บริการ!

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

คุณยังต้องตั้งโปรแกรมหลาย ๆ อย่างด้วยตัวเองเพื่อให้ทุกอย่างทำงานต่อไป แต่อย่างน้อยชั้นเรียนนี้จะช่วยให้คุณได้รับข้อมูลว่ามีการแสดงโฆษณาหรือไม่ นอกจากนี้คุณต้องแจ้งให้ตัวเองทราบว่าทุกอย่างทำงานอย่างไรเพื่อเจาะลึกเรื่องนี้

จำไว้ !!!

ทดสอบด้วยรหัสทดสอบใน admob เสมอ !! อย่าใช้รหัสการผลิตมิฉะนั้นคุณอาจมีปัญหากับบัญชีของคุณ! สร้างแอปทดสอบใหม่ใน 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


}

รหัส Java:

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
        }
    }


}

}