Począwszy od systemu iOS 13 aplikacje na iPada mogą obsługiwać wiele okien, co oznacza, że użytkownicy mogą wchodzić w interakcje z wieloma równoczesnymi kopiami interfejsu aplikacji. Każde okno możesz tworzyć w różnych rozmiarach i w dowolnym momencie zmieniać jego rozmiar, co wpływa na sposób wczytywania i prezentowania reklam.
W tym przewodniku zamieściliśmy sprawdzone metody prawidłowego renderowania reklam w trybie wielu okien na iPadzie.
Wymagania wstępne
- Pakiet SDK do reklam mobilnych Google w wersji 7.53.0 lub nowszej
- Włącz obsługę scen w projekcie
- Zastosuj co najmniej 1 format reklamy.
Wybór scen w żądaniu reklamy
Aby otrzymać reklamę, która pasuje do określonego okna, musisz przekazać do żądania reklamy parametr windowScene
widoku danych. Pakiet SDK do reklam mobilnych Google zwraca reklamę o prawidłowym 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 będą kończyć się niepowodzeniem i pojawi się ten błąd, jeśli aplikacja wieloekranowa zażąda reklamy bez przekazywania 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 zostaje wypełnione, ale wyświetlenie reklamy kończy się niepowodzeniem, jeśli ma ona być widoczna w oknie niepełnoekranowym. Komunikat o błędzie w tym przypadku:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Utwórz żądanie reklamy w viewDoneSubmit:
W przypadku trybu wielu okien wymagamy utworzenia sceny okien do wysyłania żądań reklamy. Ponieważ widok nie został jeszcze dodany do okna w viewDidLoad:
, lepiej utworzyć żądania reklamy w viewDidAppear:
, gdzie scena okna jest ustawiona w tym punkcie.
Pamiętaj, że w cyklu życia aplikacji viewDidAppear:
może zostać wywołany więcej niż raz. Zalecamy umieszczenie kodu inicjowania żądania reklamy flagą, która informuje, czy zostało już to zrobione.
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; } }
Zmiana rozmiaru uchwytu
Użytkownicy mogą w każdej chwili przeciągać sceny i zmieniać rozmiar okna po wysłaniu żądania reklamy. Jeśli zmienisz rozmiar, to Ty musisz poprosić o nową reklamę.
W przykładowym kodzie poniżej użyto parametru viewWillTransitionToSize:withTransitionCoordinator:
, aby otrzymywać powiadomienia o obróceniu lub zmianie rozmiaru okna kontrolera widoku głównego. Możesz też nasłuchiwać zmian wprowadzonych w scenie okna z wykorzystaniem windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
.
Pełnoekranowe i reklamy z nagrodą
Pakiet SDK do reklam mobilnych Google udostępnia metodę canPresentFromViewController:error:
do określania, czy reklama pełnoekranowa lub z nagrodą jest prawidłowa. Umożliwia ona sprawdzenie, czy przy każdej zmianie rozmiaru okna trzeba odświeżyć którąś z reklam pełnoekranowych.
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]; } }]; }
Baner
Zmiana rozmiaru okna przebiega tak samo jak w przypadku jego obrotu. To Twoja aplikacja odpowiada za to, aby baner reklamowy pasował do nowego rozmiaru okna.
Poniższy przykład pokazuje tworzenie nowego banera adaptacyjnego 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
To Ty decydujesz o renderowaniu reklam natywnych i odpowiadasz za to, by reklama natywna była renderowana w widoku o zmienionym rozmiarze, podobnie jak reszta aplikacji.
Znane problemy
Obecnie reklamy w trybie wielu okien i na podzielonym ekranie są obsługiwane tylko w trybie pionowym. Gdy poprosisz o reklamę w trybie poziomym, wyświetli się poniższy komunikat logu.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.