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

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

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

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

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

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

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.

לבנות את הבקשה להצגת מודעה ב-viewDidshow:

במקרה של ריבוי חלונות, נדרשת סצנה של חלון כדי לשלוח בקשות להצגת מודעות. מאחר שעדיין לא נוספה תצוגה מפורטת לחלון ב-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(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.