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
- Pakiet SDK do reklam mobilnych Google w wersji 7.53.0 lub nowszej
- Włączanie obsługi scen w projekcie
- Wdróż co najmniej 1 format reklamy.
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]; } }]; }
Baner
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.