【问题标题】:Who do I pick as my Admob ad technology providers我选择谁作为我的 Admob 广告技术提供商
【发布时间】:2018-05-23 15:36:13
【问题描述】:

根据 GDPR,Google 表示我必须“选择广告技术提供商”并征得用户的同意。但是,如果任何发布商 ID 使用常用的一组广告技术提供商,则不支持 Google 呈现的同意书。这意味着我需要为我的帐户手动选择广告技术提供商,以避免使用“使用发布商管理的同意收集选项”自行收集同意。这里我是空白的。

我应该选择哪些,如果我不使用中介而只使用 admob 会有什么不同?我应该只使用一个提供商,即 Google 吗?

编辑:感谢您的反对。老实说,我不明白为什么这不是一个有效的问题,只是也许应该在其他地方问这个问题,为此我寻求指导。

【问题讨论】:

  • 我也想知道这个。我赞成你的问题。如果您找到答案,也请在此处发布。
  • 我也想知道为什么它被否决了?我赞成,如果您找到任何解决方案,请在此处发布
  • 赞成。我最终做了自己的表格并使用了所有的提供者。
  • @usman 你能发一个你的例子吗?所以我可以看到要发生的事情,非常感谢
  • 我已经用所有相关代码写了一个答案。请检查一下。

标签: admob cookieconsent


【解决方案1】:

一个星期以来,我一直试图回答自己这个问题。 我就是这样做的。

检查您的 Adsense 帐户,转至“高级报告”>“广告网络”,您将看到您的应用从中获得广告的所有广告技术提供商,这应该让您了解哪些广告提供商会比较好给你。

如果您的应用是新应用并且没有任何数据,我建议您只使用 Google(默认)。

在我的特殊情况下,我的应用已经运行了 8 个月,有 450 次安装和 45 次有效安装。

Google Networks 报告的展示次数为 91.5%,估算收入为 97.3%。

当用户想要查看应用程序与谁共享信息时,IMO 将 Google 作为唯一一个提供商会更好看,而不是列出 12 个从未听说过的列表。一开始我想选择最好的 12 个,但从数字上看没有多大意义,我选择单独使用 Google。

免责声明:我对 Ad Networks 一无所知,我选择 Google 是因为我的 Admob 历史,没有别的。

【讨论】:

  • 确实,唯一的选择标准是收入。为此,正如您所解释的那样,AdSense 是唯一能够向我们提供此信息的公司。谢谢!
  • 您好,有没有人了解更多,如果我们只使用 AdMob,为什么还要选择其他广告技术合作伙伴?如果 admob 只支持大约 30 个中介合作伙伴,为什么会有这么多广告技术合作伙伴?
【解决方案2】:

您所说的“Google 呈现的同意书”是 Google 制作的一个开源库,用于显示和收集用户的同意书。

根据 GDRP,此同意书应显示所有 admob 提供商的隐私政策。但是这个库最多只能显示 12 个提供者。

所以你有3个选择:

1- 您限制自己使用 12 个 admob 提供程序。

2- 您自己制作同意书。

3- 您从 github 下载谷歌图书馆同意书并修改它以显示所有广告提供商

【讨论】:

  • 是的,我们可以将自己限制为 12 个提供者,但是哪些提供者呢?这正是他的问题:我们如何才能选择正确的广告技术提供商?依据哪些标准?无论如何,我认为拥有数百个提供商并不是一个好主意...
  • 我们专门使用 Admob 进行广告投放。我们的广告技术供应商名单接近 400 家供应商。用户会喜欢它的;(
  • @user1608385 你将如何处理这个问题?您要创建自己的 cmp 表单吗?我很感兴趣,因为我想展示超过 12 个广告技术合作伙伴,但不知道如何去做
  • 在本页底部developers.google.com/admob/android/eu-consent 上面写着FAQ Consent SDK 支持多少个广告技术提供商? Consent SDK 不限制发布商选择启用的广告技术提供商的数量。人们在哪里得到这个 12 的限制?
  • @izzyMachado 好吧,因为我们只使用 Admob,看起来 Google/Admob 之外的供应商被 Admob 调用来提供广告技术,所以我们决定只展示 Google/Admob。然后,用户可以点击 Google 链接来查看他们的隐私政策并识别 Admob 调用的任何 3 或 4 方广告技术提供商。
【解决方案3】:

好的,所以我最终实施了自己的同意机制。我认为它符合要求,所以为了他人的利益,这里是:

首先,声明这些变量。这些将用于决定您是否需要出示同意书:

boolean shouldShowConsentForm = false;
boolean goAdFreeChosen = false; // to prevent firing the consent dialog when going into settings.

使用此方法告诉用户您将征求同意:

void showConsentDialogIntro(final Context context) {
    Bundle params = new Bundle();
    params.putString("what", "showConsentDialogIntro");
    mFirebaseAnalytics.logEvent(CONSENT_COLLECTION, params);

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setTitle("Something important before you continue...").
            setMessage("This app is kept free by showing ads. Tap next to see privacy options regarding this.\n\n(You can change this later in Settings too)").
            setPositiveButton("Next", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    showYesNoDialog(context, true);
                }
            })
            //.setNegativeButton("Cancel", null)
            .show();
}

那么此方法会给用户 3 个选择 - 同意、不同意或完全删除广告:

private void showYesNoDialog(final Context context, boolean shouldReportInFirebase) {
    if (shouldReportInFirebase) {
        Bundle params = new Bundle();
        params.putString("what", "showYesNoDialog");
        mFirebaseAnalytics.logEvent(CONSENT_COLLECTION, params);
    }

    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    final CharSequence[] items = {"Yes - Shows relevant ads", "No - Shows less relevant ads", "Go Ad free",
            "Learn how our partners collect and use your data"};
    builder.setTitle("Can THIS_APP_NAME use your data to tailor ads for you?").
            setItems(items, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Bundle params = new Bundle();
                    switch (which) {
                        case 0: // yes
                            ConsentInformation.getInstance(context)
                                    .setConsentStatus(ConsentStatus.PERSONALIZED);
                            shouldShowConsentForm = false;

                            mInterstitialAd.loadAd(new AdRequest.Builder()
                                    .addTestDevice(TEST_DEVICE_FOR_ADS)
                                    .build());

                            params.putString("what", "yes");
                            break;
                        case 1: // no
                            ConsentInformation.getInstance(context)
                                    .setConsentStatus(ConsentStatus.NON_PERSONALIZED);
                            shouldShowConsentForm = false;

                            Bundle extras = new Bundle();
                            extras.putString("npa", "1");
                            mInterstitialAd.loadAd(new AdRequest.Builder()
                                    .addNetworkExtrasBundle(AdMobAdapter.class, extras)
                                    .addTestDevice(TEST_DEVICE_FOR_ADS)
                                    .build());

                            params.putString("what", "no");

                            Snackbar.make(myToolbar, "We'll partner with Google and use a unique identifier to respect your choice.",
                                    Snackbar.LENGTH_LONG).addCallback(new BaseTransientBottomBar.BaseCallback<Snackbar>() {
                                @Override
                                public void onDismissed(Snackbar transientBottomBar, int event) {
                                    super.onDismissed(transientBottomBar, event);
                                    Snackbar.make(myToolbar, "You can change your choice later in Settings.", Snackbar.LENGTH_LONG).show();
                                }
                            })
                                    //.setDuration(3500)
                                    .show(); // 3500 is perhaps the duration for LENGTH_LONG.
/*
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    Snackbar.make(myToolbar, "You can change your choice later in Settings.", Snackbar.LENGTH_LONG).show();
                                }
                            }, 3500);
*/
                            break;
                        case 2: // ad free
                            // drawer.setSelection(settings, true);
                            goAdFreeChosen = true;
                            drawer.setSelection(DRAWER_IDENTIFIER_SETTINGS, true);

                            params.putString("what", "ad_free");
                            break;
                        case 3: // learn more
                            showLearnMoreDialog(context);

                            params.putString("what", "showLearnMoreDialog");
                            break;
                    }
                    mFirebaseAnalytics.logEvent(CONSENT_COLLECTION, params);
                }
            })
            // .setNegativeButton("Cancel", null)
            .show();
}

如果用户点击了解更多(上面菜单中的第 4 个选项),他们将看到所有提供商的列表,他们可以点击以查看各自的隐私政策:

private void showLearnMoreDialog(final Context context) {
    List<AdProvider> adProviders =
            ConsentInformation.getInstance(context).getAdProviders();

    final CharSequence[] itemsName = new CharSequence[adProviders.size()];
    final String[] itemsURL = new String[adProviders.size()];

    int i = 0;
    for (AdProvider adProvider : adProviders) {

        itemsName[i] = adProvider.getName();
        itemsURL[i] = adProvider.getPrivacyPolicyUrlString();
        i++;
    }

    ArrayAdapter adapter = new ArrayAdapter<>(context,
            android.R.layout.simple_list_item_1, itemsName);

    AlertDialog.Builder builder = new AlertDialog.Builder(context);

    builder.setTitle("Tap on our partners to learn more about their privacy policies")
            .setNegativeButton("Back", null)
            .setSingleChoiceItems(adapter, -1, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                            /*        Toast.makeText(context,
                                            "URL: " + itemsURL[which].toExternalForm(), Toast.LENGTH_SHORT).show();*/
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW,
                            Uri.parse(itemsURL[which]));
                    startActivity(browserIntent);

                    Bundle params = new Bundle();
                    params.putString("what", "showLearnMoreDialog_open_privacy_policy");
                    mFirebaseAnalytics.logEvent(CONSENT_COLLECTION, params);
                }
            })
            .setCancelable(true)
            .setOnDismissListener(new DialogInterface.OnDismissListener() {
                @Override
                public void onDismiss(DialogInterface dialog) {
                    showYesNoDialog(context, false);
                }
            })
            .show();
}

请注意,我也在其中实现了 firebase 分析,但如果您不想记录这些事件,可以删除与“params”相关的行。

您可以使用此方法查看同意状态:

private void getConsentStatusAndLoadAdAccordingly(final Context context) {
    ConsentInformation consentInformation = ConsentInformation.getInstance(context);
    //   consentInformation.addTestDevice(TEST_DEVICE_FOR_ADS);
    //   consentInformation.setDebugGeography(DebugGeography.DEBUG_GEOGRAPHY_EEA); // for forcing Europe area; testing.
    //   consentInformation.setConsentStatus(ConsentStatus.UNKNOWN); // useful for triggering it after saving status; testing.

    String[] publisherIds = {MY_PUBLISHER_ID};
    consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() {
        @Override
        public void onConsentInfoUpdated(ConsentStatus consentStatus) {
            loog("consentInformation", "onConsentInfoUpdated");
            // User's consent status successfully updated.
            if (ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()) {
                loog("consentInformation", "isRequestLocationInEeaOrUnknown = true");
                    /* If the isRequestLocationInEeaOrUnknown() method returns false, the user is not
                    located in the European Economic Area and consent is not required under the EU User Consent Policy.

                    If the isRequestLocationInEeaOrUnknown() method returns true:
                    If the returned ConsentStatus is PERSONALIZED or NON_PERSONALIZED, the user has already provided consent.
                    You can now forward consent to the Google Mobile Ads SDK.
                    If the returned ConsentStatus is UNKNOWN, you need to collect consent. */
                loog("consentInformation", "consentStatus = " + consentStatus);

                if (consentStatus == ConsentStatus.UNKNOWN) {
                    // showGoogleConsentForm(DrawerAndFragmentActivity.this);
                    shouldShowConsentForm = true;
                } else if (consentStatus == ConsentStatus.NON_PERSONALIZED) {
                        /* The default behavior of the Google Mobile Ads SDK is to serve personalized ads. If a user
                    has consented to receive only non-personalized ads, you can configure an AdRequest object
                    with the following code to specify that only non-personalized ads should be returned: */
                    Bundle extras = new Bundle();
                    extras.putString("npa", "1");
                    mInterstitialAd.loadAd(new AdRequest.Builder()
                            .addNetworkExtrasBundle(AdMobAdapter.class, extras)
                            .addTestDevice(TEST_DEVICE_FOR_ADS)
                            .build());
                } else if (consentStatus == ConsentStatus.PERSONALIZED) {
                    mInterstitialAd.loadAd(new AdRequest.Builder()
                            .addTestDevice(TEST_DEVICE_FOR_ADS)
                            .build());
                }
            } else {
                loog("consentInformation", "isRequestLocationInEeaOrUnknown = false");
                mInterstitialAd.loadAd(new AdRequest.Builder()
                        .addTestDevice(TEST_DEVICE_FOR_ADS)
                        .build());
            }
        }

        @Override
        public void onFailedToUpdateConsentInfo(String errorDescription) {
            // User's consent status failed to update.
            loog("consentInformation", "onFailedToUpdateConsentInfo: errorDescription = " + errorDescription);

            mInterstitialAd.loadAd(new AdRequest.Builder()
                    .addTestDevice(TEST_DEVICE_FOR_ADS)
                    .build());
        }
    });
}

最后,当您需要决定是展示广告还是展示同意书时,您可以使用如下逻辑:(shouldShowAd 是一个可选的布尔值,为了更清晰,我喜欢使用它)

if (shouldShowAd) {
                            if (shouldShowConsentForm) {
                                if (!goAdFreeChosen)
                                    showConsentDialogIntro(DrawerAndFragmentActivity.this);
                                goAdFreeChosen = false;
                            } else {
                                if (mInterstitialAd != null)
                                    if (mInterstitialAd.isLoaded()) {
                                        mInterstitialAd.show();
                                    }
                            }
                        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多