שימוש בפורמטים מותאמים אישית של מודעות מותאמות

בחירת פלטפורמה: Android iOS Android (גרסה קודמת)

פורמטים מותאמים אישית של מודעות

בדומה לפורמטים שמוגדרים על ידי המערכת, פורמטים מותאמים אישית של מודעות מותאמות נטענים באמצעות אובייקטים מסוג GADAdLoader. אם כוללים את הקבוע GADAdLoaderAdTypeCustomNative במערך adTypes כשמאתחלים GADAdLoader, הוא יוגדר לבקש פורמטים מותאמים אישית של מודעות מותאמות בזמן הטעינה של המודעות.

GADCustomNativeAdLoaderDelegate

הפרוטוקול לטעינת פורמטים מותאמים אישית כולל שתי שיטות. הראשון משמש את GADAdLoader כדי לגלות אילו מזהי פורמטים צריך לבקש:

Swift

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

Objective-C

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

לכל פורמט מותאם אישית של מודעה מותאמת יש מזהה פורמט תואם שמזהה אותו. כשהשיטה הזו מופעלת, האפליקציה צריכה להחזיר מערך שמכיל את מזהי הפורמטים של המודעות שהיא מוכנה להציג.

ההודעה השנייה נשלחת כשהמודעה המותאמת אישית נטענת, בדומה להודעות של פורמטים שמוגדרים על ידי המערכת:

Swift

public func adLoader(_ adLoader: AdLoader,
    didReceive customNativeAd: CustomNativeAd)

Objective-C

- (void)adLoader:(AdLoader *)adLoader
    didReceiveCustomNativeAd:(CustomNativeAd *)customNativeAd;

מזהי פורמטים

מזהי הפורמטים שמשמשים להפניה ייחודית לפורמטים מותאמים אישית של מודעות מותאמות נמצאים בממשק המשתמש של Ad Manager בקטע מודעות מותאמות בתפריט הנפתח הצגה:

מזהה הפורמט של כל מודעה מותאמת אישית מופיע לצד השם שלה. לחיצה על אחד מהשמות תעביר אתכם למסך פרטים שבו מוצג מידע על השדות של הפורמט:

מכאן אפשר להוסיף, לערוך ולהסיר שדות ספציפיים. שימו לב לשם של כל אחד מהנכסים. השם הוא המפתח שמשמש לקבלת הנתונים של כל נכס כשמציגים את הפורמט המותאם אישית של המודעה מותאמת.

הצגת פורמטים מותאמים אישית של מודעות מותאמות

ההבדל בין פורמטים מותאמים אישית של מודעות מותאמות לבין פורמטים שמוגדרים על ידי המערכת הוא שבעלי תוכן דיגיטלי יכולים להגדיר רשימה משלהם של נכסים שמרכיבים את המודעה. לכן, התהליך להצגת מודעות מותאמות אישית שונה מהתהליך להצגת פורמטים שמוגדרים על ידי המערכת בכמה דרכים:

  1. מכיוון שהמחלקה GADCustomNativeAd נועדה לטפל בכל פורמט מודעה מותאם אישית שאתם יוצרים, אין לה פונקציות גישה לנכסים עם שם. במקום זאת, הוא מציע שיטות כמו imageForKey: ו-stringForKey: שמקבלות את שם השדה כארגומנט.
  2. אין מחלקה ייעודית של תצוגת מודעה כמו GADNativeAdView לשימוש עם GADCustomNativeAd. אתם יכולים להשתמש בכל תצוגה שמתאימה לחוויית המשתמש שלכם.
  3. אין מחלקה ייעודית לתצוגת מודעות, ולכן לא צריך לרשום אף אחת מהתצוגות שבהן אתם משתמשים כדי להציג את הנכסים של המודעה.

הנה דוגמה לתצוגת מודעה שיכולה להציג מודעה מותאמת אישית פשוטה:

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 (קטע)

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"];
}
...

עיבוד של הסמל של AdChoices

כחלק מהתמיכה ב-Digital Services Act (חוק השירותים הדיגיטליים, DSA), מודעות בהזמנה שמוצגות באזור הכלכלי האירופי (EEA) צריכות לכלול את הסמל של AdChoices וקישור לדף "בנוגע למודעה הזו" של Google. כשמטמיעים מודעות מותאמות אישית, אתם אחראים להציג את הסמל של AdChoices. חשוב לבצע את השלבים לעיבוד ולהגדרה של רכיב click listener לסמל של AdChoices כשמעבדים את הנכסים שמצורפים למודעה.

בדוגמה הבאה מוצג הסמל של AdChoices ומוגדרת התנהגות הקליקים.

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);
  ...
}

מודעות וידאו מותאמות בפורמטים מותאמים אישית של מודעות מותאמות

כשיוצרים פורמט מותאם אישית, אפשר להגדיר שהפורמט יתאים לסרטונים.

בהטמעה של האפליקציה, משתמשים במאפיין GADCustomNativeAd.mediaContent כדי לקבל את המופע GADMediaContent של המודעה. כדי לבדוק אם המודעה מכילה קטע וידאו, בודקים את המאפיין hasVideoContent. אם המודעה כוללת תוכן וידאו, יוצרים תצוגת GADMediaView, מקצים את המאפיין mediaContent ומוסיפים את תצוגת המדיה להיררכיית התצוגות. אם במודעה אין קטע וידאו, צריך להציג נכס חלופי, כמו תמונה.

בדוגמה הבאה, המערכת בודקת אם יש במודעה קטע וידאו, ואם אין וידאו זמין, היא מציגה תמונה במקום:

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],
  ]];
}

פרטים על התאמה אישית של סרטון במודעה מותאמת אישית מופיעים במחלקה GADVideoController.

כדי להטמיע מודעות וידאו מותאמות אישית, אפשר לעיין בדוגמה לעיבוד מותאם אישית ב-Ad Manager ב-Swift וב-Objective-C.

טיפול בקליקים על מודעות מותאמות ובחשיפות

בפורמטים מותאמים אישית של מודעות מותאמות, האפליקציה אחראית לתעד חשיפות ולדווח על אירועי קליקים ל-SDK.

מתקבלות חשיפות

כדי לתעד חשיפה של מודעה מותאמת אישית, פשוט מפעילים את ה-method‏ recordImpression ב-GADCustomNativeAd המתאים:

Swift

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

ערכת ה-SDK מונעת תיעוד של חשיפות כפולות לבקשה אחת, אם האפליקציה קוראת בטעות ל-method כמה פעמים לאותה מודעה.

דיווח על קליקים

כדי לדווח ל-SDK שהתרחשה קליק על תצוגת נכס, צריך להפעיל את ה-method‏ performClickOnAssetWithKey: ב-GADCustomNativeAd המתאים ולהעביר את שם הנכס שעליו בוצעה הקליק. לדוגמה, אם יש לכם נכס בפורמט המותאם אישית שנקרא MainImage, ואתם רוצים לדווח על קליק בתצוגה שתואמת לנכס הזה, הקוד שלכם ייראה כך:

Swift

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

חשוב לזכור שלא צריך להפעיל את ה-method הזו לכל תצוגת נכס שמשויכת למודעה. לדוגמה, אם יש לכם נכס אחר שנקרא "כיתוב" שנועד להצגה אבל לא ללחיצה או להקשה על ידי המשתמש, האפליקציה לא צריכה להפעיל את performClickOnAssetWithKey: עבור התצוגה הזו.

תגובה לפעולות קליק בהתאמה אישית

ל-GADCustomNativeAd יש מאפיין customClickHandler מסוג GADNativeAdCustomClickHandler

Swift

typealias NativeAdCustomClickHandler = (assetID: String) -> Void

Objective-C

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

זהו בלוק (Objective-C) או סגור (Swift) שמקבל assetID כפרמטר קלט, שמזהה את הנכס שעליו לחצו.

כשמשתמש לוחץ על מודעה מותאמת אישית, יש שלוש תגובות אפשריות של ה-SDK, לפי הסדר הבא:

  1. מפעילים את הבלוק customClickHandler ב-Objective-C או את הסגירה ב-Swift, אם הוגדרו.
  2. עוברים על כתובות ה-URL של קישורי העומק של המודעה ופותחים את הראשונה שנמצאה לה אפליקציה תואמת.
  3. פותחים דפדפן ועוברים לכתובת היעד הרגילה של המודעה.

המאפיין customClickHandler מקבל בלוק ב-Objective-C וסגירה ב-Swift. אם מגדירים בלוק או סגירה, ה-SDK יפעיל אותם ולא יבצע פעולות נוספות. עם זאת, אם תגדירו ערך nil, ערכת ה-SDK תשתמש בקישור העומק או בכתובות היעד שרשומות במודעה.

רכיבי handler מותאמים אישית של קליקים מאפשרים לאפליקציה להחליט בעצמה מהי הפעולה הטובה ביותר שצריך לבצע בתגובה לקליק, בין אם מדובר בעדכון של ממשק המשתמש, בהצגת בקר תצוגה אחר או רק ברישום הקליק ביומן. דוגמה להצגת התראה:

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"];

בדיקת הקוד של המודעה המותאמת

מודעות במכירה ישירה

אם אתם רוצים לבדוק איך נראות מודעות מותאמות שנמכרות ישירות, אתם יכולים להשתמש במזהה יחידת המודעות הבא ב-Ad Manager:

/21775744923/example/native

הוא מוגדר להציג מודעות להתקנת אפליקציה לדוגמה ומודעות באתרי תוכן, וגם פורמט מותאם אישית של מודעות מותאמות עם הנכסים הבאים:

  • כותרת (טקסט)
  • MainImage (תמונה)
  • כיתוב (טקסט)

מודעות מילוי מותאמות

כדי לבדוק את ההתנהגות של מודעות מילוי מותאמות, צריך להשתמש ביחידת המודעות הבאה ב-Ad Manager:

/21775744923/example/native-backfill

הוא יציג מודעות לדוגמה להתקנת אפליקציות ומודעות באתרי תוכן שכוללות את שכבת-העל של AdChoices.

חשוב לזכור לעדכן את הקוד כך שיפנה למזהים האמיתיים של יחידת המודעות והפורמט לפני שהאפליקציה תהיה זמינה לקהל הרחב.