webentwicklung-frage-antwort-db.com.de

Wen wähle ich als Anbieter von Admob-Anzeigentechnologie aus?

In Übereinstimmung mit der DSGVO sagt Google, dass ich "Anbieter von Werbetechnologien auswählen" und die Zustimmung der Nutzer einholen muss. Das von Google erteilte Einwilligungsformular wird jedoch nicht unterstützt, wenn eine der Publisher-IDs die häufig verwendeten Anbieter von Werbetechnologien verwendet. Dies bedeutet, dass ich manuell Anzeigenanbieter für mein Konto auswählen muss, um zu vermeiden, dass ich selbst mit der Option "Mit der vom Publisher verwalteten Einwilligungserfassungsoption" die Einwilligung einholen muss. Hier bin ich leer.

Welche sollte ich wählen und welchen Unterschied macht es, wenn ich keine Mediation und nur Admob benutze? Sollte ich nur einen Anbieter verwenden, z. B. Google?

Edit: Danke für die Downvotes. Ich verstehe ehrlich gesagt nicht, warum dies keine gültige Frage ist, außer, dass diese Frage vielleicht an anderer Stelle hätte gestellt werden müssen, für die ich Anleitung suche.

16
Usman

Ich habe schon seit einer Woche versucht, mir diese Frage zu beantworten ... Das mache ich.

Schauen Sie in Ihrem Adsense-Konto nach, gehen Sie zu "Erweiterte Berichte"> "Werbenetzwerke" und Sie sehen alle Anbieter von Anzeigentechnologien, von denen Ihre App Anzeigen erhalten hat. Diese sollten Ihnen einen Eindruck davon vermitteln, welche Anzeigenanbieter für Sie gut sind.

Wenn Ihre App neu ist und keine Daten enthält, würde ich vorschlagen, nur mit Google zu gehen (Standardeinstellung).

In meinem speziellen Fall ist meine App mit 450 Installationen und 45 aktiven Installationen seit 8 Monaten verfügbar.

Google Networks berichtet von 91,5% bei den Impressionen und 97,3% bei den geschätzten Einnahmen.

IMO, bei dem Google nur ein Anbieter ist, sieht besser aus, wenn der Nutzer sehen möchte, mit wem die App Informationen austauscht, anstatt eine Liste von 12 zu haben, von denen noch nie etwas gehört wurde. Am Anfang dachte ich über die Wahl der besten 12 nach, aber aufgrund der Zahlen macht es keinen Sinn und entschied sich, bei Google alleine zu bleiben.

HAFTUNGSAUSSCHLUSS: Ich weiß nichts über Ad Networks und wähle Google aufgrund meiner Admob-Historie und sonst nichts.

4
Racu

Was Sie "von Google erteilte Einwilligungserklärung" nennen, ist eine Open-Source-Bibliothek, die von Google erstellt wurde, um die Zustimmung der Nutzer zu zeigen und einzuholen. 

Laut GDRP sollte dieses Einwilligungsformular die Datenschutzbestimmungen aller Anbieter von Admobs enthalten. Diese Bibliothek ist jedoch auf 12 Anbieter beschränkt. 

Sie haben also 3 Möglichkeiten: 

1- Sie beschränken sich auf 12 Admob-Anbieter.

2- Sie machen Ihre eigene Einwilligungserklärung.

3- Sie laden das Google Library-Einwilligungsformular von github herunter und ändern es, um alle Anzeigenanbieter anzuzeigen

1
Simon

Ok, also habe ich meinen eigenen Einwilligungsmechanismus implementiert. Ich denke, dass es den Anforderungen entspricht, also für andere, hier ist es:

Zuerst deklarieren Sie diese Variablen. Diese werden verwendet, um zu entscheiden, ob Sie das Einverständnisformular vorlegen müssen:

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

Verwenden Sie diese Methode, um dem Benutzer mitzuteilen, dass Sie um Einwilligung bitten werden:

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

Dann gibt diese Methode dem Benutzer 3 Wahlmöglichkeiten - Erlauben Sie Ihre Einwilligung, geben Sie keine Einwilligung ab oder entfernen Sie Anzeigen vollständig:

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

Wenn der Benutzer auf Learn More (die vierte Option im Menü oben) tippt, wird ihm eine Liste aller Anbieter angezeigt, auf die er zugreifen kann, um seine jeweiligen Datenschutzbestimmungen anzuzeigen:

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

Beachten Sie, dass ich hier auch Firebase-Analysen implementiert habe. Sie können jedoch die Zeilen zu "params" entfernen, wenn Sie diese Ereignisse nicht protokollieren möchten.

Sie können den Status der Einwilligung mit dieser Methode anzeigen:

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

Wenn Sie sich entscheiden müssen, ob Sie eine Anzeige anzeigen oder ein Einverständnisformular anzeigen lassen möchten, können Sie eine Logik wie folgt verwenden:

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