iPad'de birden fazla pencereyi destekleyen veya iPhone Duo gibi katlanabilir cihazlarda çalışan uygulamalar, kullanıcı arayüzünü dinamik pencere boyutlarında ve ekran yapılandırmalarında görüntüleyebilir. iPad'de kullanıcılar, bir uygulamanın kullanıcı arayüzünün aynı anda birden fazla kopyasıyla etkileşim kurabilir ve pencereleri yeniden boyutlandırabilir. Katlanabilir cihazlarda, cihazın katlanma durumu etkin ekranı belirler. Cihaz açıldığında daha büyük olan iç ekranı kullanır. Katlandığında cihaz daha küçük olan dış ekranı kullanır.
Bu kılavuzda, çok pencereli ortamlarda ve katlanabilir ekranlarda reklam yükleme ve oluşturma işlemleri ele alınmaktadır.
Ön koşullar
Başlamadan önce aşağıdakileri tamamlayın:
- Projenizde sahne desteğini etkinleştirin. Ayrıntılar için Uygulamanızın desteklediği sahneleri belirtme başlıklı makaleyi inceleyin.
- En az bir reklam biçimi uygulayın:
- Uygulama açılışı
Reklam isteğinde pencere sahnesini ayarlama
Belirli bir pencereye veya etkin ekrana uyan bir reklam almak için etkin UIWindowScene nesnesini GADRequest nesnesindeki scene özelliğine atayın. Google Mobile Ads SDK, bu sahne için boyutlandırılmış bir reklam döndürür. SwiftUI'da, etkin ön plan pencere sahnesi için bağlı sahneleri sorgulayın.
Aşağıdaki örnekte pencere sahnesi yapılandırılır, başarılı olursa geçiş reklamı yüklenir ve başarısız olursa hata mesajı kaydedilir:
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;
}];
}
Test modunda, çok sahneli uygulamanız bir sahne iletmeden reklam isteğinde bulunursa reklam istekleri aşağıdaki hatayla başarısız olur:
<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.
Üretim modunda reklam isteği doldurulur ancak reklam, reklam içeriği boyutundan daha küçük bir pencerede sunulursa reklamın sunulması başarısız olur:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Reklam isteğini oluşturma
Reklam istekleri gönderilirken çok sahneli uygulamalar için geçerli bir pencere sahnesi gerekir.
Pencere sahnesinin doldurulduğu yerlerde viewDidAppear yöntemini kullanarak reklam istekleri oluşturun. viewDidLoad yönteminde bir pencereye henüz görünüm eklenmediği için bu süreci öneririz.
Bir uygulamanın yaşam döngüsünde viewDidAppear yöntemini birden fazla kez çağırabilirsiniz ancak reklam isteğini yalnızca bir kez çalıştırılacak şekilde bir boole işaretine sarmalamanız gerekir.
Aşağıdaki örnekte, reklam isteği viewDidAppear yönteminde başlatılmaktadır:
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;
}
}
Pencereyi yeniden boyutlandırma
Kullanıcılar iPad'de sahneleri yeniden boyutlandırdığında veya iPhone Duo gibi katlanabilir bir cihazı katlayıp açtığında pencere boyutları değişir. Pencere boyutu değiştiğinde, yüklenen reklamların güncellenen boyutlara uyduğunu doğrulayın ve gerekirse reklamları yeniden yükleyin.
Yüklenen reklamların güncellenen boyutlara uyduğunu doğrulamak için aşağıdaki yöntemlerden birini kullanın:
viewWillTransitionToSize:withTransitionCoordinator:: Görünüm denetleyicisinin penceresinin ne zaman döndürüldüğünü, yeniden boyutlandırıldığını veya katlama durumları arasında geçiş yaptığını algılar.windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:: Pencere sahnesi değişiklikleri için.
Tam ekran reklamlar
Yüklenen bir tam ekran reklamın güncellenen pencere boyutu veya katlama durumu için geçerli olup olmadığını doğrulamak üzere canPresentFromRootViewController:error: yöntemini kullanın. Kontrol başarısız olursa güncellenen sahneye uygun boyutta bir reklam yükleyin.
Aşağıdaki örnekte, bir boyut geçişinden sonra geçiş reklamının gösterilip gösterilemeyeceği kontrol edilir ve gerekirse reklam yeniden yüklenir:
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];
}
}];
}
Banner reklamlar
Pencere yeniden boyutlandırma ve katlama geçişlerini cihaz döndürmeye benzer şekilde işleyin. Banner görüntülemelerini safeAreaLayoutGuide mülküyle sınırlandırın. Bu işlem, reklamların cihaz menteşeleri, kesikler ve sistem çubuklarından uzak kalmasını sağlar. Bu işlem, güncellenen güvenli alan genişliğini kullanarak sabit uyarlanabilir banner boyutunu da yeniden hesaplar.
Aşağıdaki örnekte, boyut geçişi sırasında güncellenen pencere genişliğine sahip bir sabit uyarlanabilir banner yüklenmektedir:
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];
});
}
Yerel reklamlar
Doğal reklamların düzenini siz kontrol edersiniz. Banner'ların veya tam ekran reklamların aksine, pencere yeniden boyutlandırıldığında doğal reklamları yeniden yüklemeniz gerekmez. Doğal reklam görünümünün boyut değişikliklerine uyum sağlaması için standart otomatik düzen kısıtlamalarını veya SwiftUI düzenlerini kullanın.