iPad에서 멀티 윈도우 지원

iOS 13부터 iPad 앱에서 멀티 창 기능이 지원되면서 앱 UI의 여러 창과 동시에 상호작용할 수 있게 되었습니다. 각 창을 서로 다른 크기로 만들고 창 크기를 언제든지 조절할 수 있으며, 이에 따라 광고가 로드 및 표시되는 방식도 영향을 받게 됩니다.

이 가이드에서는 iPad 멀티 윈도우 시나리오에서 광고를 올바르게 렌더링하기 위한 권장사항을 설명합니다.

기본 요건

광고 요청에서 장면 설정하기

창에 딱 맞는 광고를 수신하려면 광고 요청에 뷰의 windowScene을 전달합니다. Google 모바일 광고 SDK가 장면에 적합한 크기의 광고를 반환합니다.

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

테스트 모드에서는 멀티 장면 앱에서 장면을 전달하지 않고 광고를 요청하면 광고 요청이 실패하고 다음과 같은 오류가 발생합니다.

<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.

프로덕션 모드에서는 광고 요청이 처리되지만, 광고가 전체 화면이 아닌 창에 표시될 경우 광고가 표시되지 않습니다. 이 경우 다음과 같이 오류 메시지가 표시됩니다.

<Google> Ad cannot be presented. The full screen ad content size exceeds the current window size.

viewDidAppear에서 광고 요청 구성하기

멀티 윈도우의 경우 광고 요청을 보내기 위해 창 장면이 있어야 합니다. viewDidLoad:의 창에 뷰가 아직 추가되지 않았으므로 viewDidAppear:에서 광고 요청을 구성해야 합니다. 광고 요청을 구성할 때쯤에 창 장면이 설정됩니다.

앱의 수명 주기 동안 viewDidAppear:를 두 번 이상 호출할 수 있습니다. 광고 요청의 완료 여부를 나타내는 플래그 안에 광고 요청 초기화 코드를 넣는 것이 좋습니다.

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

크기 조절 처리

사용자는 언제든지 장면을 드래그할 수 있으며, 광고 요청이 완료되었으면 창 크기가 변할 수 있습니다. 창 크기가 조절될 때 새 광고를 요청할지 여부는 게시자가 정합니다. 아래의 샘플 코드에서는 루트 뷰 컨트롤러의 창이 회전하거나 크기가 변경될 때 viewWillTransitionToSize:withTransitionCoordinator:를 통해 알림이 표시되지만, windowScene:didUpdateCoordinateSpace:interfaceOrientation:traitCollection:을 리스닝하여 창 장면별 변경을 확인할 수도 있습니다.

전면 광고 및 보상형 광고

Google 모바일 광고 SDK에서는 canPresentFromViewController:error: 메서드를 통해 전면 광고 또는 보상형 광고가 유효한지를 확인하므로 창 크기가 변할 때마다 전체 화면 광고를 새로고침해야 하는지 알 수 있습니다.

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

창을 회전할 때와 같은 방식으로 창 크기 조절을 처리할 수 있습니다. 새 창 크기에 맞는 배너 광고를 게재하는 작업은 앱에서 처리합니다.

아래 예에서는 새 창 너비에 맞는 새 적응형 배너를 만듭니다.

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

네이티브 광고

네이티브 광고 렌더링을 관리하고 크기가 변한 뷰에서 앱의 다른 콘텐츠와 비슷해지도록 네이티브 광고가 렌더링되게 하는 작업은 광고주가 처리합니다.

알려진 문제

현재 멀티 윈도우 및 화면 분할 광고는 세로 모드에서만 지원됩니다. 가로 모드에서 광고를 요청하면 아래의 로그 메시지가 표시됩니다.

<Google> Ad cannot be presented. The full screen ad content size exceeds the
current window size.