الإعلانات على شاشة فتح التطبيق

اختيار النظام الأساسي: Android (إصدار تجريبي) جديد Android iOS Unity Flutter

هذا الدليل مخصّص للناشرين الذين يدمجون "الإعلانات على شاشة فتح التطبيق".

"الإعلانات على شاشة فتح التطبيق" هي شكل إعلان خاص مخصّص للناشرين الذين يريدون تحقيق الربح من شاشات تحميل التطبيقات. يمكن للمستخدمين إغلاق "الإعلانات على شاشة فتح التطبيق" في أي وقت. يمكن عرض "الإعلانات على شاشة فتح التطبيق" عندما يعرض المستخدمون تطبيقك في المقدّمة.

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

في ما يلي نظرة عامة على الخطوات المطلوبة لعرض "الإعلانات على شاشة فتح التطبيق":

  1. إنشاء فئة مدير تحمّل إعلانًا قبل الحاجة إلى عرضه
  2. عرض الإعلان أثناء أحداث عرض التطبيق في المقدّمة
  3. التعامل مع معاودة الاتصال الخاصة بالعرض

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

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

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

أسهل طريقة لتحميل الإعلانات الاختبارية هي استخدام رقم تعريف الوحدة الإعلانية الاختبارية المخصّص "للإعلانات على شاشة فتح التطبيق":

/21775744923/example/app-open

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

لمزيد من المعلومات حول طريقة عمل الإعلانات الاختبارية Google Mobile Ads SDK، يُرجى الاطّلاع على مقالة الإعلانات الاختبارية.

تنفيذ فئة مدير

يجب أن يظهر إعلانك بسرعة، لذا من الأفضل تحميله قبل الحاجة إلى عرضه. بهذه الطريقة، سيكون لديك إعلان جاهز للعرض فور دخول المستخدم إلى تطبيقك. يمكنك تنفيذ فئة مدير لتقديم طلبات عرض الإعلانات قبل الحاجة إلى عرض الإعلان.

أنشئ فئة جديدة ذات مثيل واحد باسم AppOpenAdManager:

Swift

class AppOpenAdManager: NSObject {
  /// The app open ad.
  var appOpenAd: AppOpenAd?
  /// Maintains a reference to the delegate.
  weak var appOpenAdManagerDelegate: AppOpenAdManagerDelegate?
  /// Keeps track of if an app open ad is loading.
  var isLoadingAd = false
  /// Keeps track of if an app open ad is showing.
  var isShowingAd = false
  /// Keeps track of the time when an app open ad was loaded to discard expired ad.
  var loadTime: Date?
  /// For more interval details, see https://support.google.com/admanager/answer/9351867
  let timeoutInterval: TimeInterval = 4 * 3_600

  static let shared = AppOpenAdManager()

Objective-C

@interface AppOpenAdManager ()

/// The app open ad.
@property(nonatomic, strong, nullable) GADAppOpenAd *appOpenAd;
/// Keeps track of if an app open ad is loading.
@property(nonatomic, assign) BOOL isLoadingAd;
/// Keeps track of if an app open ad is showing.
@property(nonatomic, assign) BOOL isShowingAd;
/// Keeps track of the time when an app open ad was loaded to discard expired ad.
@property(nonatomic, strong, nullable) NSDate *loadTime;

@end

/// For more interval details, see https://support.google.com/admanager/answer/9351867
static const NSInteger kTimeoutInterval = 4;

@implementation AppOpenAdManager

+ (nonnull AppOpenAdManager *)sharedInstance {
  static AppOpenAdManager *instance = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    instance = [[AppOpenAdManager alloc] init];
  });
  return instance;
}

ونفِّذ بروتوكول AppOpenAdManagerDelegate الخاص بها:

Swift

protocol AppOpenAdManagerDelegate: AnyObject {
  /// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
  /// show).
  func appOpenAdManagerAdDidComplete(_ appOpenAdManager: AppOpenAdManager)
}

Objective-C

@protocol AppOpenAdManagerDelegate <NSObject>
/// Method to be invoked when an app open ad life cycle is complete (i.e. dismissed or fails to
/// show).
- (void)adDidComplete;
@end

تحميل إعلان

الخطوة التالية هي تحميل "إعلان على شاشة فتح التطبيق":

Swift

func loadAd() async {
  // Do not load ad if there is an unused ad or one is already loading.
  if isLoadingAd || isAdAvailable() {
    return
  }
  isLoadingAd = true

  do {
    appOpenAd = try await AppOpenAd.load(
      with: "/21775744923/example/app-open", request: AdManagerRequest())
    appOpenAd?.fullScreenContentDelegate = self
    loadTime = Date()
  } catch {
    print("App open ad failed to load with error: \(error.localizedDescription)")
    appOpenAd = nil
    loadTime = nil
  }
  isLoadingAd = false
}

Objective-C

- (void)loadAd {
  // Do not load ad if there is an unused ad or one is already loading.
  if ([self isAdAvailable] || self.isLoadingAd) {
    return;
  }
  self.isLoadingAd = YES;

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                         request:[GADRequest request]
               completionHandler:^(GADAppOpenAd * _Nullable appOpenAd, NSError * _Nullable error) {
    self.isLoadingAd = NO;
    if (error) {
      NSLog(@"App open ad failed to load with error: %@", error);
      self.appOpenAd = nil;
      self.loadTime = nil;
      return;
    }
    self.appOpenAd = appOpenAd;
    self.appOpenAd.fullScreenContentDelegate = self;
    self.loadTime = [NSDate date];
  }];
}

عرض إعلان

الخطوة التالية هي عرض إعلان على شاشة فتح التطبيق. إذا لم يتوفّر أي إعلان، حاوِل تحميل إعلان جديد.

Swift

func showAdIfAvailable() {
  // If the app open ad is already showing, do not show the ad again.
  if isShowingAd {
    return print("App open ad is already showing.")
  }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if !isAdAvailable() {
    print("App open ad is not ready yet.")
    // The app open ad is considered to be complete in this example.
    appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
    // Load a new ad.
    return
  }

  if let appOpenAd {
    print("App open ad will be displayed.")
    appOpenAd.present(from: nil)
    isShowingAd = true
  }
}

Objective-C

- (void)showAdIfAvailable {
  // If the app open ad is already showing, do not show the ad again.
  if (self.isShowingAd) {
    NSLog(@"App open ad is already showing.");
    return;
  }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if (![self isAdAvailable]) {
    NSLog(@"App open ad is not ready yet.");
    // The app open ad is considered to be complete in this example.
    [self adDidComplete];
    // Load a new ad.
    return;
  }

  [self.appOpenAd presentFromRootViewController:nil];
  self.isShowingAd = YES;
}

عرض الإعلان أثناء أحداث عرض التطبيق في المقدّمة

عندما يصبح التطبيق نشطًا، استدعِ الدالة showAdIfAvailable() لعرض إعلان إذا كان متوفّرًا، أو لتحميل إعلان جديد.

Swift

func applicationDidBecomeActive(_ application: UIApplication) {
  // Show the app open ad when the app is foregrounded.
  AppOpenAdManager.shared.showAdIfAvailable()
}

Objective-C

- (void) applicationDidBecomeActive:(UIApplication *)application {
  // Show the app open ad when the app is foregrounded.
  [AppOpenAdManager.sharedInstance showAdIfAvailable];
}

التعامل مع معاودة الاتصال الخاصة بالعرض

لتلقّي الإشعارات بشأن أحداث العرض التقديمي، عليك تعيين GADFullScreenContentDelegate للسمة `fullScreenContentDelegate` للإعلان الذي تم عرضه:

Swift

appOpenAd?.fullScreenContentDelegate = self

Objective-C

self.appOpenAd.fullScreenContentDelegate = self;

على وجه الخصوص، عليك طلب "الإعلان التالي على شاشة فتح التطبيق" بعد انتهاء عرض الإعلان الأول. يوضّح الرمز التالي كيفية تنفيذ البروتوكول في ملف AppOpenAdManager:

Swift

func adDidRecordImpression(_ ad: FullScreenPresentingAd) {
  print("App open ad recorded an impression.")
}

func adDidRecordClick(_ ad: FullScreenPresentingAd) {
  print("App open ad recorded a click.")
}

func adWillDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad will be dismissed.")
}

func adWillPresentFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad will be presented.")
}

func adDidDismissFullScreenContent(_ ad: FullScreenPresentingAd) {
  print("App open ad was dismissed.")
  appOpenAd = nil
  isShowingAd = false
  appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  Task {
    await loadAd()
  }
}

func ad(
  _ ad: FullScreenPresentingAd,
  didFailToPresentFullScreenContentWithError error: Error
) {
  print("App open ad failed to present with error: \(error.localizedDescription)")
  appOpenAd = nil
  isShowingAd = false
  appOpenAdManagerDelegate?.appOpenAdManagerAdDidComplete(self)
  Task {
    await loadAd()
  }
}

Objective-C

- (void)adDidRecordImpression:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad recorded an impression.");
}

- (void)adDidRecordClick:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad recorded a click.");
}

- (void)adWillPresentFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad will be presented.");
}

- (void)adWillDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad will be dismissed.");
}

- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  NSLog(@"App open ad was dismissed.");
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  [self adDidComplete];
  [self loadAd];
}

- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  NSLog(@"App open ad failed to present with error: %@", error.localizedDescription);
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  [self adDidComplete];
  [self loadAd];
}

مراعاة انتهاء صلاحية الإعلان

للتأكّد من عدم عرض إعلان منتهي الصلاحية، يمكنك إضافة طريقة إلى مفوّض التطبيق تتحقّق من الوقت المنقضي منذ تحميل مرجع إعلانك.

في AppOpenAdManager، أضِف سمة Date باسم loadTime واضبط السمة عند تحميل إعلانك. يمكنك بعد ذلك إضافة طريقة تعرض true إذا مرّت أقل من عدد معيّن من الساعات منذ تحميل إعلانك. احرص على التحقّق من صلاحية مرجع إعلانك قبل محاولة عرض الإعلان.

Swift

private func wasLoadTimeLessThanNHoursAgo(timeoutInterval: TimeInterval) -> Bool {
  // Check if ad was loaded more than n hours ago.
  if let loadTime = loadTime {
    return Date().timeIntervalSince(loadTime) < timeoutInterval
  }
  return false
}

private func isAdAvailable() -> Bool {
  // Check if ad exists and can be shown.
  return appOpenAd != nil && wasLoadTimeLessThanNHoursAgo(timeoutInterval: timeoutInterval)
}

Objective-C

- (BOOL)wasLoadTimeLessThanNHoursAgo:(int)n {
  // Check if ad was loaded more than n hours ago.
  NSDate *now = [NSDate date];
  NSTimeInterval timeIntervalBetweenNowAndLoadTime = [now timeIntervalSinceDate:self.loadTime];
  double secondsPerHour = 3600.0;
  double intervalInHours = timeIntervalBetweenNowAndLoadTime / secondsPerHour;
  return intervalInHours < n;
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd && [self wasLoadTimeLessThanNHoursAgo:kTimeoutInterval];
}

عمليات بدء التشغيل الباردة وشاشات التحميل

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

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

الطريقة المفضّلة لاستخدام "إعلان على شاشة فتح التطبيق" في عمليات التشغيل على البارد هي استخدام شاشة تحميل لتحميل أصول لعبتك أو تطبيقك، وعرض الإعلان من شاشة التحميل فقط. إذا اكتمل تحميل تطبيقك وتمت إعادة توجيه المستخدم إلى المحتوى الرئيسي لتطبيقك، لا تعرِض الإعلان.

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

أنشأت Google "الإعلانات على شاشة فتح التطبيق" لمساعدتك في تحقيق الربح من شاشة تحميل تطبيقك، ولكن من المهم مراعاة أفضل الممارسات لكي يستمتع المستخدمون باستخدام تطبيقك. احرص على تنفيذ ما يلي:

  • انتظِر لعرض "إعلان على شاشة فتح التطبيق" الأول إلى ما بعد أن يستخدم المستخدمون تطبيقك بضع مرات.
  • اعرض إعلانات على شاشة فتح التطبيق في الأوقات التي ينتظر فيها المستخدمون تحميل تطبيقك.
  • إذا كانت لديك شاشة تحميل أسفل "الإعلان على شاشة فتح التطبيق"، واكتمل تحميل شاشة التحميل قبل إغلاق الإعلان، قد تحتاج إلى إغلاق شاشة التحميل في الطريقة adDidDismissFullScreenContent.

مثال كامل على GitHub

Swift Objective-C

الخطوات التالية

مزيد من المعلومات عن خصوصية المستخدمين.