دعم عدة نوافذ على 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.

إنشاء طلب الإعلان في viewPolicydoes:

تؤدي حالة النوافذ المتعددة إلى توفير مشهد نافذة لإرسال طلبات الإعلان. بما أنّه لم تتم إضافة طريقة عرض إلى نافذة في 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: لمعرفة التغييرات الخاصة بمشهد النافذة.

إعلان بيني وإعلانات تضم مكافأة

توفِّر "حزمة تطوير البرامج (SDK) لإعلانات Google على الأجهزة الجوّالة" الطريقة 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.