Benutzerdefinierte Anzeigenformate
Wie ihre systemdefinierten Gegenstücke werden benutzerdefinierte native Anzeigenformate mit GADAdLoader-Objekten geladen. Wenn Sie die Konstante GADAdLoaderAdTypeCustomNative beim Initialisieren eines GADAdLoader in das Array adTypes aufnehmen, wird es so konfiguriert, dass beim Laden von Anzeigen benutzerdefinierte native Formate angefordert werden.
GADCustomNativeAdLoaderDelegate
Das Protokoll zum Laden benutzerdefinierter Formate umfasst zwei Methoden. Die erste wird von GADAdLoader verwendet, um herauszufinden, welche Format-IDs angefordert werden sollen:
Swift
public func customNativeAdFormatIDs(for adLoader: AdLoader) -> [Any]
Objective-C
- (NSArray *)customNativeAdFormatIDsForAdLoader:(AdLoader *)adLoader;
Jedes benutzerdefinierte native Anzeigenformat hat eine entsprechende Format-ID, mit der es identifiziert wird. Wenn diese Methode aufgerufen wird, sollte Ihre App ein Array mit den Format-IDs der Anzeigen zurückgeben, die sie anzeigen kann.
Die zweite Nachricht wird gesendet, wenn die benutzerdefinierte native Anzeige geladen wurde, ähnlich wie bei systemdefinierten Formaten:
Swift
public func adLoader(_ adLoader: AdLoader, didReceive customNativeAd: CustomNativeAd)
Objective-C
- (void)adLoader:(AdLoader *)adLoader didReceiveCustomNativeAd:(CustomNativeAd *)customNativeAd;
Format-IDs
Die Format-IDs, die zur eindeutigen Identifizierung benutzerdefinierter nativer Anzeigenformate verwendet werden, finden Sie in der Ad Manager-Benutzeroberfläche im Bereich Nativ im Drop-down-Menü Auslieferung:

Die Format-ID jeder benutzerdefinierten nativen Anzeige wird neben ihrem Namen angezeigt. 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, mit dem die Daten für jedes Asset abgerufen werden, wenn Ihr benutzerdefiniertes natives Anzeigenformat angezeigt wird.
Benutzerdefinierte native Anzeigenformate anzeigen
Benutzerdefinierte native Anzeigenformate unterscheiden sich von systemdefinierten Formaten dadurch, dass Publisher ihre eigene Liste von Assets definieren können, aus denen eine Anzeige besteht. Aus diesem Grund unterscheidet sich der Prozess für die Auslieferung benutzerdefinierter nativer Anzeigen in einigen Punkten von dem für systemdefinierte Formate:
- Da
GADCustomNativeAdfür alle von Ihnen erstellten benutzerdefinierten nativen Anzeigenformate verwendet werden kann, gibt es keine benannten Asset-Zugriffsfunktionen. Stattdessen werden Methoden wieimageForKey:undstringForKey:angeboten, die den Namen des Felds als Argument verwenden. - Es gibt keine spezielle Anzeigenansichtsklasse wie
GADNativeAdView, die mitGADCustomNativeAdverwendet werden kann. Sie können jede Ansicht verwenden, die für Ihre User Experience sinnvoll ist. - Da es keine spezielle Anzeigenansichtsklasse gibt, müssen Sie keine der Ansichten registrieren, die Sie zum Anzeigen der Assets der Anzeige 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: CustomNativeAd) { ... } }
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: CustomNativeAd) { 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"]; } ...
Datenschutzinfo-Symbol rendern
Im Rahmen der Unterstützung des Gesetzes über digitale Dienste (Digital Services Act, DSA) sind für Reservierungsanzeigen, die im Europäischen Wirtschaftsraum (EWR) ausgeliefert werden, ein Datenschutzinfo-Symbol und ein Link zur Google-Seite „Infos zur Anzeige“ erforderlich. 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 Datenschutzinfo-Symbol 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:
NativeAssetIdentifier.adChoicesViewAsset.rawValue)
}
func populate(withCustomNativeAd customNativeAd: CustomNativeAd) {
// Render the AdChoices image.
let adChoicesKey = NativeAssetIdentifier.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);
...
}
Native Videos für benutzerdefinierte native Anzeigenformate
Wenn Sie ein benutzerdefiniertes Format erstellen, können Sie es für Videos aktivieren.
Verwenden Sie in Ihrer App-Implementierung das Attribut GADCustomNativeAd.mediaContent, um die GADMediaContent-Instanz der Anzeige abzurufen.
Prüfen Sie die Property hasVideoContent, um festzustellen, ob die Anzeige Videoinhalte enthält. Wenn die Anzeige Videoinhalte enthält, erstellen Sie eine GADMediaView-Ansicht, weisen Sie das Attribut mediaContent zu und fügen Sie die Medienansicht der Ansichtshierarchie hinzu. Wenn die Anzeige keine Videoinhalte enthält, rendern Sie ein alternatives Asset, z. B. ein Bild.
Im folgenden Beispiel wird geprüft, ob die Anzeige Videoinhalte enthält. Wenn kein Video verfügbar ist, wird stattdessen ein Bild angezeigt:
Swift
func populate(withCustomNativeAd customNativeAd: CustomNativeAd) {
// Remove all the media placeholder's subviews.
for subview: UIView in mainPlaceholder.subviews {
subview.removeFromSuperview()
}
// This custom native ad has both a video and image associated with it. Use the video
// asset if available, or fall back to the image asset.
let mainView: UIView
if customNativeAd.mediaContent.hasVideoContent {
let mediaView = MediaView()
mediaView.mediaContent = customNativeAd.mediaContent
mainView = mediaView
} else {
let image: UIImage? = customNativeAd.image(forKey: "MainImage")?.image
mainView = UIImageView(image: image)
}
mainPlaceholder.addSubview(mainView)
// Size the media view to fill the container size.
mainView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
mainView.leadingAnchor.constraint(equalTo: mainPlaceholder.leadingAnchor),
mainView.trailingAnchor.constraint(equalTo: mainPlaceholder.trailingAnchor),
mainView.topAnchor.constraint(equalTo: mainPlaceholder.topAnchor),
mainView.bottomAnchor.constraint(equalTo: mainPlaceholder.bottomAnchor),
])
}
Objective-C
- (void)populateWithCustomNativeAd:(GADCustomNativeAd *)customNativeAd {
// Remove all the media placeholder's subviews.
for (UIView *subview in self.mainPlaceholder.subviews) {
[subview removeFromSuperview];
}
// This custom native ad has both a video and image associated with it. Use the video
// asset if available, or fall back to the image asset.
UIView *mainView = nil;
if (customNativeAd.mediaContent.hasVideoContent) {
GADMediaView *mediaView = [[GADMediaView alloc] init];
mediaView.mediaContent = customNativeAd.mediaContent;
mainView = mediaView;
} else {
UIImage *image = [customNativeAd imageForKey:@"MainImage"].image;
mainView = [[UIImageView alloc] initWithImage:image];
}
[self.mainPlaceholder addSubview:mainView];
// Size the media view to fill the container size.
mainView.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[
[mainView.leadingAnchor constraintEqualToAnchor:self.mainPlaceholder.leadingAnchor],
[mainView.trailingAnchor constraintEqualToAnchor:self.mainPlaceholder.trailingAnchor],
[mainView.topAnchor constraintEqualToAnchor:self.mainPlaceholder.topAnchor],
[mainView.bottomAnchor constraintEqualToAnchor:self.mainPlaceholder.bottomAnchor],
]];
}
Weitere Informationen zum Anpassen eines benutzerdefinierten nativen Anzeigenvideos finden Sie in der Klasse GADVideoController.
Ein Beispiel für die Implementierung von benutzerdefinierten nativen Videos finden Sie im Ad Manager-Beispiel für benutzerdefiniertes Rendering in Swift und Objective-C.
Klicks und Impressionen für benutzerdefinierte native Anzeigen verarbeiten
Bei benutzerdefinierten nativen Anzeigenformaten ist Ihre App für die Erfassung von Impressionen und die Meldung von Click-Events 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, wenn die Methode in Ihrer App versehentlich mehrmals für dieselbe Anzeige aufgerufen wird.
Klicks melden
Wenn Sie dem SDK melden möchten, dass ein Klick auf eine Asset-Ansicht erfolgt ist, rufen Sie die Methode performClickOnAssetWithKey: für das entsprechende GADCustomNativeAd auf und übergeben Sie den Namen des Assets, auf das geklickt wurde.
Wenn Sie beispielsweise ein Asset in Ihrem benutzerdefinierten Format mit dem Namen „MainImage“ haben und einen Klick auf die Ansicht erfassen möchten, die diesem Asset entspricht, sieht Ihr Code so aus:
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 mit dem Namen „Untertitel“ haben, das angezeigt, aber nicht vom Nutzer angeklickt oder angetippt 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 NativeAdCustomClickHandler = (assetID: String) -> Void
Objective-C
typedef void (^GADNativeAdCustomClickHandler)(NSString *assetID);
Dies ist ein Block (Objective-C) / Closure (Swift), der ein assetID als Eingabeparameter akzeptiert, mit dem das angeklickte Asset identifiziert wird.
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 den Closure in Swift auf, falls einer festgelegt wurde. - Gehen Sie die Deeplink-URLs der Anzeige durch und öffnen Sie die erste, für die eine passende App gefunden wird.
- Öffnen Sie einen Browser und rufen Sie die herkömmliche Ziel-URL der Anzeige auf.
Das Attribut customClickHandler akzeptiert einen Block in Objective-C und einen Closure in Swift. Wenn Sie einen Block oder eine Closure festlegen, wird diese vom SDK ausgeführt und es werden keine weiteren Maßnahmen ergriffen. Wenn Sie einen Nullwert festlegen, greift das SDK auf die Deeplink- und/oder Ziel-URLs zurück, die für die Anzeige registriert sind.
Mit benutzerdefinierten Klick-Handlern kann Ihre App selbst entscheiden, welche Aktion am besten auf einen Klick folgt, z. B. die Aktualisierung der Benutzeroberfläche, die Darstellung eines anderen Ansichts-Controllers oder einfach nur die Protokollierung des Klicks. Hier ein Beispiel für eine Warnung:
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 direkt verkaufte native Anzeigen testen möchten, können Sie diese Ad Manager-Anzeigenblock-ID verwenden:
/21775744923/example/native
Sie 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 nativer Backfill-Anzeigen zu testen:
/21775744923/example/native-backfill
Es werden Beispiel-App-Installations- und Contentanzeigen mit dem Datenschutzinfo-Overlay ausgeliefert.
Denken Sie daran, Ihren Code vor der Veröffentlichung so zu aktualisieren, dass er auf Ihre tatsächlichen Anzeigenblock- und Format-IDs verweist.