Vorbereitung
Schließen Sie die Einrichtung benutzerdefinierter Ereignisse ab.
Native Anzeige anfordern
Wenn die
benutzerdefinierte Ereignis-Werbebuchung in der
Vermittlungskette der Vermittlungsabfolge erreicht ist,
Die Methode loadNativeAd:adConfiguration:completionHandler:
wird im
Klassennamen, den Sie beim Erstellen eines benutzerdefinierten
. In diesem Fall
befindet sich diese Methode in SampleCustomEvent
, wodurch
Methode loadNativeAd:adConfiguration:completionHandler:
in
SampleCustomEventNative
Wenn Sie eine native Anzeige anfordern möchten, müssen Sie eine Klasse erstellen oder ändern, mit der
GADMediationAdapter
und loadNativeAd:adConfiguration:completionHandler:
. Wenn
eine Klasse mit der Erweiterung GADMediationAdapter
existiert, implementieren Sie
loadNativeAd:adConfiguration:completionHandler:
dort. Erstellen Sie außerdem ein
neue Klasse zur Implementierung von GADMediationNativeAd
.
In unserem Beispiel für ein benutzerdefiniertes Ereignis
SampleCustomEvent
implementiert
der GADMediationAdapter
-Schnittstelle und delegiert dann
SampleCustomEventNative
Swift
import GoogleMobileAds class SampleCustomEvent: NSObject, GADMediationAdapter { fileprivate var nativeAd: SampleCustomEventNativeAd? func loadNativeAd( for adConfiguration: GADMediationNativeAdConfiguration, completionHandler: @escaping GADMediationNativeAdLoadCompletionHandler ) { self.nativeAd = SampleCustomEventNativeAd() self.nativeAd?.loadNativeAd( for: adConfiguration, completionHandler: completionHandler) } }
Objective-C
#import "SampleCustomEvent.h" @implementation SampleCustomEvent SampleCustomEventNativeAd *sampleNativeAd; - (void)loadNativeAdForAdConfiguration: (GADMediationNativeAdConfiguration *)adConfiguration completionHandler: (GADMediationNativeAdLoadCompletionHandler) completionHandler { sampleNative = [[SampleCustomEventNativeAd alloc] init]; [sampleNative loadNativeAdForAdConfiguration:adConfiguration completionHandler:completionHandler]; }
SampleCustomEventNative ist für die folgenden Aufgaben verantwortlich:
Native Anzeige laden
GADMediationNativeAd
-Protokoll implementierenCallbacks für Anzeigenereignisse an das Google Mobile Ads SDK empfangen und melden
Der in der Ad Manager-Benutzeroberfläche definierte optionale Parameter ist in der Anzeigenkonfiguration enthalten.
Der Zugriff auf den Parameter ist über
adConfiguration.credentials.settings[@"parameter"]
Dieser Parameter ist
in der Regel eine Anzeigenblock-ID,
die ein Werbenetzwerk-SDK benötigt,
das Instanziieren eines Anzeigenobjekts.
Swift
class SampleCustomEventNativeAd: NSObject, GADMediationNativeAd { /// The Sample Ad Network native ad. var nativeAd: SampleNativeAd? /// The ad event delegate to forward ad rendering events to the Google Mobile /// Ads SDK. var delegate: GADMediationNativeAdEventDelegate? /// Completion handler called after ad load var completionHandler: GADMediationNativeLoadCompletionHandler? func loadNativeAd( for adConfiguration: GADMediationNativeAdConfiguration, completionHandler: @escaping GADMediationNativeLoadCompletionHandler ) { let adLoader = SampleNativeAdLoader() let sampleRequest = SampleNativeAdRequest() // The Google Mobile Ads SDK requires the image assets to be downloaded // automatically unless the publisher specifies otherwise by using the // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If // your network doesn't have an option like this and instead only ever // returns URLs for images (rather than the images themselves), your adapter // should download image assets on behalf of the publisher. This should be // done after receiving the native ad object from your network's SDK, and // before calling the connector's adapter:didReceiveMediatedNativeAd: method. sampleRequest.shouldDownloadImages = true sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any sampleRequest.shouldRequestMultipleImages = false let options = adConfiguration.options for loaderOptions: GADAdLoaderOptions in options { if let imageOptions = loaderOptions as? GADNativeAdImageAdLoaderOptions { sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages // If the GADNativeAdImageAdLoaderOptions' disableImageLoading property is // YES, the adapter should send just the URLs for the images. sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading } else if let mediaOptions = loaderOptions as? GADNativeAdMediaAdLoaderOptions { switch mediaOptions.mediaAspectRatio { case GADMediaAspectRatio.landscape: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.landscape case GADMediaAspectRatio.portrait: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.portrait default: sampleRequest.preferredImageOrientation = NativeAdImageOrientation.any } } } // This custom event uses the server parameter to carry an ad unit ID, which // is the most common use case. adLoader.delegate = self adLoader.adUnitID = adConfiguration.credentials.settings["parameter"] as? String self.completionHandler = completionHandler adLoader.fetchAd(sampleRequest) } }
Objective-C
#import "SampleCustomEventNativeAd.h" @interface SampleCustomEventNativeAd () <SampleNativeAdDelegate, GADMediationNativeAd> { /// The sample native ad. SampleNativeAd *_nativeAd; /// The completion handler to call when the ad loading succeeds or fails. GADMediationNativeLoadCompletionHandler _loadCompletionHandler; /// The ad event delegate to forward ad rendering events to the Google Mobile /// Ads SDK. id<GADMediationNativeAdEventDelegate> _adEventDelegate; } @end - (void)loadNativeAdForAdConfiguration: (GADMediationNativeAdConfiguration *)adConfiguration completionHandler:(GADMediationNativeLoadCompletionHandler) completionHandler { __block atomic_flag completionHandlerCalled = ATOMIC_FLAG_INIT; __block GADMediationNativeLoadCompletionHandler originalCompletionHandler = [completionHandler copy]; _loadCompletionHandler = ^id<GADMediationNativeAdEventDelegate>( _Nullable id<GADMediationNativeAd> ad, NSError *_Nullable error) { // Only allow completion handler to be called once. if (atomic_flag_test_and_set(&completionHandlerCalled)) { return nil; } id<GADMediationNativeAdEventDelegate> delegate = nil; if (originalCompletionHandler) { // Call original handler and hold on to its return value. delegate = originalCompletionHandler(ad, error); } // Release reference to handler. Objects retained by the handler will also // be released. originalCompletionHandler = nil; return delegate; }; SampleNativeAdLoader *adLoader = [[SampleNativeAdLoader alloc] init]; SampleNativeAdRequest *sampleRequest = [[SampleNativeAdRequest alloc] init]; // The Google Mobile Ads SDK requires the image assets to be downloaded // automatically unless the publisher specifies otherwise by using the // GADNativeAdImageAdLoaderOptions object's disableImageLoading property. If // your network doesn't have an option like this and instead only ever returns // URLs for images (rather than the images themselves), your adapter should // download image assets on behalf of the publisher. This should be done after // receiving the native ad object from your network's SDK, and before calling // the connector's adapter:didReceiveMediatedNativeAd: method. sampleRequest.shouldDownloadImages = YES; sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny; sampleRequest.shouldRequestMultipleImages = NO; sampleRequest.testMode = adConfiguration.isTestRequest; for (GADAdLoaderOptions *loaderOptions in adConfiguration.options) { if ([loaderOptions isKindOfClass:[GADNativeAdImageAdLoaderOptions class]]) { GADNativeAdImageAdLoaderOptions *imageOptions = (GADNativeAdImageAdLoaderOptions *)loaderOptions; sampleRequest.shouldRequestMultipleImages = imageOptions.shouldRequestMultipleImages; // If the GADNativeAdImageAdLoaderOptions' disableImageLoading property is // YES, the adapter should send just the URLs for the images. sampleRequest.shouldDownloadImages = !imageOptions.disableImageLoading; } else if ([loaderOptions isKindOfClass:[GADNativeAdMediaAdLoaderOptions class]]) { GADNativeAdMediaAdLoaderOptions *mediaOptions = (GADNativeAdMediaAdLoaderOptions *)loaderOptions; switch (mediaOptions.mediaAspectRatio) { case GADMediaAspectRatioLandscape: sampleRequest.preferredImageOrientation = NativeAdImageOrientationLandscape; break; case GADMediaAspectRatioPortrait: sampleRequest.preferredImageOrientation = NativeAdImageOrientationPortrait; break; default: sampleRequest.preferredImageOrientation = NativeAdImageOrientationAny; break; } } else if ([loaderOptions isKindOfClass:[GADNativeAdViewAdOptions class]]) { _nativeAdViewAdOptions = (GADNativeAdViewAdOptions *)loaderOptions; } } // This custom event uses the server parameter to carry an ad unit ID, which // is the most common use case. NSString *adUnit = adConfiguration.credentials.settings[@"parameter"]; adLoader.adUnitID = adUnit; adLoader.delegate = self; [adLoader fetchAd:sampleRequest]; }
Unabhängig davon, ob die Anzeige erfolgreich abgerufen wurde oder ein Fehler auftritt,
GADMediationNativeAdLoadCompletionHandler
aufrufen. Im Erfolgsfall
die Klasse übergeben, die GADMediationNativeAd
mit einem nil
-Wert implementiert
für den Parameter „error“: im Fehlerfall den Fehler, den Sie
gefunden wurden.
Üblicherweise werden diese Methoden innerhalb von Callbacks aus dem
Drittanbieter-SDK Ihres Adapters. In diesem Beispiel enthält das Beispiel-SDK
hat ein SampleNativeAdDelegate
mit relevanten Callbacks:
Swift
func adLoader( _ adLoader: SampleNativeAdLoader, didReceive nativeAd: SampleNativeAd ) { extraAssets = [ SampleCustomEventConstantsSwift.awesomenessKey: nativeAd.degreeOfAwesomeness ?? "" ] if let image = nativeAd.image { images = [GADNativeAdImage(image: image)] } else { let imageUrl = URL(fileURLWithPath: nativeAd.imageURL) images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)] } if let mappedIcon = nativeAd.icon { icon = GADNativeAdImage(image: mappedIcon) } else { let iconURL = URL(fileURLWithPath: nativeAd.iconURL) icon = GADNativeAdImage(url: iconURL, scale: nativeAd.iconScale) } adChoicesView = SampleAdInfoView() self.nativeAd = nativeAd if let handler = completionHandler { delegate = handler(self, nil) } } func adLoader( _ adLoader: SampleNativeAdLoader, didFailToLoadAdWith errorCode: SampleErrorCode ) { let error = SampleCustomEventUtilsSwift.SampleCustomEventErrorWithCodeAndDescription( code: SampleCustomEventErrorCodeSwift .SampleCustomEventErrorAdLoadFailureCallback, description: "Sample SDK returned an ad load failure callback with error code: \(errorCode)" ) if let handler = completionHandler { delegate = handler(nil, error) } }
Objective-C
- (void)adLoader:(SampleNativeAdLoader *)adLoader didReceiveNativeAd:(SampleNativeAd *)nativeAd { if (nativeAd.image) { _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ]; } else { NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL]; _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:nativeAd.imageScale] ]; } if (nativeAd.icon) { _icon = [[GADNativeAdImage alloc] initWithImage:nativeAd.icon]; } else { NSURL *iconURL = [[NSURL alloc] initFileURLWithPath:nativeAd.iconURL]; _icon = [[GADNativeAdImage alloc] initWithURL:iconURL scale:nativeAd.iconScale]; } // The sample SDK provides an AdChoices view (SampleAdInfoView). If your SDK // provides image and click through URLs for its AdChoices icon instead of an // actual UIView, the adapter is responsible for downloading the icon image // and creating the AdChoices icon view. _adChoicesView = [[SampleAdInfoView alloc] init]; _nativeAd = nativeAd; _adEventDelegate = _loadCompletionHandler(self, nil); } - (void)adLoader:(SampleNativeAdLoader *)adLoader didFailToLoadAdWithErrorCode:(SampleErrorCode)errorCode { NSError *error = SampleCustomEventErrorWithCodeAndDescription( SampleCustomEventErrorAdLoadFailureCallback, [NSString stringWithFormat:@"Sample SDK returned an ad load failure " @"callback with error code: %@", errorCode]); _adEventDelegate = _loadCompletionHandler(nil, error); }
Native Anzeigen zuordnen
Die verschiedenen SDKs haben eigene Formate für native Anzeigen. Jemand könnte zurückkehren Objekte, die einen „title“ enthalten während ein anderes Feld „headline“. Außerdem werden die Methoden, mit denen Impressionen nachverfolgt und verarbeitet werden, Die Anzahl der Klicks kann von SDK zu SDK variieren.
Wenn ein benutzerdefiniertes Ereignis ein natives Anzeigenobjekt von einem
sollte sie eine Klasse verwenden, die GADMediationNativeAd
,
wie SampleCustomEventNativeAd
, zu „map“ Das native Anzeigenobjekt des vermittelten SDKs
Sie entspricht also der Schnittstelle, die vom Google Mobile Ads SDK erwartet wird.
Sehen wir uns nun die Implementierungsdetails für SampleCustomEventNativeAd
genauer an.
Zuordnungen speichern
Für GADMediationNativeAd
werden bestimmte Properties implementiert, die den Properties anderer SDKs zugeordnet werden:
Swift
var nativeAd: SampleNativeAd? var headline: String? { return nativeAd?.headline } var images: [GADNativeAdImage]? var body: String? { return nativeAd?.body } var icon: GADNativeAdImage? var callToAction: String? { return nativeAd?.callToAction } var starRating: NSDecimalNumber? { return nativeAd?.starRating } var store: String? { return nativeAd?.store } var price: String? { return nativeAd?.price } var advertiser: String? { return nativeAd?.advertiser } var extraAssets: [String: Any]? { return [ SampleCustomEventConstantsSwift.awesomenessKey: nativeAd?.degreeOfAwesomeness ?? "" ] } var adChoicesView: UIView? var mediaView: UIView? { return nativeAd?.mediaView }
Objective-C
/// Used to store the ad's images. In order to implement the /// GADMediationNativeAd protocol, we use this class to return the images /// property. NSArray<GADNativeAdImage *> *_images; /// Used to store the ad's icon. In order to implement the GADMediationNativeAd /// protocol, we use this class to return the icon property. GADNativeAdImage *_icon; /// Used to store the ad's ad choices view. In order to implement the /// GADMediationNativeAd protocol, we use this class to return the adChoicesView /// property. UIView *_adChoicesView; - (nullable NSString *)headline { return _nativeAd.headline; } - (nullable NSArray<GADNativeAdImage *> *)images { return _images; } - (nullable NSString *)body { return _nativeAd.body; } - (nullable GADNativeAdImage *)icon { return _icon; } - (nullable NSString *)callToAction { return _nativeAd.callToAction; } - (nullable NSDecimalNumber *)starRating { return _nativeAd.starRating; } - (nullable NSString *)store { return _nativeAd.store; } - (nullable NSString *)price { return _nativeAd.price; } - (nullable NSString *)advertiser { return _nativeAd.advertiser; } - (nullable NSDictionary<NSString *, id> *)extraAssets { return @{SampleCustomEventExtraKeyAwesomeness : _nativeAd.degreeOfAwesomeness}; } - (nullable UIView *)adChoicesView { return _adChoicesView; } - (nullable UIView *)mediaView { return _nativeAd.mediaView; } - (BOOL)hasVideoContent { return self.mediaView != nil; }
Einige vermittelte Netzwerke können zusätzliche Assets bereitstellen, die über die vom
Google Mobile Ads SDK. Das GADMediationNativeAd
-Protokoll enthält eine Methode
den Namen extraAssets
, mit dem das Google Mobile Ads SDK
diese „Extra“ Assets aus Ihrem Kartografen.
Kartenbild-Assets
Das Zuordnen von Bild-Assets ist komplizierter als das Zuordnen einfacher Daten
Typen wie NSString
oder double
. Bilder können automatisch heruntergeladen oder als URL-Werte zurückgegeben werden. Auch die Pixeldichte kann variieren.
Damit Sie diese Informationen leichter verwalten können, stellt das Google Mobile Ads SDK Folgendes bereit:
Klasse GADNativeAdImage
. Informationen zu Bild-Assets (tatsächliche UIImage
)
oder nur NSURL
-Werte) an das Google Mobile Ads SDK zurückgegeben werden.
mit dieser Klasse.
So erstellt die Mapper-Klasse eine GADNativeAdImage
für das Symbolbild:
Swift
if let image = nativeAd.image { images = [GADNativeAdImage(image: image)] } else { let imageUrl = URL(fileURLWithPath: nativeAd.imageURL) images = [GADNativeAdImage(url: imageUrl, scale: nativeAd.imageScale)] }
Objective-C
if (nativeAd.image) { _images = @[ [[GADNativeAdImage alloc] initWithImage:nativeAd.image] ]; } else { NSURL *imageURL = [[NSURL alloc] initFileURLWithPath:nativeAd.imageURL]; _images = @[ [[GADNativeAdImage alloc] initWithURL:imageURL scale:nativeAd.imageScale] ]; }
Impressions- und Klickereignisse
Sowohl das Google Mobile Ads SDK als auch das vermittelte SDK müssen wissen, Impressionen oder Klicks erfolgen, aber diese Ereignisse müssen nur von einem SDK erfasst werden. Es stehen für zwei verschiedene Ansätze für benutzerdefinierte Ereignisse, Vermitteltes SDK unterstützt das eigenständige Tracking von Impressionen und Klicks.
Klicks und Impressionen mit dem Google Mobile Ads SDK erfassen
Wenn das vermittelte SDK kein eigenes Impressions- und Klick-Tracking durchführt,
Methoden zur Erfassung von Klicks und Impressionen zur Verfügung stellt, können Sie mit dem Google Mobile Ads SDK
diese Ereignisse nachzuverfolgen
und den Adapter zu benachrichtigen. Das GADMediationNativeAd
-Protokoll
enthält zwei Methoden: didRecordImpression:
und
didRecordClickOnAssetWithName:view:viewController:
, die benutzerdefinierte Ereignisse
implementieren, um die entsprechende Methode für das vermittelte native Anzeigenobjekt aufzurufen:
Swift
func didRecordImpression() { nativeAd?.recordImpression() } func didRecordClickOnAsset( withName assetName: GADUnifiedNativeAssetIdentifier, view: UIView, wController: UIViewController ) { nativeAd?.handleClick(on: view) }
Objective-C
- (void)didRecordImpression { if (self.nativeAd) { [self.nativeAd recordImpression]; } } - (void)didRecordClickOnAssetWithName:(GADUnifiedNativeAssetIdentifier)assetName view:(UIView *)view viewController:(UIViewController *)viewController { if (self.nativeAd) { [self.nativeAd handleClickOnView:view]; } }
Weil die Klasse, die GADMediationNativeAd
implementiert,
einen Verweis auf das native Anzeigenobjekt des Beispiel-SDK enthält, kann es die Methode
zur Erfassung eines Klicks oder einer Impression. Die Methode didRecordClickOnAssetWithName:view:viewController:
nimmt einen einzelnen Parameter an: das View
-Objekt, das dem nativen Anzeigen-Asset entspricht, auf das der Klick erfolgte.
Klicks und Impressionen mit dem vermittelten SDK erfassen
Einige vermittelte SDKs erfassen Klicks und Impressionen möglicherweise lieber selbst. In
In diesem Fall sollten Sie die handlesUserClicks
und
handlesUserImpressions
-Methoden wie im Snippet unten gezeigt. Durch die Rückkehr
YES
, geben Sie an, dass das benutzerdefinierte Ereignis die Verantwortung für das Tracking übernimmt.
diese Ereignisse und das Google Mobile Ads SDK wird benachrichtigt, wenn sie eintreten.
Bei benutzerdefinierten Ereignissen, die das Klick- und Impressions-Tracking überschreiben, kann die Ansicht der nativen Anzeige über die Nachricht didRenderInView:
an das native Anzeigenobjekt des vermittelten SDKs übergeben werden, damit das vermittelte SDK das tatsächliche Tracking durchführen kann. Im Beispiel-SDK aus unserem Beispielprojekt für benutzerdefinierte Ereignisse (aus dem die Code-Snippets in diesem Leitfaden stammen) wird dieser Ansatz nicht verwendet. Würde er verwendet, würde der Code für benutzerdefinierte Ereignisse die Methode setNativeAdView:view:
aufrufen, wie im folgenden Snippet gezeigt:
Swift
func handlesUserClicks() -> Bool { return true } func handlesUserImpressions() -> Bool { return true } func didRender( in view: UIView, clickableAssetViews: [GADNativeAssetIdentifier: UIView], nonclickableAssetViews: [GADNativeAssetIdentifier: UIView], viewController: UIViewController ) { // This method is called when the native ad view is rendered. Here you would pass the UIView // back to the mediated network's SDK. self.nativeAd?.setNativeAdView(view) }
Objective-C
- (BOOL)handlesUserClicks { return YES; } - (BOOL)handlesUserImpressions { return YES; } - (void)didRenderInView:(UIView *)view clickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *) clickableAssetViews nonclickableAssetViews:(NSDictionary<GADNativeAssetIdentifier, UIView *> *) nonclickableAssetViews viewController:(UIViewController *)viewController { // This method is called when the native ad view is rendered. Here you would // pass the UIView back to the mediated network's SDK. Playing video using // SampleNativeAd's playVideo method [_nativeAd setNativeAdView:view]; }
Vermittlungsereignisse an das Google Mobile Ads SDK weiterleiten
Nach dem Anruf
GADMediationNativeLoadCompletionHandler
mit einer geladenen Anzeige wird der zurückgegebene Bevollmächtigte GADMediationNativeAdEventDelegate
-Objekt kann dann vom Adapter verwendet werden, um Präsentationsereignisse aus dem
mit dem Google Mobile Ads SDK verknüpfen.
Es ist wichtig, dass Ihr benutzerdefiniertes Ereignis so viele dieser Callbacks weiterleitet wie Damit eure App diese äquivalenten Ereignisse vom Google Mobile Ads SDK. Hier ist ein Beispiel für die Verwendung von Callbacks:
Damit ist die Implementierung der benutzerdefinierten Ereignisse für native Anzeigen abgeschlossen. Vollständiges Beispiel ist verfügbar auf GitHub