Banery reklamowe

Banery reklamowe to prostokątne reklamy, które zajmują część układu aplikacji. Pozostają na ekranie, gdy użytkownicy wchodzą w interakcję z aplikacją – są zakotwiczone u góry lub u dołu ekranu albo pozostają w tekście podczas przewijania strony. Banery reklamowe mogą być automatycznie odświeżane po upływie określonego czasu. Więcej informacji znajdziesz w artykule Omówienie banerów reklamowych.

Z tego przewodnika dowiesz się, jak zacząć korzystać z zablokowanych banerów reklamowych, które maksymalizują skuteczność dzięki optymalizacji rozmiaru reklamy na każdym urządzeniu za pomocą określonej przez Ciebie szerokości.

Zakotwiczony baner adaptacyjny

Zakotwiczone banery adaptacyjne to reklamy o stałych proporcjach, a nie zwykłe reklamy o stałym rozmiarze. Format obrazu jest podobny do standardu branżowego 320 x 50. Po określeniu pełnej dostępnej szerokości zwraca reklamę o optymalnej wysokości dla tej szerokości. Optymalna wysokość nie zmienia się w przypadku żądań z tego samego urządzenia, a widoki otaczające reklamę nie muszą się przemieszczać podczas jej odświeżania.

Wymagania wstępne

Zawsze testuj reklamy za pomocą reklam testowych

Podczas tworzenia i testowania aplikacji używaj reklam testowych, a nie reklam produkcyjnych. Jeśli tego nie zrobisz, możemy zawiesić Twoje konto.

Najłatwiej wczytać reklamy testowe, używając dedykowanego identyfikatora testowej jednostki reklamowej na banery na iOS:

/21775744923/example/adaptive-banner

Został on specjalnie skonfigurowany tak, aby wyświetlać reklamy testowe w przypadku każdego żądania. Możesz go używać we własnych aplikacjach podczas kodowania, testowania i debugowania. Pamiętaj tylko, aby przed opublikowaniem aplikacji zastąpić go własnym identyfikatorem jednostki reklamowej.

Więcej informacji o działaniu testowych reklam w pakiecie SDK do reklam mobilnych znajdziesz w artykule Testowe reklamy.

Tworzenie widoku GAMBannerView

Banery reklamowe są wyświetlane w obiektach GAMBannerView, więc pierwszym krokiem do integracji banerów reklamowych jest umieszczenie elementu GAMBannerView w hierarchii widoków. Zwykle odbywa się to programowo lub za pomocą Interface Builder.

Automatycznie

Obiekt GAMBannerView można też utworzyć bezpośrednio. W tym przykładzie tworzymy GAMBannerView:

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  var bannerView: GAMBannerView!

  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 = GAMBannerView(adSize: adaptiveSize)

    addBannerViewToView(bannerView)
  }

  func addBannerViewToView(_ bannerView: GAMBannerView) {
    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

Aby użyć GAMBannerView, utwórz 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)
  }

Aby zarządzać inicjalizacją i zachowaniem GAMBannerView, utwórz obiekt 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
  }

Aby poznać szerokość widoku, użyj parametru GeometryReader. Ta klasa oblicza odpowiedni rozmiar reklamy dla bieżącej orientacji urządzenia. Wartość frame jest ustawiona na wysokość obliczoną na podstawie rozmiaru reklamy.

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

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

Objective-C

Pamiętaj, że w tym przypadku nie narzucamy ograniczeń dotyczących szerokości ani wysokości, ponieważ podany rozmiar reklamy zapewni banerowi rozmiar treści właściwy dla widoku.

@import GoogleMobileAds;

@interface ViewController ()

@property(nonatomic, strong) GAMBannerView *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 = [[GAMBannerView 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

Interface Builder

Do storyboardu lub pliku xib możesz dodać GAMBannerView. Jeśli korzystasz z tej metody, pamiętaj, aby ograniczenia pozycji dodawać tylko do banera. Jeśli na przykład wyświetlasz baner adaptacyjny u dołu ekranu, ustaw dolną część widoku banera tak, by znajdowała się w górnej części przewodnika po dolnym przewodniku po układzie, a ograniczenie centerX ustaw na centerX widoku superwidoku.

Rozmiar reklamy banerowej jest nadal ustawiany programowo:

Swift

bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth)

Objective-C

self.bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth);

Wczytywanie reklamy

Gdy GAMBannerView jest już gotowy i jego właściwości są skonfigurowane, możesz wczytać reklamy. Aby to zrobić, wywołaj funkcję loadRequest: w obiekcie GAMRequest:

Swift

override func viewDidLoad() {
  super.viewDidLoad()
  // Set the ad unit ID and view controller that contains the GAMBannerView.
  bannerView.adUnitID = "/21775744923/example/adaptive-banner"
  bannerView.rootViewController = self

  bannerView.load(GAMRequest())
}

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 GAMBannerView.
  self.bannerView.adUnitID = @"/21775744923/example/adaptive-banner";
  self.bannerView.rootViewController = self;

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

Obiekty GAMRequest reprezentują pojedyncze żądanie reklamy i zawierają właściwości takie jak informacje o kierowaniu.

Jeśli reklama nie załaduje się, nie musisz bezpośrednio żądać nowej, o ile tylko masz skonfigurowane odświeżanie jednostki reklamowej. Pakiet SDK do reklam mobilnych Google respektuje każdą częstotliwość odświeżania określoną w interfejsie Ad Managera. Jeśli nie masz włączonego odświeżania, musisz przesłać nowe żądanie.

Zdarzenia reklamowe

Dzięki funkcji GADBannerViewDelegate możesz nasłuchiwać zdarzeń cyklu życia, takich jak zamknięcie reklamy lub opuszczenie aplikacji przez użytkownika.

Rejestrowanie zdarzeń związanych z banerami

Aby rejestrować zdarzenia reklamy w banerze, ustaw w obiekcie GAMBannerView właściwość delegate na obiekt, który implementuje protokół GADBannerViewDelegate. Zazwyczaj klasa, która implementuje reklamy typu banner, działa też jako klasa zastępcza. W takim przypadku właściwość delegate może mieć wartość self.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController, GADBannerViewDelegate {

  var bannerView: GAMBannerView!

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

SwiftUI

banner.delegate = self

Objective-C

@import GoogleMobileAds;

@interface ViewController () <GADBannerViewDelegate>

@property(nonatomic, strong) GAMBannerView *bannerView;

@end

@implementation ViewController

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

Implementowanie zdarzeń banera

Wszystkie metody w GADBannerViewDelegate są oznaczone jako opcjonalne, więc wystarczy zaimplementować tylko te, których potrzebujesz. Ten przykład implementuje każdą metodę i zapisują wiadomość do konsoli:

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

W przykładzie usługi Ad Delegate znajdziesz metodę delegowania banerów w aplikacji demonstracyjnej na iOS API.

Swift Objective-C

Przypadki użycia

Oto kilka przykładowych zastosowań tych metod zdarzeń reklamy.

Dodawanie banera do hierarchii widoku po otrzymaniu reklamy

Możesz odłożyć dodanie elementu GAMBannerView do hierarchii widoku do czasu otrzymania reklamy. Aby to zrobić, nasłuchuj zdarzenie bannerViewDidReceiveAd::

Swift

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

Objective-C

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

Animowanie banera reklamowego

Możesz też użyć zdarzenia bannerViewDidReceiveAd:, aby animować baner reklamowy po jego zwróceniu, jak w tym przykładzie:

Swift

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

Objective-C

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

Wstrzymywanie i wznawianie aplikacji

Protokół GADBannerViewDelegate zawiera metody, które powiadamią o wystąpieniu zdarzeń, np. gdy kliknięcie powoduje wyświetlenie lub ukrycie nakładki. Jeśli chcesz dowiedzieć się, czy te zdarzenia były spowodowane reklamami, zarejestruj się w tych metodach GADBannerViewDelegate.

Aby wychwytywać wszystkie typy prezentacji w formie nakładki lub wywołania zewnętrznych przeglądarek, a nie tylko te pochodzące z kliknięć reklam, lepiej korzystać z aplikacji nasłuchującej równoważnych metod w UIViewController lub UIApplication. Oto tabela pokazująca równoważne metody iOS wywoływane w tym samym czasie co metody GADBannerViewDelegate:

Metoda GADBannerViewDelegate Metoda iOS
bannerViewWillPresentScreen: viewWillDisappear: w UIViewController
bannerViewWillDismissScreen: viewWillAppear: w UIViewController
bannerViewDidDismissScreen: viewDidAppear: w UIViewController

Ręczne zliczanie wyświetleń

Jeśli masz szczególne warunki określające, kiedy wyświetlenia powinny być rejestrowane, możesz ręcznie wysyłać do Ad Managera pingi wyświetleń. Aby to zrobić, przed załadowaniem reklamy włącz GAMBannerView dla ręcznych wyświetleń:

Swift

bannerView.enableManualImpressions = true

Objective-C

self.bannerView.enableManualImpressions = YES;

Gdy stwierdzisz, że reklama została zwrócona i jest widoczna na ekranie, możesz ręcznie wywołać wyświetlenie:

Swift

bannerView.recordImpression()

Objective-C

[self.bannerView recordImpression];

Zdarzenia w aplikacjach

Zdarzenia w aplikacjach umożliwiają tworzenie reklam, które mogą wysyłać komunikaty do kodu aplikacji. Aplikacja może następnie podejmować działania na podstawie tych wiadomości.

Zdarzenia aplikacji związane z Ad Managerem możesz nasłuchiwać za pomocą funkcji GADAppEventDelegate. Zdarzenia te mogą wystąpić w dowolnym momencie cyklu życia reklamy, nawet przed wywołaniem metody bannerViewDidReceiveAd: obiektu GADBannerViewDelegate.

Swift

// Implement your app event within this method. The delegate will be
// notified when the SDK receives an app event message from the ad.

// Called when the banner receives an app event.
optional public func bannerView(_ banner: GAMBannerView,
    didReceiveAppEvent name: String, withInfo info: String?)

Objective-C

// Implement your app event within this method. The delegate will be
// notified when the SDK receives an app event message from the ad.

@optional
// Called when the banner receives an app event.
-   (void)bannerView:(GAMBannerView *)banner
    didReceiveAppEvent:(NSString *)name
              withInfo:(NSString *)info;

Metody zdarzeń w aplikacji można wdrożyć w kontrolerze widoku:

Swift

import GoogleMobileAds

class ViewController: UIViewController, GADAppEventDelegate {}

Objective-C

@import GoogleMobileAds;

@interface ViewController : UIViewController <GADAppEventDelegate> {}

@end

Pamiętaj, aby przed wysłaniem żądania reklamy ustawić obiekt delegowany za pomocą właściwości appEventDelegate.

Swift

bannerView.appEventDelegate = self

Objective-C

self.bannerView.appEventDelegate = self;

Oto przykład, który pokazuje, jak zmienić kolor tła aplikacji przez określenie koloru za pomocą zdarzenia w aplikacji:

Swift

func bannerView(_ banner: GAMBannerView, didReceiveAppEvent name: String,
    withInfo info: String?) {
  if name == "color" {
    guard let info = info else { return }
    switch info {
    case "green":
      // Set background color to green.
      view.backgroundColor = UIColor.green
    case "blue":
      // Set background color to blue.
      view.backgroundColor = UIColor.blue
    default:
      // Set background color to black.
      view.backgroundColor = UIColor.black
    }
  }
}

Objective-C

- (void)bannerView:(GAMBannerView *)banner
    didReceiveAppEvent:(NSString *)name
              withInfo:(NSString *)info {
  if ([name isEqual:@"color"]) {
    if ([info isEqual:@"green"]) {
      // Set background color to green.
      self.view.backgroundColor = [UIColor greenColor];
    } else if ([info isEqual:@"blue"]) {
      // Set background color to blue.
      self.view.backgroundColor = [UIColor blueColor];
    } else {
      // Set background color to black.
      self.view.backgroundColor = [UIColor blackColor];
    }
  }
}

A tutaj jest odpowiednia kreacja, która wysyła do appEventDelegate wiadomości o zdarzeniach aplikacji z kolorami:

<html>
<head>
  <script src="//www.gstatic.com/afma/api/v1/google_mobile_app_ads.js"></script>
  <script>
    document.addEventListener("DOMContentLoaded", function() {
      // Send a color=green event when ad loads.
      admob.events.dispatchAppEvent("color", "green");

      document.getElementById("ad").addEventListener("click", function() {
        // Send a color=blue event when ad is clicked.
        admob.events.dispatchAppEvent("color", "blue");
      });
    });
  </script>
  <style>
    #ad {
      width: 320px;
      height: 50px;
      top: 0px;
      left: 0px;
      font-size: 24pt;
      font-weight: bold;
      position: absolute;
      background: black;
      color: white;
      text-align: center;
    }
  </style>
</head>
<body>
  <div id="ad">Carpe diem!</div>
</body>
</html>

Przykład implementacji zdarzeń aplikacji w aplikacji demonstracyjnej iOS API znajdziesz w artykule Zdarzenia aplikacji w Ad Managerze – przykład.

Swift Objective-C

Dodatkowe materiały

Przykłady w GitHub

Dalsze kroki

Banery zwijane

Banery zwijane to banery reklamowe, które początkowo wyświetlają się jako większe nakładki z przyciskiem umożliwiającym zwijanie reklamy do mniejszego rozmiaru. Możesz go użyć, aby jeszcze bardziej zoptymalizować skuteczność. Więcej informacji znajdziesz w artykule Zwijane banery reklamowe.

Wbudowane banery adaptacyjne

Banery adaptacyjne śródtekstowe są większe i wyższe niż zakotwiczone banery adaptacyjne. Mają zmienną wysokość i mogą zajmować całą wysokość ekranu. W przypadku aplikacji, które umieszczają banery reklamowe w treściach, które można przewijać, zalecamy stosowanie banerów śródtekstowych zamiast zakotwiczonych banerów adaptacyjnych. Więcej informacji znajdziesz w sekcji inline adaptive banner.

Zapoznaj się z innymi tematami