Od iOS 13 aplikacje mogą obsługiwać wiele okien na iPadzie, co oznacza, że użytkownicy mogą korzystać z kilku kopii interfejsu aplikacji jednocześnie. Każde okno można utworzyć w różnych rozmiarach i w dowolnym momencie zmienić jego rozmiar, co ma wpływ na sposób wczytywania i wyświetlania reklam.
Z tego przewodnika dowiesz się, jak prawidłowo renderować reklamy w przypadku korzystania z wielu okien na iPadzie.
Wymagania wstępne
- Google Mobile Ads SDK 7.53.0 lub nowszej
- Włączenie obsługi scen w projekcie
- Wdrożenie co najmniej 1 formatu reklamy
Ustawianie sceny w żądaniu reklamy
Aby otrzymywać reklamy pasujące do określonego okna, przekaż windowScene widoku do żądania reklamy. Google Mobile Ads SDK zwraca reklamę o
prawidłowym rozmiarze dla danej sceny.
Swift
func loadInterstitial() { let request = Request() request.scene = view.window?.windowScene InterstitialAd.load(with: "[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 będą kończyć się niepowodzeniem i wyświetlać ten błąd, jeśli aplikacja z obsługą wielu scen zażąda reklamy 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 zostanie wypełnione, ale wyświetlenie reklamy nie powiedzie się, jeśli reklama ma być wyświetlana w oknie innym niż pełnoekranowe. W takim przypadku pojawi się ten komunikat o błędzie:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Tworzenie żądania reklamy w viewDidAppear:
W przypadku obsługi wielu okien wymagane jest, aby żądania reklam zawierały scenę okna. Ponieważ w viewDidLoad: widok nie został jeszcze dodany do okna, żądania reklam należy tworzyć w viewDidAppear:, gdzie scena okna jest już ustawiona.
Pamiętaj, że viewDidAppear: może być wywoływane więcej niż raz w trakcie cyklu życia aplikacji. Zalecamy umieszczenie kodu inicjującego żądanie reklamy wewnątrz flagi, która wskazuje, czy zostało ono 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; } }
Obsługa zmiany rozmiaru
Użytkownicy mogą w dowolnym momencie przeciągać sceny, zmieniając rozmiary okien po wysłaniu żądania reklamy. Gdy nastąpi zmiana rozmiaru, musisz poprosić o nową reklamę.
Poniższy przykładowy kod używa
viewWillTransitionToSize:withTransitionCoordinator:
aby otrzymywać powiadomienia o obróceniu lub zmianie rozmiaru okna głównego kontrolera widoku, ale
możesz też nasłuchiwać
windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
w przypadku zmian dotyczących sceny okna.
Reklama pełnoekranowa i reklama z nagrodą
Google Mobile Ads SDK udostępnia metodę
canPresentFromViewController:error:, która pozwala określić, czy reklama pełnoekranowa lub reklama z nagrodą jest prawidłowa. Dzięki temu możesz sprawdzić, czy należy odświeżyć reklamę pełnoekranową, gdy zmieni 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(from: 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]; } }]; }
Baner
Zmianę rozmiaru okna możesz obsługiwać w taki sam sposób jak obracanie okna. Twoja aplikacja musi zadbać o to, aby baner reklamowy pasował do nowego rozmiaru okna.
Poniższy przykład tworzy 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 = currentOrientationAnchoredAdaptiveBanner(width: bannerWidth) let request = Request() 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
Masz kontrolę nad renderowaniem reklam natywnych i ponosisz odpowiedzialność za to, aby reklama natywna była renderowana w widoku o zmienionym rozmiarze, podobnie jak reszta treści aplikacji.
Znane problemy
Obecnie reklamy w trybie wielu okien i na podzielonym ekranie są obsługiwane tylko w orientacji pionowej. Gdy poprosisz o reklamę w trybie poziomym, zobaczysz ten komunikat logu.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.