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

Это руководство предназначено для издателей, которые добавляют объявления при запуске приложения.

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

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

Чтобы добавить объявления при запуске приложения, выполните следующие действия:

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

Требования

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

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

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

ca-app-pub-3940256099942544/5575463023

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

Подробнее о том, как работают тестовые объявления Google Mobile Ads SDK, можно узнать в статье Test Ads.

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

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

Создайте новый класс-одиночку с названием 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/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:

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: "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];
  }];
}

Показ объявления

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

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

Холодный запуск и экраны загрузки

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

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

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

Рекомендации

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

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

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

Swift Objective-C

Дальнейшие действия

Подробнее о конфиденциальности пользователей…