תמיכה ב-Multiple Windows ב-iPad

החל מ-iOS 13, אפליקציות יכולות לתמוך בכמה חלונות באייפד, כלומר משתמשים יכולים ליצור אינטראקציה עם כמה עותקים מקבילים של ממשק המשתמש של האפליקציה. אפשר ליצור כל חלון בגדלים שונים ולשנות את הגודל שלו בכל שלב. יש לכך השלכות על אופן הטעינה וההצגה של המודעות.

המדריך הזה נועד להציג שיטות מומלצות להצגת מודעות בצורה נכונה בתרחיש של ריבוי חלונות באייפד.

דרישות מוקדמות

הגדרת הסצנה בבקשה להצגת מודעה

כדי לקבל מודעה שמתאימה לחלון מסוים, מעבירים את הערך של windowScene של התצוגה לבקשת המודעה. ‫Google Mobile Ads SDK מחזיר מודעה עם גודל תקין לסצנה הזו.

Swift

func loadInterstitial() {
  let request = Request()
  request.scene = view.window?.windowScene

  InterstitialAd.load(with: "[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 Mobile Ads 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(from: 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 = currentOrientationAnchoredAdaptiveBanner(width: bannerWidth)

  let request = Request()
  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.