Android用の新しいUnifiedMessaging PlatformSDKを使用してパーソナライズされていないAdMob広告をリクエストする方法

Aug 18 2020

現在、Googleの(非推奨の)同意ライブラリを使用して、ヨーロッパのユーザーにパーソナライズされた広告の同意をリクエストしています。ドキュメントでは、ユーザーの同意ステータスがすでにPERSONALIZEDまたはNON_PERSONALIZEDに設定されている場合、次の方法でGoogle Mobile AdsSDKに同意を転送できると指定されています

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

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

次に、Android用の新しいUnified Messaging PlatformSDKに移行します。ドキュメントは非常に単純ですが、同意の使用方法ではなく、同意の取得方法のみを説明しています。これは、Android用の新しいUMP SDKを使用するときに、パーソナライズされた広告に同意しなかったユーザーにAdMob広告をリクエストするときにisを設定する必要がなくなったことを意味しますか?"npa""1"


2020年8月25日編集

昨日、Mobile Ads 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. パーソナライズされた広告を選択する

そして、正当な利益(または発行者がCMPを要求するように構成する場合は同意)は、Googleが次のことを行うために確立されます。

  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でも起こっています(したがって、誰もがこのソリューションをすばやく簡単にプログラムできます

以前のように、限定されたアプリを提供することは「私たちの」権利です。つまり、以前と同じように、制限付きのライトバージョンと購入するフルバージョンを提供できます。

したがって、私たちにできることは、設定キーを読み取ることです。

透明性と同意のフレームワークの設定キーについては、次のとおりです。 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


}

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


}

}