Kể từ iOS 13, các ứng dụng có thể hỗ trợ nhiều cửa sổ trên iPad, tức là 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. Mỗi cửa sổ có thể được tạo ở các kích thước khác nhau và có thể đổi kích thước bất cứ lúc nào. Điều này có ảnh hưởng đến cách quảng cáo được tải và hiển thị.
Hướng dẫn này nhằm trình bày các phương pháp hay nhất để hiển thị quảng cáo chính xác trong trường hợp iPad chạy nhiều cửa sổ.
Điều kiện tiên quyết
- SDK Quảng cáo của Google trên thiết bị di động phiên bản 7.53.0 trở lên
- Bật tính năng hỗ trợ cảnh trong dự án của bạn
- Triển khai ít nhất một định dạng quảng cáo
Đặt cảnh trong yêu cầu quảng cáo
Để quảng cáo hiển thị vừa với một cửa sổ cụ thể, bạn phải chuyển
windowScene
của khung hiển thị đến yêu cầu quảng cáo. SDK quảng cáo trên thiết bị di động của Google sẽ trả về một quảng cáo có
kích thước hợp lệ cho cảnh đó.
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) {}]; }
Ở 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 nhiều 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.
Ở 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 hiển thị nếu quảng cáo hiển thị trên cửa sổ không phải toàn màn hình. Thông báo lỗi trong trường hợp này là:
<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 trong viewDidAppearance:
Trường hợp nhiều cửa sổ đưa ra yêu cầu phải có cảnh cửa sổ để gửi yêu cầu quảng cáo. Vì chế độ xem chưa được thêm vào cửa sổ trong
viewDidLoad:
, bạn nên tạo yêu cầu quảng cáo trong viewDidAppear:
,
nơi cảnh cửa sổ được đặt bằng điểm đó.
Lưu ý rằng viewDidAppear:
có thể được gọi nhiều lần trong vòng đời của một ứng dụng. Bạn nên gói mã khởi tạo yêu cầu quảng cáo bằng
một cờ cho biết liệu mã đó đã được thực hiện hay chưa.
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; } }
Xử lý việc đổi kích thước
Người dùng có thể kéo cảnh xung quanh bất cứ lúc nào, thay đổi kích thước cửa sổ sau khi thực hiện yêu cầu quảng cáo. Bạn có thể yêu cầu một quảng cáo mới khi đổi kích thước.
Mã mẫu bên dưới dùng viewWillTransitionToSize:withTransitionCoordinator:
để nhận thông báo khi cửa sổ của trình điều khiển khung hiển thị gốc xoay hoặc đổi kích thước, nhưng bạn cũng có thể theo dõi windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:
để biết các thay đổi cụ thể đối với cảnh cửa sổ.
Quảng cáo xen kẽ và Quảng cáo có tặng thưởng
SDK quảng cáo trên thiết bị di động của Google cung cấp phương thức
canPresentFromViewController:error:
để xác định xem quảng cáo xen kẽ hoặc
quảng cáo có tặng thưởng có hợp lệ hay không. Nhờ đó, bạn có thể kiểm tra xem có cần làm mới quảng cáo toàn màn hình
bất cứ khi nào kích thước cửa sổ thay đổi hay không.
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]; } }]; }
Biểu ngữ
Bạn có thể xử lý việc đổi kích thước cửa sổ giống như cách xoay cửa sổ. Ứng dụng của bạn chịu trách nhiệm đảm bảo quảng cáo biểu ngữ vừa với kích thước cửa sổ mới.
Ví dụ dưới đây sẽ tạo một biểu ngữ thích ứng mới có chiều rộng mới cho cửa sổ:
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]; }
Quảng cáo gốc
Bạn có quyền kiểm soát việc hiển thị quảng cáo gốc và chịu trách nhiệm đảm bảo quảng cáo gốc đó hiển thị trong khung hiển thị đã đổi kích thước, tương tự như phần còn lại của nội dung ứng dụng.
Vấn đề đã biết
Hiện tại, quảng cáo chia đôi màn hình và nhiều cửa sổ chỉ được hỗ trợ ở chế độ dọc. Bạn sẽ nhận được thông điệp nhật ký sau đây khi yêu cầu quảng cáo ở chế độ ngang.
<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.