מודעות באנר

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

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

מודעת באנר מותאמת ומעוגנת

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

דרישות מוקדמות

ביצוע בדיקות באמצעות מודעות בדיקה תמיד

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

הדרך הקלה ביותר לטעון מודעות בדיקה היא להשתמש במזהה הייעודי של יחידת מודעות לבדיקה ל-iOS באנרים:

ca-app-pub-3940256099942544/2435281174

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

מידע נוסף על אופן הפעולה של מודעות הבדיקה של Mobile Ads SDK זמין במאמר מודעות בדיקה.

יצירת GADBannerView

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

באופן פרוגרמטי

אפשר גם ליצור מופע ישיר של GADBannerView. הדוגמה הבאה יוצרת GADBannerView:

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  var bannerView: GADBannerView!

  override func viewDidLoad() {
    super.viewDidLoad()

    let viewWidth = view.frame.inset(by: view.safeAreaInsets).width

    // Here the current interface orientation is used. Use
    // GADLandscapeAnchoredAdaptiveBannerAdSizeWithWidth or
    // GADPortraitAnchoredAdaptiveBannerAdSizeWithWidth if you prefer to load an ad of a
    // particular orientation,
    let adaptiveSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)
    bannerView = GADBannerView(adSize: adaptiveSize)

    addBannerViewToView(bannerView)
  }

  func addBannerViewToView(_ bannerView: GADBannerView) {
    bannerView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(bannerView)
    // This example doesn't give width or height constraints, as the provided
    // ad size gives the banner an intrinsic content size to size the view.
    view.addConstraints(
      [NSLayoutConstraint(item: bannerView,
                          attribute: .bottom,
                          relatedBy: .equal,
                          toItem: view.safeAreaLayoutGuide,
                          attribute: .bottom,
                          multiplier: 1,
                          constant: 0),
      NSLayoutConstraint(item: bannerView,
                          attribute: .centerX,
                          relatedBy: .equal,
                          toItem: view,
                          attribute: .centerX,
                          multiplier: 1,
                          constant: 0)
      ])
  }
}

SwiftUI

כדי להשתמש ב-GADBannerView, צריך ליצור UIViewRepresentable:

private struct BannerView: UIViewRepresentable {
  let adSize: GADAdSize

  init(_ adSize: GADAdSize) {
    self.adSize = adSize
  }

  func makeUIView(context: Context) -> UIView {
    // Wrap the GADBannerView in a UIView. GADBannerView automatically reloads a new ad when its
    // frame size changes; wrapping in a UIView container insulates the GADBannerView from size
    // changes that impact the view returned from makeUIView.
    let view = UIView()
    view.addSubview(context.coordinator.bannerView)
    return view
  }

  func updateUIView(_ uiView: UIView, context: Context) {
    context.coordinator.bannerView.adSize = adSize
  }

  func makeCoordinator() -> BannerCoordinator {
    return BannerCoordinator(self)
  }

כדי לנהל את האתחול וההתנהגות של GADBannerView, צריך ליצור Coordinator:

class BannerCoordinator: NSObject, GADBannerViewDelegate {

  private(set) lazy var bannerView: GADBannerView = {
    let banner = GADBannerView(adSize: parent.adSize)
    banner.adUnitID = "ca-app-pub-3940256099942544/2435281174"
    banner.load(GADRequest())
    banner.delegate = self
    return banner
  }()

  let parent: BannerView

  init(_ parent: BannerView) {
    self.parent = parent
  }

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

var body: some View {
  GeometryReader { geometry in
    let adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(geometry.size.width)

    VStack {
      Spacer()
      BannerView(adSize)
        .frame(height: adSize.size.height)
    }
  }

Objective-C

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

@import GoogleMobileAds;

@interface ViewController ()

@property(nonatomic, strong) GADBannerView *bannerView;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];

  // Here safe area is taken into account, hence the view frame is used after the
  // view has been laid out.
  CGRect frame = UIEdgeInsetsInsetRect(self.view.frame, self.view.safeAreaInsets);
  CGFloat viewWidth = frame.size.width;

  // Here the current interface orientation is used. If the ad is being preloaded
  // for a future orientation change or different orientation, the function for the
  // relevant orientation should be used.
  GADAdSize adaptiveSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth);
  // In this case, we instantiate the banner with desired ad size.
  self.bannerView = [[GADBannerView alloc] initWithAdSize:adaptiveSize];

  [self addBannerViewToView:self.bannerView];
}

- (void)addBannerViewToView:(UIView *)bannerView {
  bannerView.translatesAutoresizingMaskIntoConstraints = NO;
  [self.view addSubview:bannerView];
  // This example doesn't give width or height constraints, as the provided
  // ad size gives the banner an intrinsic content size to size the view.
  [self.view addConstraints:@[
    [NSLayoutConstraint constraintWithItem:bannerView
                              attribute:NSLayoutAttributeBottom
                              relatedBy:NSLayoutRelationEqual
                                  toItem:self.view.safeAreaLayoutGuide
                              attribute:NSLayoutAttributeBottom
                              multiplier:1
                                constant:0],
    [NSLayoutConstraint constraintWithItem:bannerView
                              attribute:NSLayoutAttributeCenterX
                              relatedBy:NSLayoutRelationEqual
                                  toItem:self.view
                              attribute:NSLayoutAttributeCenterX
                              multiplier:1
                                constant:0]
                                ]];
}
@end

הכלי לבניית ממשקים

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

גודל המודעה בבאנר עדיין מוגדר באופן פרוגרמטי:

Swift

bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)

Objective-C

self.bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth);

טעינת מודעה

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

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  // Set the ad unit ID and view controller that contains the GADBannerView.
  bannerView.adUnitID = "ca-app-pub-3940256099942544/2435281174"
  bannerView.rootViewController = self

  bannerView.load(GADRequest())
}

SwiftUI

banner.adUnitID = "ca-app-pub-3940256099942544/2435281174"
banner.load(GADRequest())

Objective-C

- (void)viewDidLoad {
  [super viewDidLoad];
  // Set the ad unit ID and view controller that contains the GADBannerView.
  self.bannerView.adUnitID = @"ca-app-pub-3940256099942544/2435281174";
  self.bannerView.rootViewController = self;

  [self.bannerView loadRequest:[GADRequest request]];
}

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

אם הטעינה של המודעה נכשלת, אין צורך לבקש מודעה נוספת באופן מפורש, למשל כל עוד הגדרתם את יחידת המודעות לרענון, Google Mobile Ads SDK מתייחס לכל קצב רענון שציינתם ב-AdMob ממשק משתמש. אם לא הפעלתם את הרענון, תצטרכו לשלוח בקשה חדשה.

אירועי מודעות

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

הרשמה לאירועי באנר

כדי להירשם לאירועים של מודעות באנר, מגדירים את המאפיין delegate ב-GADBannerView לאובייקט שמטמיע את הפרוטוקול GADBannerViewDelegate. באופן כללי, המחלקה שמטמיעה באנר המודעות ישמשו גם בתור המחלקה עם הרשאות הגישה. במקרה כזה, הנכס delegate יכול צריך להיות self.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADBannerViewDelegate {

  var bannerView: GADBannerView!

  override func viewDidLoad() {
    super.viewDidLoad()
    // ...
    bannerView.delegate = self
  }
}

SwiftUI

banner.delegate = self

Objective-C

@import GoogleMobileAds;

@interface ViewController () <GADBannerViewDelegate>

@property(nonatomic, strong) GADBannerView *bannerView;

@end

@implementation ViewController

-   (void)viewDidLoad {
  [super viewDidLoad];
  // ...
  self.bannerView.delegate = self;
}

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

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

Swift

func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
  print("bannerViewDidReceiveAd")
}

func bannerView(_ bannerView: GADBannerView, didFailToReceiveAdWithError error: Error) {
  print("bannerView:didFailToReceiveAdWithError: \(error.localizedDescription)")
}

func bannerViewDidRecordImpression(_ bannerView: GADBannerView) {
  print("bannerViewDidRecordImpression")
}

func bannerViewWillPresentScreen(_ bannerView: GADBannerView) {
  print("bannerViewWillPresentScreen")
}

func bannerViewWillDismissScreen(_ bannerView: GADBannerView) {
  print("bannerViewWillDIsmissScreen")
}

func bannerViewDidDismissScreen(_ bannerView: GADBannerView) {
  print("bannerViewDidDismissScreen")
}

Objective-C

- (void)bannerViewDidReceiveAd:(GADBannerView *)bannerView {
  NSLog(@"bannerViewDidReceiveAd");
}

- (void)bannerView:(GADBannerView *)bannerView didFailToReceiveAdWithError:(NSError *)error {
  NSLog(@"bannerView:didFailToReceiveAdWithError: %@", [error localizedDescription]);
}

- (void)bannerViewDidRecordImpression:(GADBannerView *)bannerView {
  NSLog(@"bannerViewDidRecordImpression");
}

- (void)bannerViewWillPresentScreen:(GADBannerView *)bannerView {
  NSLog(@"bannerViewWillPresentScreen");
}

- (void)bannerViewWillDismissScreen:(GADBannerView *)bannerView {
  NSLog(@"bannerViewWillDismissScreen");
}

- (void)bannerViewDidDismissScreen:(GADBannerView *)bannerView {
  NSLog(@"bannerViewDidDismissScreen");
}

בדוגמה של Ad Delegate מוסבר איך מטמיעים שיטות של נציגים של מודעות באנר באפליקציית הדגמה של iOS API.

Swift Objective-C

תרחישים לדוגמה

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

הוספת באנר להיררכיית התצוגות אחרי שהמודעה מתקבלת

מומלץ להשהות את ההוספה של GADBannerView להיררכיית התצוגה עד לאחר קבלת מודעה. אפשר לעשות זאת על ידי האזנה עבור האירוע bannerViewDidReceiveAd::

Swift

func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
  // Add banner to view and add constraints.
  addBannerViewToView(bannerView)
}

Objective-C

- (void)bannerViewDidReceiveAd:(GADBannerView *)bannerView {
  // Add bannerView to view and add constraints as above.
  [self addBannerViewToView:self.bannerView];
}

אנימציה של מודעת באנר

אפשר גם להשתמש באירוע bannerViewDidReceiveAd: כדי להוסיף אנימציה למודעת באנר פעם אחת הוא מוחזר, כמו בדוגמה הבאה:

Swift

func bannerViewDidReceiveAd(_ bannerView: GADBannerView) {
  bannerView.alpha = 0
  UIView.animate(withDuration: 1, animations: {
    bannerView.alpha = 1
  })
}

Objective-C

- (void)bannerViewDidReceiveAd:(GADBannerView *)bannerView {
  bannerView.alpha = 0;
  [UIView animateWithDuration:1.0 animations:^{
    bannerView.alpha = 1;
  }];
}

השהיה והמשך של האפליקציה

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

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

שיטת GADBannerViewDelegate שיטת iOS
bannerViewWillPresentScreen: viewWillDisappear: של UIViewController
bannerViewWillDismissScreen: viewWillAppear: של UIViewController
bannerViewDidDismissScreen: viewDidAppear: של UIViewController

מקורות מידע נוספים

דוגמאות ב-GitHub

השלבים הבאים

מודעות באנר שאפשר לכווץ

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

מודעות באנר מותאמות שמוצגות בתוך הטקסט

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

נושאים נוספים