Jetzt loslegen

Gemäß der Google-Richtlinie zur Einwilligung der Nutzer in der EU müssen Sie Ihren Nutzern im Europäischen Wirtschaftsraum (EWR) sowie im Vereinigten Königreich bestimmte Informationen offenlegen und ihre Einwilligung zur Verwendung von Cookies oder anderen lokalen Speicherverfahren, sofern gesetzlich erforderlich, sowie zur Verwendung von personenbezogenen Daten wie der Werbe-ID für Anzeigen einholen. Die Richtlinie entspricht den Anforderungen der EU-Datenschutzrichtlinie für elektronische Kommunikation und der EU-Datenschutz-Grundverordnung (DSGVO).

Google bietet das User Messaging Platform (UMP) SDK, um Publisher bei der Umsetzung dieser Richtlinie zu unterstützen. Das UMP SDK wurde aktualisiert und unterstützt jetzt die neuesten IAB-Standards. All diese Konfigurationen können jetzt bequem unter Interactive Media Ads „Datenschutz und Mitteilungen“ verwaltet werden.

Eine funktionierende IMA-Implementierung mit dem UMP SDK finden Sie entweder in der Objective-C- oder der Swift-UMP-Beispiel-App.

Voraussetzungen

Mitteilungstyp erstellen

Sie können Nutzermitteilungen mit einem der verfügbaren Mitteilungstypen für Nutzer auf dem Tab Datenschutz und Mitteilungen in Ihrem Ad Manager erstellen. Das UMP SDK versucht, eine Nutzernachricht anzuzeigen, die mit der im Projekt festgelegten Interactive Media Ads Anwendungs-ID erstellt wurde. Wenn für Ihre Anwendung keine Meldung konfiguriert ist, gibt das SDK einen Fehler zurück.

Weitere Informationen finden Sie unter Informationen zu Datenschutz und Mitteilungen

SDK importieren

Das UMP SDK ist nicht als Abhängigkeit des IMA SDK enthalten. Sie müssen es also selbst hinzufügen.

CocoaPods (bevorzugt)

Am einfachsten lässt sich das SDK mit CocoaPods in ein iOS-Projekt importieren. Öffnen Sie die Podfile-Datei Ihres Projekts und fügen Sie diese Zeile in das Ziel Ihrer App ein:

pod 'GoogleUserMessagingPlatform'

Führen Sie dann den folgenden Befehl aus:

pod install --repo-update

Wenn Sie CocoaPods zum ersten Mal verwenden, finden Sie unter CocoaPods verwenden weitere Informationen zum Erstellen und Verwenden von Podfiles.

Swift-Paketmanager

Das UMP SDK unterstützt auch Swift Package Manager. Führen Sie die folgenden Schritte aus, um das Swift-Paket zu importieren.

  1. Installieren Sie in Xcode das UMP SDK Swift Package. Wählen Sie dazu File > Add Packages... (Datei > Pakete hinzufügen...) aus.

  2. Suchen Sie in der angezeigten Eingabeaufforderung nach dem GitHub-Repository des UMP SDK Swift Package:

    https://github.com/googleads/swift-package-manager-google-user-messaging-platform.git
    
  3. Wählen Sie die Version des UMP SDK Swift Package aus, die Sie verwenden möchten. Für neue Projekte empfehlen wir die Verwendung von Bis zur nächsten Hauptversion.

Xcode löst dann Ihre Paketabhängigkeiten auf und lädt sie im Hintergrund herunter. Weitere Informationen zum Hinzufügen von Paketabhängigkeiten finden Sie im Artikel von Apple.

Sie sollten bei jedem Start der App mit requestConsentInfoUpdateWithParameters:completionHandler:eine Aktualisierung der Einwilligungsinformationen des Nutzers anfordern. Damit wird bestimmt, ob der Nutzer seine Einwilligung geben muss, falls dies noch nicht geschehen ist oder die Einwilligung abgelaufen ist.

Das folgende Beispiel zeigt, wie Sie den Status einer UIViewController in der Methode viewDidLoad() prüfen.

Swift

override func viewDidLoad() {
  super.viewDidLoad()

  // Request an update for the consent information.
  UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: nil) {
    [weak self] requestConsentError in
    guard let self else { return }

    if let consentError = requestConsentError {
      // Consent gathering failed.
      return print("Error: \(consentError.localizedDescription)")
    }

    // TODO: Load and present the consent form.
  }
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];

  // Request an update for the consent information.
  [UMPConsentInformation.sharedInstance
      requestConsentInfoUpdateWithParameters:nil
          completionHandler:^(NSError *_Nullable requestConsentError) {
            if (requestConsentError) {
              // Consent gathering failed.
              NSLog(@"Error: %@", requestConsentError.localizedDescription);
              return;
            }

            // TODO: Load and present the consent form.
          }];
}

Einwilligungsformular laden und bei Bedarf präsentieren

Nachdem Sie den aktuellen Einwilligungsstatus erhalten haben, rufen SieloadAndPresentIfRequiredFromViewController:completionHandler: in der KlasseUMPConsentForm auf, um ein Einwilligungsformular zu laden. Wenn der Einwilligungsstatus erforderlich ist, lädt das SDK ein Formular und zeigt es sofort aus dem bereitgestellten view controlleran. Die completion handler wird aufgerufen , nachdem das Formular geschlossen wurde. Ist keine Einwilligung erforderlich, wird der completion handler sofort aufgerufen .

Swift

override func viewDidLoad() {
  super.viewDidLoad()

  // Request an update for the consent information.
  UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: nil) {
    [weak self] requestConsentError in
    guard let self else { return }

    if let consentError = requestConsentError {
      // Consent gathering failed.
      return print("Error: \(consentError.localizedDescription)")
    }

    UMPConsentForm.loadAndPresentIfRequired(from: self) {
      [weak self] loadAndPresentError in
      guard let self else { return }

      if let consentError = loadAndPresentError {
        // Consent gathering failed.
        return print("Error: \(consentError.localizedDescription)")
      }

      // Consent has been gathered.
    }
  }
}

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];

  __weak __typeof__(self) weakSelf = self;
  // Request an update for the consent information.
  [UMPConsentInformation.sharedInstance
      requestConsentInfoUpdateWithParameters:nil
          completionHandler:^(NSError *_Nullable requestConsentError) {
            if (requestConsentError) {
              // Consent gathering failed.
              NSLog(@"Error: %@", requestConsentError.localizedDescription);
              return;
            }

            __strong __typeof__(self) strongSelf = weakSelf;
            if (!strongSelf) {
              return;
            }

            [UMPConsentForm loadAndPresentIfRequiredFromViewController:strongSelf
                completionHandler:^(NSError *loadAndPresentError) {
                  if (loadAndPresentError) {
                    // Consent gathering failed.
                    NSLog(@"Error: %@", loadAndPresentError.localizedDescription);
                    return;
                  }

                  // Consent has been gathered.
                }];
          }];
}

Wenn du Aktionen ausführen musst, nachdem der Nutzer eine Auswahl getroffen oder das Formular geschlossen hat, platziere diese Logik in der completion handlerfür dein Formular.

Anzeigenanfrage senden

Bevor Sie Anzeigen in Ihrer App anfordern, prüfen Sie, ob Sie über UMPConsentInformation.sharedInstance.canRequestAdsdie Einwilligung des Nutzers eingeholt haben. Beim Einholen der Einwilligung müssen Sie zwei Stellen prüfen:

  1. Sobald in der aktuellen Sitzung die Einwilligung eingeholt wurde.
  2. Unmittelbar nach Ihrem Anruf bei requestConsentInfoUpdateWithParameters:completionHandler: Möglicherweise wurde die Einwilligung bereits in der vorherigen Sitzung erteilt. Als Best Practice für die Latenz empfehlen wir, nicht auf den Abschluss des Callbacks zu warten, damit du nach dem Start deiner App so schnell wie möglich mit dem Laden von Anzeigen beginnen kannst.

Wenn beim Einholen der Einwilligung ein Fehler auftritt, sollten Sie trotzdem versuchen, Anzeigen anzufordern. Das UMP SDK verwendet den Einwilligungsstatus aus der vorherigen Sitzung.

Swift

class ViewController: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

    // Request an update for the consent information.
    UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: nil) {
      [weak self] requestConsentError in
      guard let self else { return }

      if let consentError = requestConsentError {
        // Consent gathering failed.
        return print("Error: \(consentError.localizedDescription)")
      }

      UMPConsentForm.loadAndPresentIfRequired(from: self) {
        [weak self] loadAndPresentError in
        guard let self else { return }

        if let consentError = loadAndPresentError {
          // Consent gathering failed.
          return print("Error: \(consentError.localizedDescription)")
        }

        // Consent has been gathered.
        if UMPConsentInformation.sharedInstance.canRequestAds {
          self.startImaSdk()
        }
      }
    }
    
    // Check if you can initialize the IMA SDK in parallel
    // while checking for new consent information. Consent obtained in
    // the previous session can be used to request ads.
    if UMPConsentInformation.sharedInstance.canRequestAds {
      startImaSdk()
    }
  }
  
  private func startImaSdk() {
    // Create an IMAAdsLoader instance.
    adsLoader = IMAAdsLoader(settings: nil)

    // TODO: Create an IMAAdDisplayContainer and IMAAdsRequest, then make
    // a request for ads.
  }
}

Objective-C

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  __weak __typeof__(self) weakSelf = self;
  // Request an update for the consent information.
  [UMPConsentInformation.sharedInstance
      requestConsentInfoUpdateWithParameters:nil
          completionHandler:^(NSError *_Nullable requestConsentError) {
            if (requestConsentError) {
              // Consent gathering failed.
              NSLog(@"Error: %@", requestConsentError.localizedDescription);
              return;
            }
            __strong __typeof__(self) strongSelf = weakSelf;
            if (!strongSelf) {
              return;
            }

            [UMPConsentForm loadAndPresentIfRequiredFromViewController:strongSelf
                completionHandler:^(NSError *loadAndPresentError) {
                  if (loadAndPresentError) {
                    // Consent gathering failed.
                    NSLog(@"Error: %@", loadAndPresentError.localizedDescription);
                    return;
                  }

                  // Consent has been gathered.
                  __strong __typeof__(self) strongSelf = weakSelf;
                  if (!strongSelf) {
                    return;
                  }

                  if (UMPConsentInformation.sharedInstance.canRequestAds) {
                    [strongSelf startImaSdk];
                  }
                }];
          }];

  // Check if you can initialize the Google IMA SDK in parallel
  // while checking for new consent information. Consent obtained in
  // the previous session can be used to request ads.
  if (UMPConsentInformation.sharedInstance.canRequestAds) {
    [self startImaSdk];
  }
}

- (void)startImaSdk {
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    // Create an IMAAdsLoader instance.
    self.adsLoader = [[IMAAdsLoader alloc] init];

    // TODO: Create an IMAAdDisplayContainer and IMAAdsRequest, then make
    // a request for ads.
  });
}

Datenschutzoptionen

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

Folgende Schritte sind hierzu nötig:

  1. Implementieren Sie ein UI-Element, z. B. eine Schaltfläche auf der Einstellungsseite Ihrer App, über das ein Formular mit Datenschutzoptionen ausgelöst werden kann.
  2. Sobald loadAndPresentIfRequiredFromViewController:completionHandler: abgeschlossen ist, prüfen SieprivacyOptionsRequirementStatus , um zu bestimmen, ob das UI-Element angezeigt werden soll, über das das Formular für Datenschutzoptionen angezeigt werden kann.
  3. Wenn ein Nutzer mit Ihrem UI-Element interagiert, rufen SiepresentPrivacyOptionsFormFromViewController:completionHandler: auf, um das Formular aufzurufen, sodass der Nutzer seine Datenschutzoptionen jederzeit aktualisieren kann.

Das folgende Beispiel zeigt, wie das Formular für Datenschutzoptionen aus einem UIBarButtonItem dargestellt wird.

Swift

@IBOutlet weak var privacySettingsButton: UIBarButtonItem!

var isPrivacyOptionsRequired: Bool {
  return UMPConsentInformation.sharedInstance.privacyOptionsRequirementStatus == .required
}

override func viewDidLoad() {
  // ...

  // Request an update for the consent information.
  UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(with: parameters) {
    // ...

    UMPConsentForm.loadAndPresentIfRequired(from: self) {
      //...

      // Consent has been gathered.

      // Show the button if privacy options are required.
      self.privacySettingsButton.isEnabled = isPrivacyOptionsRequired
    }
  }
  // ...
}

// Present the privacy options form when a user interacts with the
// privacy settings button.
@IBAction func privacySettingsTapped(_ sender: UIBarButtonItem) {
  UMPConsentForm.presentPrivacyOptionsForm(from: self) {
    [weak self] formError in
    guard let self, let formError else { return }

    // Handle the error.
  }
}

Objective-C

@interface ViewController ()
@property(weak, nonatomic) IBOutlet UIBarButtonItem *privacySettingsButton;
@end

- (BOOL)isPrivacyOptionsRequired {
  return UMPConsentInformation.sharedInstance.privacyOptionsRequirementStatus ==
         UMPPrivacyOptionsRequirementStatusRequired;
}

- (void)viewDidLoad {
  // ...

  __weak __typeof__(self) weakSelf = self;
  // Request an update for the consent information.
  [UMPConsentInformation.sharedInstance
      requestConsentInfoUpdateWithParameters:parameters
          completionHandler:^(NSError *_Nullable requestConsentError) {
            // ...

            [UMPConsentForm loadAndPresentIfRequiredFromViewController:strongSelf
                completionHandler:^(NSError *loadAndPresentError) {
                  // ...

                  // Consent has been gathered.

                  // Show the button if privacy options are required.
                  strongSelf.privacySettingsButton.enabled = isPrivacyOptionsRequired;
                }];
          }];
}

// Present the privacy options form when a user interacts with your
// privacy settings button.
- (IBAction)privacySettingsTapped:(UIBarButtonItem *)sender {
  [UMPConsentForm presentPrivacyOptionsFormFromViewController:self
                                completionHandler:^(NSError *_Nullable formError) {
                                  if (formError) {
                                    // Handle the error.
                                  }
                                }];
}

Testen

Wenn du die Integration in deine App während der Entwicklung testen möchtest, folge dieser Anleitung, um dein Testgerät programmatisch zu registrieren. Entferne den Code, mit dem diese Testgeräte-IDs festgelegt werden, bevor du deine App veröffentlichst.

  1. Rufen Sie uns unter requestConsentInfoUpdateWithParameters:completionHandler:an.
  2. Suchen Sie in der Logausgabe nach einer Nachricht ähnlich der folgenden. Sie enthält Ihre Geräte-ID und wie Sie sie als Testgerät hinzufügen können:

    <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 den Code so, dass aufgerufenUMPDebugSettings().testDeviceIdentifiers und eine Liste Ihrer Testgeräte-IDs übergeben wird.

    Swift

    let parameters = UMPRequestParameters()
    let debugSettings = UMPDebugSettings()
    debugSettings.testDeviceIdentifiers = ["TEST-DEVICE-HASHED-ID"]
    parameters.debugSettings = debugSettings
    // Include the UMPRequestParameters in your consent request.
    UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
        with: parameters,
        completionHandler: { error in
          ...
        })
    

    Objective-C

    UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init];
    UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init];
    debugSettings.testDeviceIdentifiers = @[ @"TEST-DEVICE-HASHED-ID" ];
    parameters.debugSettings = debugSettings;
    // Include the UMPRequestParameters in your consent request.
    [UMPConsentInformation.sharedInstance
        requestConsentInfoUpdateWithParameters:parameters
                            completionHandler:^(NSError *_Nullable error){
                              ...
    }];
    

Geografie erzwingen

Mit dem UMP SDK können Sie das Verhalten Ihrer App testen, als würde sich das Gerät mithilfe von the debugGeography property of type UMPDebugGeography on UMPDebugSettingsim EWR oder Vereinigten Königreich befinden. Die Debugging-Einstellungen funktionieren nur auf Testgeräten.

Swift

let parameters = UMPRequestParameters()
let debugSettings = UMPDebugSettings()
debugSettings.testDeviceIdentifiers = ["TEST-DEVICE-HASHED-ID"]
debugSettings.geography = .EEA
parameters.debugSettings = debugSettings
// Include the UMPRequestParameters in your consent request.
UMPConsentInformation.sharedInstance.requestConsentInfoUpdate(
    with: parameters,
    completionHandler: { error in
      ...
    })

Objective-C

UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init];
UMPDebugSettings *debugSettings = [[UMPDebugSettings alloc] init];
debugSettings.testDeviceIdentifiers = @[ @"TEST-DEVICE-HASHED-ID" ];
debugSettings.geography = UMPDebugGeographyEEA;
parameters.debugSettings = debugSettings;
// Include the UMPRequestParameters in your consent request.
[UMPConsentInformation.sharedInstance
    requestConsentInfoUpdateWithParameters:parameters
                         completionHandler:^(NSError *_Nullable error){
                           ...
}];

Wenn Sie Ihre App mit dem UMP SDK testen, kann es hilfreich sein, den Status des SDK zurückzusetzen, um die erste Installation eines Nutzers zu simulieren. Das SDK bietet dazu die Methode reset .

Swift

UMPConsentInformation.sharedInstance.reset()

Objective-C

[UMPConsentInformation.sharedInstance reset];