web-dev-qa-db-fra.com

Qui dois-je choisir comme fournisseur de technologie publicitaire Admob?

Conformément au GDPR, Google déclare que je dois "sélectionner les fournisseurs de technologies publicitaires" et obtenir le consentement des utilisateurs. Toutefois, le formulaire de consentement rendu par Google n'est pas pris en charge si l'un des ID d'éditeur utilise l'ensemble de fournisseurs de technologie publicitaire couramment utilisés. Cela signifie que je dois choisir manuellement les fournisseurs de technologies publicitaires pour mon compte afin d'éviter de collecter le consentement moi-même avec l'option "avec l'option de collecte du consentement gérée par l'éditeur". Ici je suis vide.

Lesquels dois-je choisir et quelle différence cela fait-il si je n'utilise pas la médiation et n'utilise que l'admob? Devrais-je utiliser un seul fournisseur, c'est-à-dire Google?

Edit: Merci pour les votes négatifs. Honnêtement, je ne vois pas pourquoi cette question n’est pas valable, si ce n’est peut-être parce qu’elle aurait dû être posée ailleurs, pour laquelle je cherche des conseils.

16
Usman

Cela fait déjà une semaine que j'essaie de répondre à cette question moi-même… C'est ce que je fais.

Vérifiez votre compte Adsense, accédez à "Rapports avancés"> "Réseaux publicitaires". Tous les fournisseurs de technologies publicitaires à l'origine de votre application, qui devraient vous donner une idée, devraient vous donner une idée des fournisseurs qui pourraient vous intéresser.

Si votre application est nouvelle et ne contient aucune donnée, je vous conseillerais de n'utiliser que Google (par défaut).

Dans mon cas particulier, mon application est active depuis 8 mois avec 450 installations et 45 installations actives.

Google Networks rapporte 91,5% d'impressions et 97,3% de revenus estimés.

L’OMI ayant Google comme fournisseur unique semblera mieux lorsque l’utilisateur voudra savoir avec qui l’application partage des informations, au lieu d’avoir une liste de 12 dont on n’a jamais entendu parler. Au début, je pensais choisir les 12 meilleurs, mais d'après les chiffres, cela n'a aucun sens et j'ai choisi de s'en tenir à Google seul.

AVERTISSEMENT: je ne sais rien en ce qui concerne Ad Networks et j'ai choisi Google en raison de mon histoire Admob et rien d'autre.

4
Racu

Ce que vous appelez "formulaire de consentement rendu par Google" est une bibliothèque open source créée par Google pour montrer et collecter le consentement des utilisateurs. 

Selon le GDRP, ce formulaire de consentement devrait montrer la politique de confidentialité de tous les fournisseurs d'admob. Mais cette bibliothèque est limitée à 12 fournisseurs. 

Donc vous avez 3 options: 

1- Vous vous limitez à utiliser 12 fournisseurs d'admob.

2- Vous faites votre propre formulaire de consentement.

3- Vous téléchargez le formulaire de consentement de la bibliothèque Google à partir de github et le modifiez pour afficher tous les fournisseurs d'annonces.

1
Simon

Ok, j'ai donc mis en place mon propre mécanisme de consentement. Je pense que cela répond aux exigences, donc pour le bénéfice des autres, le voici:

Commencez par déclarer ces variables. Ceux-ci seront utilisés pour décider si vous devez montrer un formulaire de consentement:

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

Utilisez cette méthode pour informer l'utilisateur que vous allez demander son consentement:

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();
}

Ensuite, cette méthode donnera à l'utilisateur 3 choix - Donner son consentement, ne donne pas son consentement, ou supprimer complètement les annonces:

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();
}

Si l'utilisateur appuie sur En savoir plus (la 4ème option du menu ci-dessus), une liste de tous les fournisseurs à laquelle il pourra accéder pour afficher ses politiques de confidentialité lui sera présentée:

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();
}

Notez que j’y ai également implémenté l’analyse firebase, mais vous pouvez supprimer les lignes relatives à "params" si vous ne souhaitez pas enregistrer ces événements.

Vous pouvez voir le statut du consentement en utilisant cette méthode:

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());
        }
    });
}

Enfin, lorsque vous devez choisir d'afficher une annonce ou un formulaire de consentement, vous pouvez utiliser une logique comme celle-ci: (shouldShowAd est un booléen facultatif que j'aime bien mettre pour plus de clarté)

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