الإعلانات البينية

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

الإعلانات البينية هي إعلانات بملء الشاشة تغطي واجهة أحد التطبيقات إلى أن يغلقها المستخدم. وعادةً ما يتم عرضها في نقاط انتقال مناسبة خلال مسار عرض التطبيق، على سبيل المثال بين الأنشطة أو في الوقت الفاصل بين مستويَين في لعبة. وعندما يعرض التطبيق إعلانًا بينيًا، يمكن للمستخدم النقر على الإعلان والمتابعة إلى وجهته أو إغلاقه ثم العودة إلى التطبيق.

يوضّح لك هذا الدليل كيفية دمج الإعلانات البينية في تطبيق متوافق مع iOS.

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

  • SDK لإعلانات Google على الأجهزة الجوّالة 8.0.0 أو إصدار أحدث.
  • أكمِل دليل البدء.

الاختبار دائمًا باستخدام الإعلانات التجريبية

عند إنشاء تطبيقاتك واختبارها، احرص على استخدام إعلانات تجريبية بدلاً من إعلانات الإنتاج المباشر. ويمكن أن يؤدي عدم الالتزام بذلك إلى تعليق حسابك.

إن أسهل طريقة لتحميل الإعلانات الاختبارية هي استخدام رقم تعريف الوحدة الإعلانية الاختبارية المخصّص للإعلانات البينية على نظام التشغيل iOS:
/6499/example/interstitial

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

للاطّلاع على مزيد من المعلومات حول آلية عمل الإعلانات الاختبارية لحزمة تطوير البرامج (SDK) للإعلانات على الأجهزة الجوّالة، راجِع الإعلانات الاختبارية.

التنفيذ

الخطوات الأساسية لدمج الإعلانات البينية هي:

  1. حمِّل إعلانًا.
  2. التسجيل من أجل معاودة الاتصال.
  3. عرض الإعلان والتعامل مع حدث المكافأة

تحميل إعلان

يتم تحميل الإعلان باستخدام طريقة loadWithAdUnitID:request:completionHandler: الثابتة في الصف GAMInterstitialAd. تتطلب طريقة التحميل رقم تعريف الوحدة الإعلانية، وعنصر GAMRequest، ومعالج الإكمال التلقائي الذي يتم استدعاؤه عند نجاح أو عدم تحميل الإعلان. يتم توفير الكائن GAMInterstitialAd الذي تم تحميله كمعلَمة في معالج الإكمال. يوضّح المثال التالي كيفية تحميل GAMInterstitialAd في صف ViewController.

Swift

import GoogleMobileAds
import UIKit

class ViewController: UIViewController {

  private var interstitial: GAMInterstitialAd?

  override func viewDidLoad() {
    super.viewDidLoad()
    let request = GAMRequest()
    GAMInterstitialAd.load(withAdUnitID:"/6499/example/interstitial",
                                request: request,
                      completionHandler: { [self] ad, error in
                        if let error = error {
                          print("Failed to load interstitial ad with error: \(error.localizedDescription)")
                          return
                        }
                        interstitial = ad
                      }
    )
  }
}

Objective-C

@import GoogleMobileAds;
@import UIKit;

@interface ViewController ()

@property(nonatomic, strong) GAMInterstitialAd *interstitial;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  GAMRequest *request = [GAMRequest request];
  [GAMInterstitialAd loadWithAdUnitID:@"/6499/example/interstitial"
                              request:request
                    completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
    if (error) {
      NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
      return;
    }
    self.interstitial = ad;
  }];
}

التسجيل من أجل معاودة الاتصال

لتلقّي الإشعارات الخاصة بأحداث العروض التقديمية، يجب تنفيذ بروتوكول GADFullScreenContentDelegate وتخصيصه للسمة fullScreenContentDelegate في الإعلان المعروض. يعالج البروتوكول GADFullScreenContentDelegate استدعاءات الوقت الذي يتم فيه عرض الإعلان بنجاح أو بنجاح وعندما يتم رفضه. ويوضّح الرمز التالي كيفية تنفيذ البروتوكول وتخصيصه للإعلان:

Swift

class ViewController: UIViewController, GADFullScreenContentDelegate {

  private var interstitial: GAMInterstitialAd?

  override func viewDidLoad() {
    super.viewDidLoad()
    let request = GAMRequest()
    GAMInterstitialAd.load(withAdUnitID:"/6499/example/interstitial",
                                request: request,
                      completionHandler: { [self] ad, error in
                        if let error = error {
                          print("Failed to load interstitial ad with error: \(error.localizedDescription)")
                          return
                        }
                        interstitial = ad
                        interstitial?.fullScreenContentDelegate = self
                      }
    )
  }

  /// Tells the delegate that the ad failed to present full screen content.
  func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
    print("Ad did fail to present full screen content.")
  }

  /// Tells the delegate that the ad will present full screen content.
  func adWillPresentFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad will present full screen content.")
  }

  /// Tells the delegate that the ad dismissed full screen content.
  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    print("Ad did dismiss full screen content.")
  }
}

Objective-C

@interface ViewController ()<GADFullScreenContentDelegate>

@property(nonatomic, strong) GAMInterstitialAd *interstitial;

@end

@implementation ViewController
- (void)viewDidLoad {
  [super viewDidLoad];
  GAMRequest *request = [GAMRequest request];
  [GAMInterstitialAd loadWithAdUnitID:@"/6499/example/interstitial"
                              request:request
                    completionHandler:^(GAMInterstitialAd *ad, NSError *error) {
    if (error) {
      NSLog(@"Failed to load interstitial ad with error: %@", [error localizedDescription]);
      return;
    }
    self.interstitial = ad;
    self.interstitial.fullScreenContentDelegate = self;
  }];
}

/// Tells the delegate that the ad failed to present full screen content.
- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
    NSLog(@"Ad did fail to present full screen content.");
}

/// Tells the delegate that the ad will present full screen content.
- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
    NSLog(@"Ad will present full screen content.");
}

/// Tells the delegate that the ad dismissed full screen content.
- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
   NSLog(@"Ad did dismiss full screen content.");
}

GAMInterstitialAd هو عنصر يُستخدم لمرة واحدة. وهذا يعني أنه بعد عرض إعلان بيني، لا يمكن عرضه مرة أخرى. ومن بين أفضل الممارسات تحميل إعلان بيني آخر بالطريقة adDidDismissFullScreenContent: على GADFullScreenContentDelegate بحيث يبدأ تحميل الإعلان البيني التالي فور رفض الإعلان السابق.

عرض الإعلان

يجب أن تظهر الإعلانات البينية أثناء عمليات الإيقاف المؤقت الطبيعية في تدفق التطبيقات. ومن بين المستويات في اللعبة مثالاً جيدًا، أو بعد إكمال المستخدم لمهمة. في ما يلي مثال على كيفية إجراء ذلك في إحدى طرق الإجراءات في UIViewController:

Swift

@IBAction func doSomething(_ sender: Any) {
  if interstitial != nil {
    interstitial.present(fromRootViewController: self)
  } else {
    print("Ad wasn't ready")
  }
}

Objective-C

- (IBAction)doSomething:(id)sender {
  ...
  if (self.interstitial) {
    [self.interstitial presentFromRootViewController:self];
  } else {
    NSLog(@"Ad wasn't ready");
  }
}

إذا لم تظهر لك أي إعلانات مرة أخرى، وكانت الاستجابة بالخطأ و"الطلب": لا توجد إعلانات لعرضها، تأكّد من أن العنصر يحتوي على تصميم إعلان يستهدف الحجم الصحيح. أحجام الإعلانات البينية هي 320x480 وamp؛ 480x320 للهواتف و1024x768 &amp؛ 768x1024 للأجهزة اللوحية. إذا لم يكن الجهاز كبيرًا بما يكفي ليتناسب مع مقاس 1024x768 أو 778x1024، سيعود إلى هذا الحجم بحجم 320x480 أو 480x320.

أفضل الممارسات

ضَع في اعتبارك ما إذا كانت الإعلانات البينية هي النوع المناسب من الإعلانات لتطبيقك.
تعمل الإعلانات البينية على أفضل نحو في التطبيقات التي تحتوي على نقاط انتقال طبيعية. في نهاية هذه المهمة، مثل مشاركة صورة أو إكمال مستوى لعبة، يتم إنشاء هذه النقطة. ونظرًا لأن المستخدم يتوقع حدوث عطل في الإجراء، سيكون من السهل عرض إعلان بيني بدون الإخلال بتجربة المستخدم. تأكَّد من المراحل التي يجب أن تعرض فيها إعلانات تطبيقك في سير عمل تطبيقك، وبالتالي سيتم عرض الإعلانات البينية والطريقة التي يُحتمل أن يردّ بها المستخدم.
احرِص على إيقاف الإجراء مؤقتًا عند عرض إعلان بيني.
هناك عدد من أنواع الإعلانات البينية المختلفة، وهي: الإعلانات النصية والإعلانات المصوّرة وإعلانات الفيديو وغيرها. من المهم التأكّد من أنه عند عرض تطبيقك إعلان بيني، يعلّق أيضًا استخدامه لبعض الموارد للسماح للإعلان بالاستفادة منها. على سبيل المثال، عند إجراء مكالمة لعرض إعلان بيني، تأكّد من إيقاف أي نتائج صوتية يتم إنشاؤها بواسطة تطبيقك مؤقتًا. يمكنك استئناف تشغيل الأصوات في معالج adDidDismissFullScreenContent: الحدث، الذي سيتم استدعاؤه عند انتهاء المستخدم من التفاعل مع الإعلان. بالإضافة إلى ذلك، فكِّر مؤقتًا في إيقاف أي مهام حسابية شاقة (مثل حلقة من أحداث اللعبة) أثناء عرض الإعلان. سيضمن ذلك عدم قدرة المستخدم على عرض رسومات بطيئة أو غير مستجيبة أو فيديو متقطّع.
اسمح بمرور وقت تحميل كافٍ.
من المهم التأكّد من عرض الإعلانات البينية في الوقت المناسب، ولكن من المهم أيضًا التأكّد من أنّ المستخدم ليس بحاجة إلى الانتظار حتى يتم تحميلها. ويمكن أن يضمن تحميل الإعلان مسبقًا قبل النية في عرضه أن يكون لتطبيقك إعلان بيني تم تحميله بالكامل عندما يكون جاهزًا لعرض ذلك.
لا تملأ المستخدم بالإعلانات.
مع أنّ زيادة معدّل تكرار الإعلانات البينية في تطبيقك قد يكون وسيلة رائعة لزيادة أرباحك، قد يؤثر ذلك أيضًا في تجربة المستخدم وانخفاضًا في نسب النقر إلى الظهور. تأكد من عدم توقف المستخدمين بشكل متكرر لأنهم لم يعُد بإمكانهم الاستفادة من تطبيقك.
لا تستخدم استدعاء إكمال التحميل لعرض الإعلان البيني.
يمكن أن يؤدي ذلك إلى تجربة مستخدم سيئة. وبدلاً من ذلك، عليك تحميل الإعلان مسبقًا قبل أن تحتاج إلى عرضه. بعد ذلك، يمكنك الاطّلاع على طريقة canPresentFromRootViewController:error: على GAMInterstitialAd لمعرفة ما إذا كانت جاهزة للعرض.

أمثلة على GitHub

  • مثال على الإعلانات البينية: Swift | Purpose-C

الخطوات اللاحقة