Объявления при запуске приложения

Выберите платформу: Android iOS Unity Flutter

Это руководство предназначено для издателей, интегрирующих рекламу в приложениях.

Реклама при запуске приложения — это специальный формат рекламы, предназначенный для издателей, желающих монетизировать загрузочные экраны своих приложений. Пользователи могут закрыть рекламу при запуске приложения в любой момент. Реклама при запуске приложения может отображаться, когда пользователи выводят приложение на передний план.

Реклама при запуске приложения автоматически отображает небольшую область с фирменным стилем, чтобы пользователи знали, что они находятся в вашем приложении. Вот пример того, как выглядит реклама при запуске приложения:

Ниже приведены шаги, необходимые для внедрения рекламы при открытии приложения:

  1. Создайте класс менеджера, который загружает рекламу до того, как она вам понадобится для отображения.
  2. Показывать рекламу во время событий выхода приложения на передний план.
  3. Обработка обратных вызовов презентации.

Предпосылки

Всегда проверяйте с помощью тестовых объявлений

При создании и тестировании приложений обязательно используйте тестовые объявления, а не реальные, производственные. В противном случае ваш аккаунт может быть заблокирован.

Самый простой способ загрузить тестовую рекламу — использовать наш специальный идентификатор тестового рекламного блока для рекламы при открытии приложения:

ca-app-pub-3940256099942544/5575463023

Он специально настроен для возврата тестовых объявлений при каждом запросе, и вы можете использовать его в своих приложениях при кодировании, тестировании и отладке. Просто убедитесь, что вы заменили его на свой идентификатор рекламного блока перед публикацией приложения.

Дополнительную информацию о работе тестовых объявлений Mobile Ads SDK см. в разделе Тестовые объявления .

Реализовать класс менеджера

Ваша реклама должна отображаться быстро, поэтому лучше всего загружать её до того, как она появится на экране. Таким образом, реклама будет готова к показу сразу после входа пользователя в приложение. Реализуйте класс-менеджер, чтобы отправлять запросы на показ рекламы заранее, до того, как она появится на экране.

Создайте новый класс-синглтон с именем AppOpenAdManager :

Быстрый

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/admob/answer/9341964
  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/admob/answer/9341964
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 :

Быстрый

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

Загрузить объявление

Следующий шаг — загрузка рекламы открытия приложения:

Быстрый

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: "ca-app-pub-3940256099942544/5575463023", request: Request())
    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:@"ca-app-pub-3940256099942544/5575463023"
                         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];
  }];
}

Показать рекламу

Следующий шаг — показать рекламу при открытии приложения. Если рекламы нет, попробуйте загрузить новую.

Быстрый

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 {
    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() чтобы показать рекламу, если она доступна, или загрузить новую.

Быстрый

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 возвращаемого объявления:

Быстрый

appOpenAd?.fullScreenContentDelegate = self

Objective-C

self.appOpenAd.fullScreenContentDelegate = self;

В частности, вам потребуется запросить следующее объявление при открытии приложения после завершения отображения первого. Следующий код показывает, как реализовать протокол в файле AppOpenAdManager :

Быстрый

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 если с момента загрузки объявления прошло менее определённого количества часов. Перед показом объявления обязательно проверьте корректность ссылки на него.

Быстрый

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 _appOpenAd && [self wasLoadTimeLessThanNHoursAgo:kTimeoutInterval];
}

Холодные старты и загрузочные экраны

В документации предполагается, что вы показываете рекламу при запуске приложения только тогда, когда пользователи выводят приложение на передний план, когда оно приостановлено в памяти. «Холодные запуски» происходят, когда приложение запускается, но ранее не было приостановлено в памяти.

Примером холодного запуска является первый запуск приложения пользователем. При холодном запуске у вас не будет ранее загруженной рекламы, готовой к немедленному показу. Задержка между запросом рекламы и её получением может привести к тому, что пользователи смогут немного попользоваться приложением, прежде чем столкнутся с внеконтекстной рекламой. Этого следует избегать, поскольку это негативно сказывается на пользовательском опыте.

Предпочтительный способ использования рекламы при запуске приложения при холодном запуске — использовать загрузочный экран для загрузки ресурсов игры или приложения и показывать рекламу только на загрузочном экране. Если приложение уже загрузилось и перенаправило пользователя на основной контент, не показывайте рекламу.

Лучшие практики

Google создала рекламу при запуске приложения, чтобы помочь вам монетизировать загрузочный экран, но важно помнить о передовых практиках, чтобы пользователи получали удовольствие от использования вашего приложения. Обязательно:

  • Подождите, пока вы покажете первую рекламу при запуске приложения, пока пользователи не воспользуются им несколько раз.
  • Показывайте рекламу при открытии приложения в то время, когда пользователям пришлось бы ждать загрузки приложения.
  • Если под рекламой при открытии приложения отображается загрузочный экран, и загрузка экрана завершается до закрытия рекламы, вы можете закрыть загрузочный экран с помощью метода adDidDismissFullScreenContent .

Полный пример на GitHub

Swift Objective-C

Следующие шаги

Узнайте больше о конфиденциальности пользователей .