Các ứng dụng hỗ trợ nhiều cửa sổ trên iPad hoặc chạy trên thiết bị có thể gập lại (chẳng hạn như iPhone Duo) có thể hiển thị giao diện người dùng trên nhiều kích thước cửa sổ và cấu hình màn hình linh động. Trên iPad, người dùng có thể tương tác đồng thời với nhiều bản sao giao diện người dùng của ứng dụng và đổi kích thước cửa sổ. Trên thiết bị có thể gập lại, trạng thái gập của thiết bị sẽ xác định màn hình đang hoạt động. Khi mở ra, thiết bị sẽ sử dụng màn hình bên trong lớn hơn. Khi gập lại, thiết bị sẽ sử dụng màn hình nhỏ hơn ở bên ngoài.
Hướng dẫn này đề cập đến việc tải và hiển thị quảng cáo trên môi trường nhiều cửa sổ và màn hình có thể gập lại.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy hoàn thành các bước sau:
- Bật tính năng hỗ trợ cảnh trong dự án của bạn. Để biết thông tin chi tiết, hãy xem phần Chỉ định cảnh mà ứng dụng của bạn hỗ trợ.
- Triển khai ít nhất một định dạng quảng cáo:
- Quảng cáo khi mở ứng dụng
Đặt cảnh cửa sổ trong yêu cầu quảng cáo
Để nhận quảng cáo vừa vặn với một cửa sổ hoặc màn hình đang hoạt động cụ thể, hãy chỉ định đối tượng UIWindowScene đang hoạt động cho thuộc tính scene trên đối tượng GADRequest. Google Mobile Ads SDK trả về một quảng cáo có kích thước phù hợp với cảnh đó. Trong SwiftUI, hãy truy vấn các cảnh đã kết nối cho cảnh cửa sổ nền trước đang hoạt động.
Ví dụ sau đây định cấu hình cảnh cửa sổ, tải quảng cáo xen kẽ khi thành công và ghi lại thông báo lỗi khi không thành công:
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;
}];
}
Trong chế độ thử nghiệm, các yêu cầu quảng cáo sẽ không thành công kèm theo lỗi sau đây nếu ứng dụng đa cảnh của bạn yêu cầu quảng cáo mà không chuyển cảnh:
<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.
Trong chế độ sản xuất, yêu cầu quảng cáo sẽ được thực hiện, nhưng quảng cáo sẽ không thể hiển thị nếu quảng cáo được hiển thị trên cửa sổ nhỏ hơn kích thước nội dung quảng cáo:
<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.
Tạo yêu cầu quảng cáo
Khi gửi yêu cầu quảng cáo, các ứng dụng nhiều cảnh cần có cảnh cửa sổ hợp lệ.
Khi cảnh cho cửa sổ được điền sẵn, hãy tạo yêu cầu quảng cáo bằng phương thức viewDidAppear. Bạn nên thực hiện quy trình này vì thành phần hiển thị chưa được thêm vào cửa sổ trong phương thức viewDidLoad.
Mặc dù có thể gọi phương thức viewDidAppear nhiều lần trong vòng đời của ứng dụng, nhưng bạn phải gói yêu cầu quảng cáo trong một cờ boolean để chỉ chạy một lần.
Ví dụ sau đây khởi chạy yêu cầu quảng cáo trong phương thức 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;
}
}
Xử lý việc đổi kích thước cửa sổ
Kích thước cửa sổ thay đổi khi người dùng đổi kích thước cảnh trên iPad hoặc gập và mở một thiết bị gập như iPhone Duo. Khi kích thước cửa sổ thay đổi, hãy xác minh rằng quảng cáo đã tải phù hợp với kích thước mới và tải lại quảng cáo nếu cần.
Để xác minh rằng quảng cáo đã tải phù hợp với kích thước mới, hãy sử dụng một trong các phương thức sau:
viewWillTransitionToSize:withTransitionCoordinator:: phát hiện thời điểm cửa sổ của trình kiểm soát khung hiển thị xoay, đổi kích thước hoặc chuyển đổi giữa các trạng thái gập.windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:: đối với các thay đổi về cảnh cửa sổ.
Quảng cáo toàn màn hình
Để xác minh xem quảng cáo toàn màn hình đã tải có còn hợp lệ cho kích thước cửa sổ hoặc trạng thái gập mới hay không, hãy sử dụng phương thức canPresentFromRootViewController:error:. Nếu
quá trình kiểm tra không thành công, hãy tải một quảng cáo có kích thước phù hợp với cảnh đã cập nhật.
Ví dụ sau đây kiểm tra xem quảng cáo xen kẽ có thể hiển thị sau khi chuyển đổi kích thước hay không và tải lại quảng cáo nếu cần:
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];
}
}];
}
Quảng cáo biểu ngữ
Xử lý việc đổi kích thước cửa sổ và chuyển đổi trạng thái gập tương tự như xoay thiết bị. Giới hạn
lượt xem biểu ngữ cho tài sản safeAreaLayoutGuide. Quy trình này giúp quảng cáo không bị che khuất bởi bản lề, phần cắt và thanh hệ thống của thiết bị. Quá trình này cũng tính toán lại kích thước biểu ngữ neo thích ứng bằng cách sử dụng chiều rộng vùng an toàn đã cập nhật.
Ví dụ sau đây tải một biểu ngữ neo thích ứng có chiều rộng cửa sổ được cập nhật trong quá trình chuyển đổi kích thước:
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];
});
}
Quảng cáo gốc
Bạn kiểm soát bố cục của quảng cáo gốc. Không giống như quảng cáo biểu ngữ hoặc quảng cáo toàn màn hình, bạn không cần tải lại quảng cáo gốc khi cửa sổ đổi kích thước. Sử dụng các quy tắc ràng buộc về Bố cục tự động tiêu chuẩn hoặc bố cục SwiftUI cho chế độ xem quảng cáo gốc để thích ứng với các thay đổi về kích thước.