Jetzt loslegen

Gemäß der Google-Einwilligung der Nutzer in der EU verwenden, müssen Sie Sie müssen Ihren Nutzern im Europäischen Wirtschaftsraum (EWR) bestimmte Informationen offenlegen, mit dem Vereinigten Königreich und holen ihre Zustimmung zur Verwendung von Cookies oder anderen Formen der lokalen Speicherung ein, sofern dies gesetzlich vorgeschrieben ist, sowie um personenbezogene Daten wie die Werbe-ID (z. B. die Werbe-ID) für die Anzeigenauslieferung zu verwenden. Die Richtlinie entspricht den Anforderungen der EU-Datenschutzrichtlinie für elektronische Kommunikation und der EU-Datenschutz-Grundverordnung (DSGVO) gilt.

Google möchte Publisher bei der Umsetzung dieser Richtlinie unterstützen. das User Messaging Platform (UMP) SDK. Das UMP SDK wurde aktualisiert, um IAB-Standards. All diese Konfigurationen lassen sich in der AdMob Datenschutz- und Messaging.

Vorbereitung

  • Android API-Level 21 oder höher (für Android)

Mitteilungstyp erstellen

Erstellen Sie Nutzermitteilungen mit einer der verfügbare Mitteilungstypen für Nutzer Datenschutz- und Messaging auf Ihrem AdMob Konto. Das UMP SDK versucht, eine Nutzernachricht erstellt aus AdMob Anwendungs-ID die in Ihrem Projekt festgelegt sind. Wenn für Ihre Anwendung keine Meldung konfiguriert ist, gibt einen Fehler zurück.

Weitere Informationen finden Sie unter Datenschutz und Mitteilungen

SDK Installieren

  1. Befolgen Sie die Anleitung zur Installation der Google Mobile Ads (GMA) C++- SDK. Die UMP C++ Das SDK ist im GMA C++ SDK enthalten.

  2. Konfigurieren Sie die AdMob-App Ihrer App. ID im Projekt ein. bevor Sie fortfahren.

  3. Initialisieren Sie in Ihrem Code das UMP SDK, indem Sie ConsentInfo::GetInstance()

    • Unter Android müssen Sie die JNIEnv und Activity übergeben, die von das NDK. Das müssen Sie nur beim ersten Aufruf von GetInstance() tun.
    • Wenn Sie bereits die Firebase C++- SDK in Ihrer App platzieren, können Sie beim ersten Anruf bei GetInstance() in einem firebase::App.
    #include "firebase/gma/ump.h"
    
    namespace ump = ::firebase::gma::ump;
    
    // Initialize using a firebase::App
    void InitializeUserMessagingPlatform(const firebase::App& app) {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance(app);
    }
    
    // Initialize without a firebase::App
    #ifdef ANDROID
    void InitializeUserMessagingPlatform(JNIEnv* jni_env, jobject activity) {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance(jni_env, activity);
    }
    #else  // non-Android
    void InitializeUserMessagingPlatform() {
      ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();
    }
    #endif
    

Die nachfolgenden ConsentInfo::GetInstance()-Aufrufe geben alle dieselbe Instanz zurück.

Wenn Sie das UMP SDK nicht mehr benötigen, können Sie es beenden, indem Sie die ConsentInfo-Instanz:

void ShutdownUserMessagingPlatform() {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();
  delete consent_info;
}

Future zum Überwachen asynchroner Vorgänge verwenden

A firebase::Future bietet Ihnen die Möglichkeit, den Abschlussstatus der asynchronen Methode zu bestimmen. Anrufe.

Alle UMP C++-Funktionen und -Methodenaufrufe, die asynchron arbeiten, geben einen Future und geben Sie außerdem ein "letztes Ergebnis" an. Funktion zum Abrufen von Future aus dem letzten Vorgang.

Es gibt zwei Möglichkeiten, ein Ergebnis aus einem Future zu erhalten:

  1. Rufen Sie uns unter OnCompletion() an. übergeben Sie Ihre eigene Callback-Funktion, die aufgerufen wird, wenn der Vorgang abgeschlossen wird.
  2. Prüfe regelmäßig die status() von Future. Wenn der Parameter Status ändert sich von kFutureStatusPending zu kFutureStatusCompleted, die abgeschlossen ist.

Nachdem der asynchrone Vorgang abgeschlossen ist, sollten Sie die error() von Future, um den Vorgangsfehler abzurufen Code. Lautet der Fehlercode 0 (kConsentRequestSuccess oder kConsentFormSuccess) der Vorgang erfolgreich abgeschlossen wurde; prüfen Sie andernfalls den Fehlercode und error_message(), um den Fehler zu ermitteln.

Abschluss-Callback

Hier ist ein Beispiel für die Verwendung von OnCompletion, um einen Abschluss-Callback festzulegen: der nach Abschluss des asynchronen Vorgangs aufgerufen wird.

void MyApplicationStart() {
  // [... other app initialization code ...]

  ump::ConsentInfo *consent_info = ump::ConsentInfo::GetInstance();

  // See the section below for more information about RequestConsentInfoUpdate.
  firebase::Future<void> result = consent_info->RequestConsentInfoUpdate(...);

  result.OnCompletion([](const firebase::Future<void>& req_result) {
    if (req_result.error() == ump::kConsentRequestSuccess) {
      // Operation succeeded. You can now call LoadAndShowConsentFormIfRequired().
    } else {
      // Operation failed. Check req_result.error_message() for more information.
    }
  });
}

Schleifenabfrage aktualisieren

In diesem Beispiel wird nach dem Start eines asynchronen Vorgangs beim Start der Anwendung der Parameter werden die Ergebnisse an anderer Stelle in der Update-Loop-Funktion des Spiels überprüft, einmal pro Frame).

ump::ConsentInfo *g_consent_info = nullptr;
bool g_waiting_for_request = false;

void MyApplicationStart() {
  // [... other app initialization code ...]

  g_consent_info = ump::ConsentInfo::GetInstance();
  // See the section below for more information about RequestConsentInfoUpdate.
  g_consent_info->RequestConsentInfoUpdate(...);
  g_waiting_for_request = true;
}

// Elsewhere, in the game's update loop, which runs once per frame:
void MyGameUpdateLoop() {
  // [... other game logic here ...]

  if (g_waiting_for_request) {
    // Check whether RequestConsentInfoUpdate() has finished.
    // Calling "LastResult" returns the Future for the most recent operation.
    firebase::Future<void> result =
      g_consent_info->RequestConsentInfoUpdateLastResult();

    if (result.status() == firebase::kFutureStatusComplete) {
      g_waiting_for_request = false;
      if (result.error() == ump::kConsentRequestSuccess) {
        // Operation succeeded. You can call LoadAndShowConsentFormIfRequired().
      } else {
        // Operation failed. Check result.error_message() for more information.
      }
    }
  }
}

Weitere Informationen zu firebase::Future finden Sie im Firebase C++ SDK. Dokumentation und in der Dokumentation zum GMA C++ SDK.

Anwendungs-ID hinzufügen

Ihre Anwendungs-ID finden Sie in der AdMob-Benutzeroberfläche: Fügen Sie die ID Ihrem . mit dem folgenden Code-Snippet:

Sie sollten bei jeder App eine Aktualisierung der Einwilligungsinformationen des Nutzers anfordern mit RequestConsentInfoUpdate()starten. Damit legen Sie fest, ob Nutzer einwilligen müssen, falls noch nicht geschehen, oder wenn die Einwilligung abgelaufen ist.

#include "firebase/gma/ump.h"

namespace ump = ::firebase::gma::ump;

void MyApplicationStart() {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();

  // Create a ConsentRequestParameters struct.
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age
  // of consent.
  params.tag_for_under_age_of_consent = false;

  consent_info->RequestConsentInfoUpdate(params).OnCompletion(
    [](const Future<void>& result) {
      if (result.error() != ump::kConsentRequestSuccess) {
        LogMessage("Error requesting consent update: %s", result.error_message());
      } else {
        // Consent status is now available.
      }
    });
}

Ein Beispiel für die Prüfung auf Abschluss finden Sie oben unter Verwendung von Aktualisierungsschleifenabfrage anstelle eines Abschluss-Callbacks.

Einwilligungsformular laden und bei Bedarf einblenden

Nachdem Sie den aktuellen Einwilligungsstatus erhalten haben, rufen Sie LoadAndShowConsentFormIfRequired() am ConsentInfo Klasse zum Laden eines Einwilligungsformulars. Wenn die Einwilligungsstatus erforderlich ist, lädt das SDK ein Formular und zeigt es sofort an. aus den FormParentaus. Die Future erledigt , nachdem das Formular geschlossen wurde. Wenn keine Einwilligung erforderlich ist, Future abgeschlossen aufgerufen.

void MyApplicationStart(ump::FormParent parent) {
  ump::ConsentInfo* consent_info = ump::ConsentInfo::GetInstance();

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  consent_info->RequestConsentInfoUpdate(params).OnCompletion(
    [*](const Future<void>& req_result) {
      if (req_result.error() != ump::kConsentRequestSuccess) {
        // req_result.error() is a kConsentRequestError enum.
        LogMessage("Error requesting consent update: %s", req_result.error_message());
      } else {
        consent_info->LoadAndShowConsentFormIfRequired(parent).OnCompletion(
        [*](const Future<void>& form_result) {
          if (form_result.error() != ump::kConsentFormSuccess) {
            // form_result.error() is a kConsentFormError enum.
            LogMessage("Error showing consent form: %s", form_result.error_message());
          } else {
            // Either the form was shown and completed by the user, or consent was not required.
          }
        });
      }
    });
}

Wenn du weitere Aktionen ausführen musst, nachdem der Nutzer eine Auswahl getroffen oder die Anzeige geschlossen hat des Formulars, platzieren Sie diese Logik in dem Code, der die Future zurückgegeben von LoadAndShowConsentFormIfRequired().

Anzeigenanfrage senden

Bevor Sie Anzeigen in Ihrer App anfordern, prüfen Sie, ob Sie die Einwilligung eingeholt haben vom Nutzer mit ConsentInfo::GetInstance()‑>CanRequestAds(). Es gibt zwei sollten Sie beim Einholen der Einwilligung überprüfen:

  1. Sobald in der aktuellen Sitzung die Einwilligung eingeholt wurde.
  2. Unmittelbar nach Ihrem Anruf bei RequestConsentInfoUpdate() Möglicherweise wurde die Einwilligung bereits in der vorherigen Sitzung erteilt. Als Latenz solltet ihr nicht auf den Abschluss des Callbacks warten, Anzeigen so bald wie möglich nach der Einführung Ihrer App zu laden.

Wenn beim Einholen der Einwilligung ein Fehler auftritt, sollten Sie trotzdem Anzeigen anzufordern. Für das UMP SDK wird der Einwilligungsstatus aus dem vorherigen Sitzung.

Im folgenden Beispiel werden Aktualisierungsschleifen verwendet. Sie können jedoch auch die Verwendung von OnCompletion-Callbacks zum Überwachen asynchroner Vorgänge. Verwenden Sie Methode, die besser in Ihre Codestruktur passt.

#include "firebase/future.h"
#include "firebase/gma/gma.h"
#include "firebase/gma/ump.h"

namespace gma = ::firebase::gma;
namespace ump = ::firebase::gma::ump;
using firebase::Future;

ump::ConsentInfo* g_consent_info = nullptr;
// State variable for tracking the UMP consent flow.
enum { kStart, kRequest, kLoadAndShow, kInitGma, kFinished, kErrorState } g_state = kStart;
bool g_ads_allowed = false;

void MyApplicationStart() {
  g_consent_info = ump::ConsentInfo::GetInstance(...);

  // Create a ConsentRequestParameters struct..
  ump::ConsentRequestParameters params;
  // Set tag for under age of consent. False means users are NOT under age of consent.
  params.tag_for_under_age_of_consent = false;

  g_consent_info->RequestConsentInfoUpdate(params);
  // CanRequestAds() can return a cached value from a previous run immediately.
  g_ads_allowed = g_consent_info->CanRequestAds();
  g_state = kRequest;
}

// This function runs once per frame.
void MyGameUpdateLoop() {
  // [... other game logic here ...]

  if (g_state == kRequest) {
    Future<void> req_result = g_consent_info->RequestConsentInfoUpdateLastResult();

    if (req_result.status() == firebase::kFutureStatusComplete) {
      g_ads_allowed = g_consent_info->CanRequestAds();
      if (req_result.error() == ump::kConsentRequestSuccess) {
        // You must provide the FormParent (Android Activity or iOS UIViewController).
        ump::FormParent parent = GetMyFormParent();
        g_consent_info->LoadAndShowConsentFormIfRequired(parent);
        g_state = kLoadAndShow;
      } else {
        LogMessage("Error requesting consent status: %s", req_result.error_message());
        g_state = kErrorState;
      }
    }
  }
  if (g_state == kLoadAndShow) {
    Future<void> form_result = g_consent_info->LoadAndShowConsentFormIfRequiredLastResult();

    if (form_result.status() == firebase::kFutureStatusComplete) {
      g_ads_allowed = g_consent_info->CanRequestAds();
      if (form_result.error() == ump::kConsentRequestSuccess) {
        if (g_ads_allowed) {
          // Initialize GMA. This is another asynchronous operation.
          firebase::gma::Initialize();
          g_state = kInitGma;
        } else {
          g_state = kFinished;
        }
        // Optional: shut down the UMP SDK to save memory.
        delete g_consent_info;
        g_consent_info = nullptr;
      } else {
        LogMessage("Error displaying consent form: %s", form_result.error_message());
        g_state = kErrorState;
      }
    }
  }
  if (g_state == kInitGma && g_ads_allowed) {
    Future<gma::AdapterInitializationStatus> gma_future = gma::InitializeLastResult();

    if (gma_future.status() == firebase::kFutureStatusComplete) {
      if (gma_future.error() == gma::kAdErrorCodeNone) {
        g_state = kFinished;
        // TODO: Request an ad.
      } else {
        LogMessage("Error initializing GMA: %s", gma_future.error_message());
        g_state = kErrorState;
      }
    }
  }
}

Datenschutzoptionen

Bei einigen Einwilligungsformularen muss der Nutzer seine Einwilligung jederzeit ändern. Einhaltung befolgen Sie die folgenden Schritte, um bei Bedarf eine Schaltfläche für Datenschutzoptionen zu implementieren.

Gehen Sie dazu wie folgt vor:

  1. Implementieren Sie ein UI-Element, z. B. eine Schaltfläche auf der Einstellungsseite Ihrer App, die ein Formular für Datenschutzoptionen auslösen kann.
  2. Sobald LoadAndShowConsentFormIfRequired() der Vorgang abgeschlossen ist, prüfen Sie getPrivacyOptionsRequirementStatus() um zu bestimmen, ob UI-Element, über das das Formular für Datenschutzoptionen angezeigt werden kann
  3. Wenn ein Nutzer mit Ihrem UI-Element interagiert, rufen Sie showPrivacyOptionsForm() um das Formular einzublenden, damit der Nutzer ihre Datenschutzeinstellungen jederzeit aktualisieren.

Test

Wenn Sie die Integration in Ihre App während der Entwicklung testen möchten, folgen Sie mit diesen Schritten können Sie Ihr Testgerät programmatisch registrieren. Achten Sie darauf, die Code, mit dem diese Testgeräte-IDs festgelegt werden, bevor Sie Ihre App veröffentlichen.

  1. Rufen Sie uns unter RequestConsentInfoUpdate()an.
  2. Suchen Sie in der Logausgabe nach einer Nachricht ähnlich dem folgenden Beispiel. Ihre Geräte-ID und wie Sie sie als Testgerät hinzufügen:

    Android

    Use new ConsentDebugSettings.Builder().addTestDeviceHashedId("33BE2250B43518CCDA7DE426D04EE231")
    to set this as a debug device.
    

    iOS

    <UMP SDK>To enable debug mode for this device,
    set: UMPDebugSettings.testDeviceIdentifiers = @[2077ef9a63d2b398840261c8221a0c9b]
    
  3. Kopieren Sie die Testgeräte-ID in die Zwischenablage.

  4. Ändern Sie Ihren Code, um festzulegen, ConsentRequestParameters.debug_settings.debug_device_ids zum eine Liste Ihrer Testgeräte-IDs.

    void MyApplicationStart() {
      ump::ConsentInfo consent_info = ump::ConsentInfo::GetInstance(...);
    
      ump::ConsentRequestParameters params;
      params.tag_for_under_age_of_consent = false;
      params.debug_settings.debug_device_ids = {"TEST-DEVICE-HASHED-ID"};
    
      consent_info->RequestConsentInfoUpdate(params);
    }
    

Geografie erzwingen

Mit dem UMP SDK können Sie das Verhalten Ihrer App so testen, als wäre das Gerät sich im EWR oder Vereinigten Königreich befinden, unter Verwendung von ConsentRequestParameters.debug_settings.debug_geography. Beachten Sie, dass Debug-Einstellungen funktionieren nur auf Testgeräten.

void MyApplicationStart() {
  ump::ConsentInfo consent_info = ump::ConsentInfo::GetInstance(...);

  ump::ConsentRequestParameters params;
  params.tag_for_under_age_of_consent = false;
  params.debug_settings.debug_device_ids = {"TEST-DEVICE-HASHED-ID"};
  // Geography appears as EEA for debug devices.
  params.debug_settings.debug_geography = ump::kConsentDebugGeographyEEA

  consent_info->RequestConsentInfoUpdate(params);
}

Wenn Sie Ihre App mit dem UMP SDK testen, kann es hilfreich sein, das Status des SDK, um die erste Installation durch einen Nutzer zu simulieren. Das SDK bietet dazu die Methode Reset() .

  ConsentInfo::GetInstance()->Reset();

Beispiele auf GitHub