Benutzerdefinierte Formate für native Anzeigen

Benutzerdefinierte Anzeigenformate

Genau wie ihre systemdefinierten Pendants werden benutzerdefinierte native Anzeigenformate mit GADAdLoader-Objekten geladen. Wenn Sie beim Initialisieren von GADAdLoader die Konstante GADAdLoaderAdTypeCustomNative in das Array adTypes einfügen, werden beim Laden von Anzeigen benutzerdefinierte native Formate angefordert.

GADCustomNativeAdLoaderDelegate

Das Protokoll zum Laden benutzerdefinierter Formate verfügt über zwei Methoden. Die erste wird von GADAdLoader verwendet, um zu ermitteln, welche Format-IDs angefordert werden sollen:

Swift

public func customNativeAdFormatIDs(for adLoader: GADAdLoader) -> [Any]

Objective-C

- (NSArray *)customNativeAdFormatIDsForAdLoader:(GADAdLoader *)adLoader;

Jedes benutzerdefinierte native Anzeigenformat hat eine entsprechende Format-ID, durch die es identifiziert wird. Wenn diese Methode aufgerufen wird, sollte Ihre App ein Array zurückgeben, das die Format-IDs der Anzeigen enthält, die ausgeliefert werden können.

Die zweite Nachricht wird gesendet, wenn die benutzerdefinierte native Anzeige geladen wurde, ähnlich wie bei systemdefinierten Formaten:

Swift

public func adLoader(_ adLoader: GADAdLoader,
    didReceive customNativeAd: GADCustomNativeAd)

Objective-C

- (void)adLoader:(GADAdLoader *)adLoader
    didReceiveCustomNativeAd:(GADCustomNativeAd *)customNativeAd;

Format-IDs

Die Format-IDs, die zur eindeutigen Bezugnahme auf benutzerdefinierte native Anzeigenformate verwendet werden, finden Sie in der Ad Manager Benutzeroberfläche im Abschnitt Nativ im Drop-down-Menü Auslieferung:

Die Format-ID jeder benutzerdefinierten nativen Anzeige erscheint neben dem Namen. Wenn Sie auf einen der Namen klicken, gelangen Sie zu einem Detailbildschirm mit Informationen zu den Feldern des Formats:

Hier können einzelne Felder hinzugefügt, bearbeitet und entfernt werden. Notieren Sie sich den Namen der einzelnen Assets. Der Name ist der Schlüssel zum Abrufen der Daten für jedes Asset, wenn Ihr benutzerdefiniertes natives Anzeigenformat ausgeliefert wird.

Benutzerdefinierte native Anzeigenformate ausliefern

Benutzerdefinierte native Anzeigenformate unterscheiden sich von systemdefinierten, da Publisher ihre eigene Liste der Assets definieren können, aus denen eine Anzeige besteht. Daher unterscheidet sich das Verfahren zum Ausliefern benutzerdefinierter nativer Anzeigen in einigen Punkten von dem für systemdefinierte Formate:

  1. Da GADCustomNativeAd zur Verarbeitung von benutzerdefinierten nativen Anzeigenformaten verwendet werden soll, die Sie erstellen, hat es keine benannten Asset-Zugriffsmethoden. Stattdessen bietet sie Methoden wie imageForKey: und stringForKey:, die den Namen des Felds als Argument annehmen.
  2. Es gibt keine dedizierte Anzeigenansichtsklasse wie GADNativeAdView, die mit GADCustomNativeAd verwendet werden kann. Sie können jede Ansicht verwenden, die für Ihre User Experience am sinnvollsten ist.
  3. Da es keine spezielle Anzeigenansichtsklasse gibt, müssen Sie keine der Ansichten registrieren, die Sie zum Ausliefern der Anzeigenassets verwenden.

Hier ist ein Beispiel für eine Anzeigenansicht, in der eine einfache benutzerdefinierte native Anzeige präsentiert werden kann:

MySimpleNativeAdView.h

Swift

import UIKit
import GoogleMobileAds

/// Custom native ad view class with format ID 10063170.
class MySimpleNativeAdView: UIView {

  /// Weak references to this ad's asset views.
  @IBOutlet weak var headlineView: UILabel!
  @IBOutlet weak var mainImageView: UIImageView!
  @IBOutlet weak var captionView: UILabel!

  ...

  /// Populates the ad view with the custom native ad object.
  func populateWithCustomNativeAd(_ customNativeAd: GADCustomNativeAd) {
    ...
  }
}

Objective-C

@import UIKit;
@import GoogleMobileAds;

/// View representing a custom native ad format with format ID 10063170.
@interface MySimpleNativeAdView : UIView

// Weak references to this ad's asset views.
@property(weak, nonatomic) IBOutlet UILabel *headlineView;
@property(weak, nonatomic) IBOutlet UIImageView *mainImageView;
@property(weak, nonatomic) IBOutlet UILabel *captionView;

/// Populates the ad view with the custom native ad object.
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd;

@end

MySimpleNativeAdView.m (Auszug)

Swift

...
func populateWithCustomNativeAd(_ customNativeAd: GADCustomNativeAd) {
  self.customNativeAd = customNativeAd

  // Populate the custom native ad assets.
  headlineView.text = self.customNativeAd.stringForKey("Headline")
  mainImageView.image = self.customNativeAd.imageForKey("MainImage")?.image
  captionView.text = self.customNativeAd.stringForKey("Caption")
}
...

Objective-C

...
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
  self.customNativeAd = customNativeAd;

  // Populate the custom native ad assets.
  self.headlineView.text = [customNativeAd stringForKey:@"Headline"];
  self.mainImageView.image = [customNativeAd imageForKey:@"MainImage"].image;
  self.captionView.text = [customNativeAd stringForKey:@"Caption"];
}
...

Native Videoanzeigen für benutzerdefinierte native Anzeigenformate

Beim Erstellen eines benutzerdefinierten Formats können Sie festlegen, dass das Format für Videos geeignet ist.

In der App-Implementierung kannst du mit der Property GADCustomNativeAd.mediaView die Ansicht des Videos abrufen. Fügen Sie diese Ansicht dann Ihrer Ansichtshierarchie hinzu. Wenn die Anzeige keine Videoinhalte enthält, sollten Sie alternative Pläne für die Auslieferung der Anzeige ohne Video haben.

Im folgenden Beispiel wird geprüft, ob die Anzeige Videoinhalte enthält. Wenn kein Video verfügbar ist, wird stattdessen ein Bild eingeblendet:

Swift

...
  /// Populates the ad view with the custom native ad object.
  func populate(withCustomNativeAd customNativeAd: GADCustomNativeAd) {
    if customNativeAd.videoController.hasVideoContent(),
      let mediaView = customNativeAd.mediaView {
      updateMainView(mediaView)
    } else {
      // Assumes your native format has an image asset with the name MainImage.
      let image: UIImage? = customNativeAd.image(forKey: "MainImage")?.image
      updateMainView(UIImageView(image: image))
    }
  }

  private func updateMainView(_ mainView:UIView) {
    // Assumes you have a placeholder view for your media content.
    // Remove all the placeholder's subviews.
    for subview: UIView in mainPlaceholder.subviews {
      subview.removeFromSuperview()
    }
    mainPlaceholder.addSubview(mainView)
    // Size the media view to fill our container size.
    mainView.translatesAutoresizingMaskIntoConstraints = false
    let viewDictionary: [AnyHashable: Any] = ["mainView":mainView]
    mainPlaceholder.addConstraints(NSLayoutConstraint.constraints(
      withVisualFormat: "H:|[mainView]|", options: [], metrics: nil,
      views: viewDictionary as? [String : Any] ?? [String : Any]()))
    mainPlaceholder.addConstraints(NSLayoutConstraint.constraints(
      withVisualFormat: "V:|[mainView]|", options: [], metrics: nil,
      views: viewDictionary as? [String : Any] ?? [String : Any]()))
  }
...

Objective-C

...
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)ad {
  UIView *mainView = nil;
  if (ad.videoController.hasVideoContent) {
    mainView = ad.mediaView;
  } else {
    // Assumes your native format has an image asset with the name MainImage.
    UIImage *image = [ad imageForKey:@"MainImage"].image;
    mainView = [[UIImageView alloc] initWithImage:image];
  }
  // Assumes you have a placeholder view for your media content.
  for (UIView *subview in self.mainPlaceholder.subviews) {
    [subview removeFromSuperview];
  }
  [self.mainPlaceholder addSubview:mainView];

  // Size the main view to fill our container size.
  [mainView setTranslatesAutoresizingMaskIntoConstraints:NO];
  NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(mainView);
  [self.mainPlaceholder
      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mainView]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDictionary]];
  [self.mainPlaceholder
      addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[mainView]|"
                                                             options:0
                                                             metrics:nil
                                                               views:viewDictionary]];
}
...

Weitere Informationen zum Anpassen der Videodarstellung einer benutzerdefinierten nativen Anzeige finden Sie unter GADVideoController.

Laden Sie das Beispiel für das benutzerdefinierte Rendering von Ad Manager herunter, um ein funktionierendes Beispiel für ein natives Video in Aktion zu erhalten.

Klicks und Impressionen für benutzerdefinierte native Anzeigen verarbeiten

Bei benutzerdefinierten nativen Anzeigenformaten ist Ihre App für das Erfassen von Impressionen und das Melden von Klickereignissen an das SDK zuständig.

Impressionen erfassen

Wenn Sie eine Impression für eine benutzerdefinierte native Anzeige erfassen möchten, rufen Sie einfach die Methode recordImpression für die entsprechende GADCustomNativeAd auf:

Swift

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

Das SDK verhindert, dass für eine einzelne Anfrage doppelte Impressionen aufgezeichnet werden, falls Ihre App die Methode versehentlich mehrmals für dieselbe Anzeige aufruft.

Berichte zu Klicks

Wenn Sie dem SDK melden möchten, dass bei einer Asset-Ansicht ein Klick aufgetreten ist, rufen Sie die Methode performClickOnAssetWithKey: für die entsprechende GADCustomNativeAd auf und übergeben Sie den Namen des Assets, auf das geklickt wurde. Wenn Sie beispielsweise ein Asset in Ihrem benutzerdefinierten Format namens „MainImage“ haben und einen Klick auf die Ansicht melden möchten, die diesem Asset entspricht, würde Ihr Code so aussehen:

Swift

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

Sie müssen diese Methode nicht für jede Assetansicht aufrufen, die Ihrer Anzeige zugeordnet ist. Wenn Sie beispielsweise ein weiteres Asset namens „Caption“ haben, das der Nutzer zwar angezeigt, aber nicht angeklickt oder angetippt hat, muss Ihre App performClickOnAssetWithKey: für diese Ansicht nicht aufrufen.

Auf benutzerdefinierte Klickaktionen reagieren

GADCustomNativeAd hat eine Property customClickHandler vom Typ GADNativeAdCustomClickHandler.

Swift

typealias GADNativeAdCustomClickHandler = (assetID: String) -> Void

Objective-C

typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);

Dies ist ein Block (Objective-C) / Closure (Swift), der ein assetID als Eingabeparameter akzeptiert, das das angeklickte Asset identifiziert.

Wenn auf eine benutzerdefinierte native Anzeige geklickt wird, gibt es drei mögliche Antworten vom SDK, die in dieser Reihenfolge versucht werden:

  1. Rufen Sie den Block customClickHandler in Objective-C oder Closure in Swift auf, falls einer festgelegt wurde.
  2. Durchlaufen Sie die Deeplink-URLs der Anzeige und öffnen Sie die erste, für die eine übereinstimmende App gefunden wurde.
  3. Öffnen Sie einen Browser und navigieren Sie zur herkömmlichen Ziel-URL der Anzeige.

Das Attribut customClickHandler akzeptiert einen Block in Objective-C und einen Closure in Swift. Wenn Sie einen Block oder ein Closure festlegen, führt das SDK ihn aus und unternimmt keine weiteren Schritte. Wenn Sie jedoch den Wert „nil“ festlegen, verwendet das SDK den Deeplink und/oder die Ziel-URLs, die für die Anzeige registriert sind.

Mit benutzerdefinierten Klick-Handlern kann Ihre Anwendung selbst entscheiden, welche Aktion als Reaktion auf einen Klick am besten ausgeführt werden soll. Dabei kann es sich beispielsweise um die Aktualisierung der Benutzeroberfläche, die Darstellung eines anderen Ansichts-Controllers oder die Protokollierung des Klicks handeln. Hier ein Beispiel für eine Benachrichtigung:

Swift

myCustomNativeAd.customClickHandler = { assetID in
  if assetID == "MainImage" {
    let alertView = UIAlertView(title: "Custom Click",
        message: "You just clicked on the image!",
        delegate: self,
        cancelButtonTitle: "OK")
    alertView.alertViewStyle = .default
    alertView.show()
  }
}
myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[self.customNativeAd setCustomClickHandler:^(NSString *assetID){
  if ([assetID isEqualToString:@"MainImage"]) {
    [[[UIAlertView alloc] initWithTitle:@"Custom Click"
                                message:@"You just clicked on the image!"
                               delegate:self
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil] show];
  }
}];
[self.customNativeAd performClickOnAssetWithKey:@"MainImage"];

Nativen Anzeigencode testen

Direkt verkaufte Anzeigen

Wenn Sie testen möchten, wie direkt verkaufte native Anzeigen aussehen, können Sie diese Ad Manager Anzeigenblock-ID verwenden:

/6499/example/native

Es ist so konfiguriert, dass App-Installations- und Contentanzeigen sowie ein benutzerdefiniertes natives Anzeigenformat mit folgenden Assets ausgeliefert werden:

  • Anzeigentitel (Text)
  • MainImage (Bild)
  • Bildunterschrift (Text)

Native Backfill-Anzeigen

Wenn Sie das Verhalten nativer Backfill-Anzeigen testen möchten, verwenden Sie diesenAd Manager -Anzeigenblock:

/6499/example/native-backfill

Es werden beispielsweise App-Installations- und Contentanzeigen ausgeliefert, die das Datenschutzinfo-Overlay enthalten.

Passen Sie Ihren Code vor der Veröffentlichung an die tatsächliche Anzeigenblock- und Format-ID an.