Hỗ trợ nhiều cửa sổ trên iPad

Kể từ iOS 13, các ứng dụng có thể hỗ trợ nhiều Windows trên iPad, nghĩa là người dùng có thể tương tác với nhiều bản sao đồng thời của Giao diện người dùng. Bạn có thể tạo mỗi cửa sổ ở các kích thước khác nhau và đổi kích thước bất kỳ lúc nào, 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 giới thiệu cho bạn các phương pháp hay nhất để hiển thị quảng cáo chính xác trong tình huống nhiều cửa sổ trên iPad.

Điều kiện tiên quyết

Đặt cảnh trong yêu cầu quảng cáo

Để nhận được quảng cáo phù hợp với một cửa sổ cụ thể, bạn chuyển lượt xem windowScene cho yêu cầu quảng cáo. SDK quảng cáo trên thiết bị di động của Google 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ực hiện được kèm theo lỗi sau nếu ứng dụng nhiều cảnh của bạn yêu cầu một 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 được thực hiện, nhưng việc hiển thị quảng cáo sẽ không thành công nếu quảng cáo sẽ được hiển thị trên cửa sổ không 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 viewDidPublish:

Trong trường hợp chế độ nhiều cửa sổ đưa ra yêu cầu về việc có cảnh cho cửa sổ đang gửi yêu cầu quảng cáo. Vì một 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ởi điểm đó.

Lưu ý rằng viewDidAppear: có thể được gọi nhiều lần trong vòng đời. Bạn nên gói mã khởi tạo yêu cầu quảng cáo trong một cờ cho biết việc việc này đã đượ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 quảng cáo kết thúc đã được thực hiện. Bạn có thể yêu cầu một quảng cáo mới khi người dùng đổi kích thước. Mã mẫu bên dưới sử dụng viewWillTransitionToSize:withTransitionCoordinator: nhận thông báo khi cửa sổ của trình điều khiển chế độ xem gốc xoay hoặc đổi kích thước, nhưng bạn cũng có thể nghe windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection: cho các thay đổi cụ thể của 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 pháp canPresentFromViewController:error: để xác định xem quảng cáo xen kẽ hay quảng cáo có tặng thưởng có hợp lệ hay không, giúp bạn có thể kiểm tra xem có bất kỳ quảng cáo toàn màn hình nào không quảng cáo cần được làm mới bất cứ khi nào kích thước cửa sổ thay đổi.

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];
    }
  }];
}

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ổ. Thông tin ứng dụng 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ụ bên dưới sẽ tạo một biểu ngữ thích ứng mới với chiều rộng mới của 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 nắm 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ị bên trong chế độ xem đã đổi kích thước, tương tự như phần còn lại của ứng dụng nội dung.

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.