Benutzerdefinierte Anzeigenformate
Wie ihre systemdefinierten Pendants werden benutzerdefinierte native Anzeigenformate mithilfe von GADAdLoader
-Objekten geladen. Wenn Sie die Konstante GADAdLoaderAdTypeCustomNative
beim Initialisieren einer GADAdLoader
in das adTypes
-Array aufnehmen, wird sie so konfiguriert, dass beim Laden von Anzeigen benutzerdefinierte native Formate angefordert werden.
GADCustomNativeAdLoaderDelegate
Das Protokoll zum Laden benutzerdefinierter Formate hat zwei Methoden. Die erste wird von GADAdLoader
verwendet, um herauszufinden, 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, die es identifiziert. Wenn diese Methode aufgerufen wird, sollte Ihre App ein Array mit den Format-IDs der Anzeigen zurückgeben, die präsentiert werden sollen.
Die zweite Nachricht wird gesendet, wenn die benutzerdefinierte native Anzeige geladen wurde. Sie ähnelt der für systemdefinierte Formate:
Swift
public func adLoader(_ adLoader: GADAdLoader, didReceive customNativeAd: GADCustomNativeAd)
Objective-C
- (void)adLoader:(GADAdLoader *)adLoader didReceiveCustomNativeAd:(GADCustomNativeAd *)customNativeAd;
Format-IDs
Die Format-IDs, die für die eindeutige Verweis auf benutzerdefinierte native Anzeigenformate verwendet werden, finden Sie in der Ad Manager-Benutzeroberfläche im Drop-down-Menü Auslieferung im Bereich Native:
Die Format-ID jeder benutzerdefinierten nativen Anzeige wird neben dem Namen angezeigt. Wenn Sie auf einen der Namen klicken, wird ein Detailbildschirm mit Informationen zu den Feldern des Formats angezeigt:
Hier können einzelne Felder hinzugefügt, bearbeitet und entfernt werden. Notiere dir den Namen jedes Assets. Der Name ist der Schlüssel, mit dem die Daten für jedes Asset abgerufen werden, wenn Ihr benutzerdefiniertes natives Anzeigenformat ausgeliefert wird.
Benutzerdefinierte native Anzeigenformate ausliefern
Benutzerdefinierte native Anzeigenformate unterscheiden sich von systemdefinierten Formaten dadurch, dass Publisher ihre eigene Liste der Assets definieren können, aus denen eine Anzeige besteht. Daher unterscheidet sich die Auslieferung benutzerdefinierter nativer Anzeigen in einigen Punkten von der von systemdefinierten Formaten:
- Da
GADCustomNativeAd
alle von Ihnen erstellten benutzerdefinierten nativen Anzeigenformate verarbeiten soll, hat es keine benannten Asset-Accessors. Stattdessen bietet es Methoden wieimageForKey:
undstringForKey:
, die den Namen des Felds als Argument annehmen. - Es gibt keine spezielle Anzeigenansichtsklasse wie
GADNativeAdView
, die mitGADCustomNativeAd
verwendet werden kann. Sie können die Ansicht verwenden, die für Ihre Nutzererfahrung am besten geeignet ist. - Da es keine spezielle Anzeigenansichtsklasse gibt, müssen Sie keine der Ansichten registrieren, die Sie zum Darstellen der Assets der Anzeige verwenden.
Hier ein Beispiel für eine Anzeigenansicht, in der eine einfache benutzerdefinierte native Anzeige ausgeliefert 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"]; } ...
Rendern des Datenschutzinfo-Symbols
Im Rahmen der Unterstützung des Gesetzes über digitale Dienste (Gesetz über digitale Märkte, GDM) müssen Reservierungsanzeigen, die im Europäischen Wirtschaftsraum (EWR) ausgeliefert werden, das Datenschutzinfo-Symbol und einen Link zur Google-Seite „Infos zu dieser Anzeige“ enthalten. Wenn Sie benutzerdefinierte native Anzeigen implementieren, sind Sie für das Rendern des Datenschutzinfo-Symbols verantwortlich. Beim Rendern der Haupt-Anzeigen-Assets ist es wichtig, dass Sie Schritte unternehmen, um den Click Listener für das Datenschutzinfo-Symbol zu rendern und einzurichten.
Im folgenden Beispiel wird das Symbol „Datenschutzinfo“ gerendert und das Klickverhalten konfiguriert.
Swift
class MySimpleNativeAdView: UIView {
@IBOutlet weak var adChoicesView: UIImageView!
override func awakeFromNib() {
super.awakeFromNib()
// Enable clicks on AdChoices.
adChoicesView.addGestureRecognizer(
UITapGestureRecognizer(
target: self,
action: #selector(performClickOnAdChoices(_:))))
adChoicesView.isUserInteractionEnabled = true
}
@objc func performClickOnAdChoices(_ sender: UIImage!) {
customNativeAd.performClickOnAsset(withKey:
GADNativeAssetIdentifier.adChoicesViewAsset.rawValue)
}
func populate(withCustomNativeAd customNativeAd: GADCustomNativeAd) {
// Render the AdChoices image.
let adChoicesKey = GADNativeAssetIdentifier.adChoicesViewAsset.rawValue
let adChoicesImage = customNativeAd.image(forKey: adChoicesKey)?.image
adChoicesView.image = adChoicesImage
adChoicesView.isHidden = adChoicesImage == nil
...
}
}
Objective-C
@interface MySimpleNativeAdView ()
@property(nonatomic, weak) IBOutlet UIImageView *adChoicesView;
@end
@implementation MySimpleNativeAdView
- (void)awakeFromNib {
[super awakeFromNib];
// Enable clicks on AdChoices.
[self.adChoicesView addGestureRecognizer:[[UITapGestureRecognizer alloc]
initWithTarget:self
action:@selector(performClickOnAdChoices:)]];
self.adChoicesView.userInteractionEnabled = YES;
}
- (void)performClickOnAdChoices:(UITapGestureRecognizer *)sender {
[self.customNativeAd performClickOnAssetWithKey:GADNativeAdChoicesViewAsset];
}
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
// Render the AdChoices image.
GADNativeAdImage *adChoicesAsset = [customNativeAd
imageForKey:GADNativeAdChoicesViewAsset];
self.adChoicesView.image = adChoicesAsset.image;
self.adChoicesView.hidden = (adChoicesAsset == nil);
...
}
Natives Video für benutzerdefinierte native Anzeigenformate
Wenn Sie ein benutzerdefiniertes Format erstellen, können Sie festlegen, dass es für Videos verwendet werden darf.
In Ihrer App-Implementierung können Sie die Property GADCustomNativeAd.mediaView
verwenden, um die Wiedergabe des Videos abzurufen. Fügen Sie diese Ansicht dann der Ansichtshierarchie hinzu. Wenn die Anzeige keine Videoinhalte hat, sollten Sie alternative Pläne für die Auslieferung der Anzeige ohne Video entwickeln.
Im folgenden Beispiel wird geprüft, ob die Anzeige Videocontent enthält. Wenn kein Video verfügbar ist, wird stattdessen ein Bild angezeigt:
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]]; } ...
Weitere Informationen zum Anpassen des Videoerlebnisses einer benutzerdefinierten nativen Anzeige finden Sie unter GADVideoController.
Laden Sie das Beispiel für benutzerdefiniertes Rendering in Ad Manager herunter, um ein funktionierendes Beispiel für native Videoanzeigen zu sehen.
Umgang mit Klicks und Impressionen bei benutzerdefinierten nativen Anzeigen
Bei benutzerdefinierten nativen Anzeigenformaten ist Ihre App für die Erfassung von Impressionen und die Berichterstellung zu Klickereignissen an das SDK verantwortlich.
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 erfasst werden, falls Ihre App die Methode versehentlich mehrmals für dieselbe Anzeige aufruft.
Klicks erfassen
Wenn du dem SDK mitteilen möchtest, dass ein Klick auf eine Asset-Ansicht erfolgt ist, rufe die Methode performClickOnAssetWithKey:
für die entsprechende GADCustomNativeAd
auf und gib den Namen des Assets an, auf das geklickt wurde.
Wenn Sie beispielsweise ein Asset im benutzerdefinierten Format namens „MainImage“ haben und einen Klick auf die Ansicht erfassen 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 Asset-Ansicht aufrufen, die mit Ihrer Anzeige verknüpft ist. Wenn Sie beispielsweise ein anderes Asset namens „Untertitel“ haben, das angezeigt werden soll, aber nicht vom Nutzer angeklickt werden soll, muss Ihre App für diese Ansicht nicht performClickOnAssetWithKey:
aufrufen.
Auf benutzerdefinierte Klickaktionen reagieren
GADCustomNativeAd
hat das Attribut customClickHandler
vom Typ GADNativeAdCustomClickHandler
.
Swift
typealias GADNativeAdCustomClickHandler = (assetID: String) -> Void
Objective-C
typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);
Dies ist ein Block (Objective-C)/eine Funktion (Swift), der/die assetID
als Eingabeparameter akzeptiert, der 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:
- Rufen Sie den
customClickHandler
-Block in Objective-C oder das ‑Schließen in Swift auf, falls einer festgelegt wurde. - Gehen Sie die Deeplink-URLs der Anzeige durch und öffnen Sie die erste, für die eine übereinstimmende App gefunden werden kann.
- Öffnen Sie einen Browser und rufen Sie die klassische Ziel-URL der Anzeige auf.
Für das Attribut customClickHandler
kann in Objective-C ein Block und in Swift ein Closure verwendet werden. Wenn Sie eine Blockierung oder Schließung festlegen, führt das SDK diese aus und ergreift keine weiteren Maßnahmen. Wenn Sie jedoch einen Nullwert festlegen, greift das SDK auf den Deeplink und/oder die Ziel-URLs zurück, die mit der Anzeige registriert sind.
Mit benutzerdefinierten Klick-Handlern kann Ihre App selbst entscheiden, welche Aktion als Reaktion auf einen Klick ausgeführt werden soll, z. B. die Aktualisierung der Benutzeroberfläche, die Präsentation eines anderen Ansichtskontrollers oder die einfache Protokollierung des Klicks. 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"];
Code für native Anzeigen testen
Direkt verkaufte Anzeigen
Wenn Sie direktverkaufte native Anzeigen testen möchten, können Sie diese Ad Manager-Anzeigenblock-ID verwenden:
/21775744923/example/native
Es ist so konfiguriert, dass Beispiel-App-Installations- und Contentanzeigen sowie ein benutzerdefiniertes natives Anzeigenformat mit den folgenden Assets ausgeliefert werden:
- Anzeigentitel (Text)
- MainImage (Bild)
- Bildunterschrift (Text)
Native Backfill-Anzeigen
Verwenden Sie diesen Ad Manager-Anzeigenblock, um das Verhalten von nativen Backfill-Anzeigen zu testen:
/21775744923/example/native-backfill
Es werden Beispiel-App-Installations- und Contentanzeigen mit dem AdChoices-Overlay ausgeliefert.
Denken Sie daran, Ihren Code vor der Veröffentlichung so zu aktualisieren, dass er auf die tatsächlichen Anzeigenblock- und Format-IDs verweist.