Obsługa wielu systemów Windows na iPadzie

Od iOS 13 aplikacje mogą obsługiwać wiele okien na iPadzie, co oznacza, że użytkownicy mogą korzystać z wielu kopii interfejsu aplikacji jednocześnie. Każde okno może być tworzone w różnych rozmiarach i możesz w dowolnym momencie zmienić jego rozmiar, co ma wpływ na sposób wczytywania i prezentowania reklam.

Ten przewodnik ma na celu zaprezentowanie sprawdzonych metod dotyczących prawidłowego renderowania reklam w sytuacji wielu okien na iPadzie.

Wymagania wstępne

Ustawianie sceny w żądaniu reklamy

Aby otrzymać reklamę, która pasuje do określonego okna, przekazujesz widok windowScene do żądania reklamy. Pakiet SDK do reklam mobilnych Google zwraca reklamę o odpowiednim rozmiarze do danej sceny.

Swift

func loadInterstitial() {
  let request = GADRequest()
  request.scene = view.window?.windowScene

  GADInterstitialAd.load(withAdUnitID: "[AD_UNIT_ID]",
      request: request) { ad, error in }
}

Objective-C

- (void)loadInterstitial {
  GADRequest *request = [GADRequest request];
  request.scene = self.view.window.windowScene;

  [GADInterstitialAd loadWithAdUnitID:@"[AD_UNIT_ID]"
      request:request
      completionHandler:^(GADInterstitialAd *ad, NSError *error) {}];
}

W trybie testowym żądania reklamy nie będą się udawać, jeśli aplikacja wieloscenowa poprosi o reklamę bez przekazania sceny:

<Google> Invalid Request. The GADRequest scene property should be set for
applications that support multi-scene. Treating the unset property as an error
while in test mode.

W trybie produkcyjnym żądanie reklamy jest wypełniane, ale wyświetlenie reklamy się nie uda, jeśli reklama ma być wyświetlana w oknie niepełnoekranowym. W tym przypadku komunikat o błędzie brzmi:

<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.

Utwórz żądanie reklamy w metodzie viewDidAppear:

W przypadku wielu okien wymagane jest tworzenie okna sceny do wysyłania żądań reklamy. Ponieważ widok nie został jeszcze dodany do okna w viewDidLoad:, żądania reklamy należy tworzyć w viewDidAppear:, gdzie w tym momencie jest ustawiona scena okna.

Pamiętaj, że metoda viewDidAppear: może być wywoływana wielokrotnie w trakcie cyklu życia aplikacji. Zalecamy owinięcie kodu inicjowania żądania reklamy w flagę, która wskazuje, czy inicjowanie zostało już wykonane.

Swift

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  if !requestInitialized {
    loadInterstitial()
    requestInitialized = true
  }
}

Objective-C

- (void)viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  if (!_requestInitialized) {
    [self loadInterstitial];
    _requestInitialized = YES;
  }
}

Uchwyt zmiany rozmiaru

Użytkownicy mogą w dowolnym momencie przeciągać sceny, zmieniając rozmiary okna po wysłaniu prośby o reklamę. To Ty decydujesz, czy chcesz poprosić o utworzenie nowej reklamy, gdy zmieni się jej rozmiar. Przykładowy kod poniżej używa funkcji viewWillTransitionToSize:withTransitionCoordinator:, aby otrzymywać powiadomienia, gdy okno kontrolera widoku głównego zostanie obrócone lub zmieniony zostanie jego rozmiar. Możesz też nasłuchiwać zdarzeń windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:, aby otrzymywać powiadomienia o zmianach w określonej scenie.

Reklama pełnoekranowa i reklama z nagrodą

Pakiet SDK do reklam mobilnych Google udostępnia metodęcanPresentFromViewController:error:, która pozwala określić, czy reklama przejściowa lub reklama z nagrodą jest prawidłowa. Dzięki temu możesz sprawdzić, czy reklama pełnoekranowa wymaga odświeżenia, gdy zmienia się rozmiar okna.

Swift

override func viewWillTransition(to size: CGSize,
    with coordinator: UIViewControllerTransitionCoordinator) {
  super.viewWillTransition(to: size, with: coordinator)

  coordinator.animate(alongsideTransition: nil) { [self] context in
    do {
      try interstitial?.canPresent(fromRootViewController: self)
    } catch {
      loadInterstitial()
    }
  }
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size
    withTransitionCoordinator:(id)coordinator {
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

  [coordinator animateAlongsideTransition:nil
      completion:^(id _Nonnull context) {
    if (![self.interstitial canPresentFromRootViewController:self error:nil]) {
      [self loadInterstitial];
    }
  }];
}

Zmiana rozmiaru okna działa tak samo jak rotacja okna. Twoja aplikacja musi zadbać o to, aby baner reklamowy pasował do nowego rozmiaru okna.

W przykładzie poniżej tworzony jest nowy baner adaptacyjny o nowej szerokości okna:

Swift

override func viewWillTransition(to size: CGSize,
    with coordinator: UIViewControllerTransitionCoordinator) {
  super.viewWillTransition(to: size, with: coordinator)

  coordinator.animate(alongsideTransition: nil) { [self] context in
    loadBanner()
  }
}

func loadBanner() {
  let bannerWidth = view.frame.size.width

  bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(bannerWidth)

  let request = GADRequest()
  request.scene = view.window?.windowScene
  bannerView.load(request)
}

Objective-C

- (void)viewWillTransitionToSize:(CGSize)size
    withTransitionCoordinator:(id)coordinator {
  [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

  [coordinator animateAlongsideTransition:nil
      completion:^(id _Nonnull context) {
    [self loadBannerAd];
  }];
}

- (void)loadBannerAd {
  CGFloat bannerWidth = self.view.frame.size.width;

  self.bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(bannerWidth);

  GADRequest *request = [GADRequest request];
  request.scene = self.view.window.windowScene;
  [self.bannerView loadRequest:request];
}

Reklama natywna

Ty kontrolujesz renderowanie reklam natywnych i odpowiadasz za to, aby reklama natywną renderowano w obszarze o zmienionym rozmiarze, który jest podobny do reszty treści aplikacji.

Znane problemy

Obecnie reklamy w wielu oknach i na podzielonym ekranie są obsługiwane tylko w orientacji pionowej. Gdy żądasz reklamy w układzie poziomym, otrzymasz ten komunikat dziennika.

<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.