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

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

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

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

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

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

Предварительные условия

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

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

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

/21775744923/example/app-open

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

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

Реализация класса менеджера

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

Создайте новый одноэлементный класс под названием AppOpenAdManager и заполните его следующим образом:

Быстрый

class AppOpenAdManager: NSObject {
  var appOpenAd: GADAppOpenAd?
  var isLoadingAd = false.
  var isShowingAd = false

  static let shared = AppOpenAdManager()

  private func loadAd() async {
    // TODO: Implement loading an ad.
  }

  func showAdIfAvailable() {
    // TODO: Implement showing an ad.
  }

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

Цель-C

@interface AppOpenAdManager ()
@property(nonatomic, strong) GADAppOpenAd *appOpenAd;
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;

@end

@implementation AppOpenAdManager

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

- (void)loadAd {
  // TODO: Implement loading an ad.
}

// Add this method to the .h file.
- (void)showAdIfAvailable {
  // TODO: Implement showing an ad.
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil;
}

@end

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

Следующий шаг — заполнить метод loadAd() .

Быстрый

private 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 GADAppOpenAd.load(
      withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
  } catch {
    print("App open ad failed to load with error: \(error.localizedDescription)")
  }
  isLoadingAd = false
}

Цель-C

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

  [GADAppOpenAd loadWithAdUnitID:@"/21775744923/example/app-open"
                       request:[GAMRequest request]
             completionHandler:^(GADAppOpenAd *_Nullable appOpenAd, NSError *_Nullable error) {
               self.isLoadingAd = NO;
               if (error) {
                 NSLog(@"Failed to load app open ad: %@", error);
                 return;
               }
               self.appOpenAd = appOpenAd;
             }];
}

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

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

Быстрый

func showAdIfAvailable() {
  // If the app open ad is already showing, do not show the ad again.
  guard !isShowingAd else { return }

  // If the app open ad is not available yet but is supposed to show, load
  // a new ad.
  if !isAdAvailable() {
    Task {
      await loadAd()
    }
    return
  }

  if let ad = appOpenAd {
    isShowingAd = true
    ad.present(fromRootViewController: nil)
  }
}

Цель-C

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

  // If the app open ad is not available yet but is supposed to show, load a
  // new ad.
  if (![self isAdAvailable]) {
    [self loadAd];
    return;
  }

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

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

Когда приложение станет активным, вызовите showAdIfAvailable() чтобы показать рекламу, если она доступна, или загрузите новую.

Быстрый

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
  // ...

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

Цель-C

@implementation AppDelegate
// ...

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

@end

Обработка обратных вызовов презентации

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

В классе AppOpenAdManager добавьте следующее:

Быстрый

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  // ...

  private 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 GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  // ...

  // MARK: - GADFullScreenContentDelegate methods

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

  func adDidDismissFullScreenContent(_ ad: GADFullScreenPresentingAd) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }

  func ad(
    _ ad: GADFullScreenPresentingAd,
    didFailToPresentFullScreenContentWithError error: Error
  ) {
    appOpenAd = nil
    isShowingAd = false
    // Reload an ad.
    Task {
      await loadAd()
    }
  }
}

Цель-C

@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;

@end

@implementation AppOpenAdManager

// ...

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

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

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil;
}

// ...

#pragma mark - GADFullScreenContentDelegate methods

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

- (void)adDidDismissFullScreenContent:(nonnull id<GADFullScreenPresentingAd>)ad {
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  // Reload an ad.
  [self loadAd];
}

- (void)ad:(nonnull id<GADFullScreenPresentingAd>)ad
    didFailToPresentFullScreenContentWithError:(nonnull NSError *)error {
  self.appOpenAd = nil;
  self.isShowingAd = NO;
  // Reload an ad.
  [self loadAd];
}

@end

Учитывайте срок действия объявления

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

В вашем AppOpenAdManager добавьте свойство Date с именем loadTime и установите это свойство при загрузке вашего объявления. Затем вы можете добавить метод, который возвращает true , если с момента загрузки вашего объявления прошло меньше определенного количества часов. Прежде чем пытаться показать объявление, убедитесь, что вы проверили действительность ссылки на свое объявление.

Быстрый

class AppOpenAdManager: NSObject, GADFullScreenContentDelegate {
  var appOpenAd: GADAppOpenAd?
  var isLoadingAd = false.
  var isShowingAd = false
  var loadTime: Date?
  let fourHoursInSeconds = TimeInterval(3600 * 4)

  // ...

  private 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 GADAppOpenAd.load(
        withAdUnitID: "/21775744923/example/app-open", request: GAMRequest())
      appOpenAd?.fullScreenContentDelegate = self
      loadTime = Date()
    } catch {
      print("App open ad failed to load with error: \(error.localizedDescription)")
    }
    isLoadingAd = false
  }

  private func wasLoadTimeLessThanFourHoursAgo() -> Bool {
    guard let loadTime = loadTime else { return false }
    // Check if ad was loaded more than four hours ago.
    return Date().timeIntervalSince(loadTime) < fourHoursInSeconds
  }

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

Цель-C

static NSTimeInterval const fourHoursInSeconds = 3600 * 4;

@interface AppOpenAdManager () <GADFullScreenContentDelegate>
@property(nonatomic, strong) GADAppOpenAd *appOpenAd
@property(nonatomic, assign) BOOL isLoadingAd;
@property(nonatomic, assign) BOOL isShowingAd;
@property(weak, nonatomic) NSDate *loadTime;

@end

@implementation AppOpenAdManager

// ...

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

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

- (BOOL)wasLoadTimeLessThanFourHoursAgo {
  // Check if ad was loaded more than four hours ago.
  return [[NSDate Date] timeIntervalSinceDate:self.loadTime] < fourHoursInSeconds;
}

- (BOOL)isAdAvailable {
  // Check if ad exists and can be shown.
  return self.appOpenAd != nil && [self wasLoadTimeLessThanFourHoursAgo];
}

@end

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

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

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

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

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

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

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

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

Swift Objective-C

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

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