Aplikacje, które obsługują wiele okien na iPadzie lub działają na urządzeniach składanych, takich jak iPhone Duo, mogą wyświetlać interfejs w dynamicznych rozmiarach okien i konfiguracjach ekranu. Na iPadzie użytkownicy mogą korzystać z kilku kopii interfejsu aplikacji jednocześnie i zmieniać rozmiar okien. Na urządzeniach składanych stan złożenia urządzenia określa aktywny ekran. Po rozłożeniu urządzenie korzysta z większego wyświetlacza wewnętrznego. Po złożeniu urządzenie korzysta z mniejszego wyświetlacza zewnętrznego.
Ten przewodnik zawiera informacje o wczytywaniu i renderowaniu reklam w środowiskach z wieloma oknami i na składanych wyświetlaczach.
Wymagania wstępne
Zanim zaczniesz, wykonaj te czynności:
- Włącz obsługę scen w projekcie. Szczegółowe informacje znajdziesz w artykule Specifying the scenes your app supports (Określanie scen obsługiwanych przez aplikację).
- Wdróż co najmniej 1 format reklamy:
- Reklama wyświetlana przy otwarciu aplikacji
Ustawianie sceny okna w żądaniu reklamy
Aby otrzymać reklamę, która pasuje do konkretnego okna lub aktywnego wyświetlania, przypisz aktywny obiekt UIWindowScene do właściwości scene obiektu GADRequest. Google Mobile Ads SDK zwraca reklamę o rozmiarze odpowiednim dla tej sceny. W SwiftUI wyślij zapytanie do połączonych scen, aby uzyskać aktywną scenę okna na pierwszym planie.
Poniższy przykład konfiguruje scenę okna, wczytuje reklamę pełnoekranową w przypadku powodzenia i rejestruje komunikat o błędzie w przypadku niepowodzenia:
Swift
func loadInterstitial() async {
let request = Request()
request.scene = view.window?.windowScene
do {
interstitial = try await InterstitialAd.load(
with: "ca-app-pub-3940256099942544/4411468910", request: request)
} catch {
print("Failed to load interstitial ad with error: \(error.localizedDescription)")
}
}
SwiftUI
func loadInterstitial() async {
let request = Request()
request.scene =
UIApplication.shared.connectedScenes
.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
do {
let _ = try await InterstitialAd.load(
with: "ca-app-pub-3940256099942544/4411468910", request: request)
} catch {
print("Failed to load interstitial ad with error: \(error.localizedDescription)")
}
}
Objective-C
- (void)loadInterstitial {
GADRequest *request = [GADRequest request];
request.scene = self.view.window.windowScene;
[GADInterstitialAd
loadWithAdUnitID:@"ca-app-pub-3940256099942544/4411468910"
request:request
completionHandler:^(GADInterstitialAd *ad, NSError *error) {
if (error) {
NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
return;
}
self.interstitial = ad;
}];
}
Jeśli aplikacja z wieloma scenami żąda reklamy bez przekazywania sceny, w trybie testowym żądania reklam nie powiodą się i wyświetli się ten błąd:
<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świetlanie reklamy nie powiedzie się, jeśli reklama jest wyświetlana w oknie mniejszym niż rozmiar treści reklamy:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Tworzenie żądania reklamy
Podczas wysyłania żądań reklamy aplikacje z wieloma scenami wymagają prawidłowej sceny okna.
W miejscu, w którym jest wypełniana scena okna, utwórz żądania reklamy za pomocą metody viewDidAppear. Zalecamy ten proces, ponieważ widok nie został jeszcze dodany do okna w metodzie viewDidLoad.
Chociaż metodę viewDidAppear możesz wywołać więcej niż raz w cyklu życia aplikacji, musisz opakować żądanie reklamy w flagę logiczną, aby uruchomić je tylko raz.
W tym przykładzie żądanie reklamy jest inicjowane w metodzie viewDidAppear:
Swift
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if !requestInitialized {
Task {
await loadInterstitial()
}
requestInitialized = true
}
}
Objective-C
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
if (!_requestInitialized) {
[self loadInterstitial];
_requestInitialized = YES;
}
}
Obsługa zmiany rozmiaru okna
Wymiary okna zmieniają się, gdy użytkownicy zmieniają rozmiar scen na iPadzie lub składają i rozkładają urządzenie składane, takie jak iPhone Duo. Gdy rozmiar okna się zmieni, sprawdź, czy wczytane reklamy pasują do zaktualizowanych wymiarów, i w razie potrzeby wczytaj je ponownie.
Aby sprawdzić, czy wczytane reklamy pasują do zaktualizowanych wymiarów, użyj jednej z tych metod:
viewWillTransitionToSize:withTransitionCoordinator:: wykrywa, kiedy okno kontrolera widoku jest obracane, zmienia rozmiar lub przechodzi między stanami złożenia.windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:: w przypadku zmian sceny w oknie.
Reklamy pełnoekranowe
Aby sprawdzić, czy wczytana reklama pełnoekranowa jest nadal odpowiednia dla zaktualizowanego rozmiaru okna lub stanu złożenia, użyj metody canPresentFromRootViewController:error:. Jeśli nie, wczytaj reklamę o rozmiarze odpowiednim dla zaktualizowanej sceny.
W tym przykładzie sprawdzamy, czy reklama pełnoekranowa może się wyświetlić po zmianie rozmiaru, i w razie potrzeby ponownie ją wczytujemy:
Swift
override func viewWillTransition(
to size: CGSize,
with coordinator: UIViewControllerTransitionCoordinator
) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil) { [weak self] _ in
guard let self else { return }
do {
try self.interstitial?.canPresent(from: self)
} catch {
Task {
await self.loadInterstitial()
}
}
}
}
Objective-C
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator
animateAlongsideTransition:nil
completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
if (![self.interstitial canPresentFromRootViewController:self error:nil]) {
[self loadInterstitial];
}
}];
}
Banery reklamowe
Obsługuj zmiany rozmiaru okna i składanie podobnie jak obracanie urządzenia. Ogranicz wyświetlanie banerów do usługi safeAreaLayoutGuide. Dzięki temu reklamy nie będą zasłaniać zawiasów urządzenia, wycięć ani pasków systemowych. W ramach tego procesu ponownie obliczany jest też rozmiar zakotwiczonego banera adaptacyjnego z uwzględnieniem zaktualizowanej szerokości bezpiecznego obszaru.
Poniższy przykład wczytuje zakotwiczony baner adaptacyjny ze zaktualizowaną szerokością okna podczas zmiany rozmiaru:
Swift
override func viewWillTransition(
to size: CGSize,
with coordinator: UIViewControllerTransitionCoordinator
) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: nil) { [weak self] _ in
self?.loadBannerAd()
}
}
@MainActor
func loadBannerAd() {
let frame = view.frame.inset(by: view.safeAreaInsets)
let viewWidth = frame.size.width
bannerView.adSize = largeAnchoredAdaptiveBanner(width: viewWidth)
let request = Request()
request.scene = view.window?.windowScene
bannerView.load(request)
}
SwiftUI
struct MultiSceneBannerView: View {
var body: some View {
GeometryReader { geometry in
let adSize = largeAnchoredAdaptiveBanner(width: geometry.size.width)
MultiSceneBannerViewContainer(adSize: adSize)
.frame(width: adSize.size.width, height: adSize.size.height)
}
}
}
private struct MultiSceneBannerViewContainer: UIViewRepresentable {
let adSize: AdSize
func makeUIView(context: Context) -> BannerView {
let bannerView = BannerView(adSize: adSize)
let request = Request()
request.scene =
UIApplication.shared.connectedScenes
.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene
bannerView.load(request)
return bannerView
}
func updateUIView(_ uiView: BannerView, context: Context) {
if uiView.adSize.size != adSize.size {
uiView.adSize = adSize
let request = Request()
request.scene = uiView.window?.windowScene
uiView.load(request)
}
}
}
Objective-C
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[coordinator
animateAlongsideTransition:nil
completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
[self loadBannerAd];
}];
}
- (void)loadBannerAd {
dispatch_async(dispatch_get_main_queue(), ^{
CGRect frame = UIEdgeInsetsInsetRect(self.view.frame, self.view.safeAreaInsets);
CGFloat viewWidth = frame.size.width;
self.bannerView.adSize = GADLargeAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth);
GADRequest *request = [GADRequest request];
request.scene = self.view.window.windowScene;
[self.bannerView loadRequest:request];
});
}
Reklamy natywne
Masz kontrolę nad układem reklam natywnych. W przeciwieństwie do banerów czy reklam pełnoekranowych nie musisz ponownie wczytywać reklam natywnych, gdy zmienia się rozmiar okna. Aby widok reklamy natywnej dostosowywał się do zmian rozmiaru, używaj standardowych ograniczeń układu automatycznego lub układów SwiftUI.