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

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

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

GADCustomNativeAdLoaderDelegate

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

Swift

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

Objective-C

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

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

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

Swift

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

Objective-C

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

מזהי פורמטים

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

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

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

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

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

  1. מכיוון ש-GADCustomNativeAd נועד לטפל בכל פורמט של מודעה מותאמת אישית שאתם יוצרים, אין לו גישות (accessors) לאתרים בשם. במקום זאת, הוא מציע שיטות כמו 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: 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 (קטע)

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

עיבוד (רנדר) של סמל AdChoices

כחלק מהתמיכה ב-Digital Services Act (חוק השירותים הדיגיטליים), מודעות בהזמנה שמוצגות באזור הכלכלי האירופי (EEA) צריכות לכלול את הסמל של AdChoices וקישור לדף 'מידע על המודעה הזו' ב-Google. כשמטמיעים מודעות מותאמות אישית, אתם אחראים על היצירה של סמל AdChoices. חשוב לבצע פעולות כדי להציג ולקבוע את הקשבת הקליקים על סמל 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:
      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);
  ...
}

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

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

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

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

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

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

כדאי להוריד את הדוגמה לעיבוד מותאם אישית ב-Ad Manager כדי לראות דוגמה פעילה של וידאו מותאם.

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

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

הקלטת חשיפות

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

Swift

myCustomNativeAd.recordImpression()

Objective-C

[myCustomNativeAd recordImpression];

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

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

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

Swift

myCustomNativeAd.performClickOnAsset(withKey: "MainImage")

Objective-C

[myCustomNativeAd performClickOnAssetWithKey:@"MainImage"];

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

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

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

Swift

typealias GADNativeAdCustomClickHandler = (assetID: String) -> Void

Objective-C

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

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

כשמתבצע קליק על מודעה מותאמת אישית, יש שלוש תגובות אפשריות מ-SDK, והן מתבצעות בסדר הזה:

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

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

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

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 (תמונה)
  • Caption (טקסט)

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

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

/21775744923/example/native-backfill

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

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