إتاحة نوافذ متعدّدة على جهاز iPad

اعتبارًا من iOS 13، يمكن للتطبيقات أن تتيح نوافذ متعدّدة على أجهزة iPad، ما يعني أنّه يمكن للمستخدمين التفاعل مع نسخ متعدّدة ومتزامنة من واجهة مستخدم التطبيق. يمكن إنشاء كل نافذة بأحجام مختلفة ويمكن تغيير حجمها في أي وقت، ما يؤثر في طريقة تحميل الإعلانات وعرضها.

يهدف هذا الدليل إلى عرض أفضل الممارسات لعرض الإعلانات بشكل صحيح في سيناريو النوافذ المتعدّدة على أجهزة iPad.

المتطلبات الأساسية

ضبط المشهد في طلب عرض الإعلان

لتلقّي إعلان مناسب لنافذة معيّنة، عليك تمرير 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.