Реклама при открытии приложения

Реклама при открытии приложения (App Open Ad) — специальный формат рекламы для монетизации экранов загрузки своих приложений.

Внимание

Этот формат рекламы работает только в вертикальной ориентации. При горизонтальной ориентации реклама показываться не будет.

Примечание

Пример работы всех типов форматов есть в демопроекте.

Пример создания рекламы при открытии приложения

Основная идея реализации:

  1. Создается отдельный контроллер, управляющий жизненным циклом рекламы при открытии приложения.

  2. Реклама загружается заранее и хранится в памяти.

  3. Показ рекламы триггерится событиями жизненного цикла приложения (переход в состояние active).

Загружает и хранит рекламу, управляет показом и обрабатывает события SDK.

  import UIKit
  import YandexMobileAds

  protocol AppOpenAdControllerDelegate: AnyObject {
      func appOpenAdControllerDidLoad(_ controller: AppOpenAdController)
      func appOpenAdControllerDidDismiss(_ controller: AppOpenAdController)
      func appOpenAdController(_ controller: AppOpenAdController, didFailToLoadWithError error: Error)
      func appOpenAdController(_ controller: AppOpenAdController, didFailToShowWithError error: Error)
  }

  class AppOpenAdController: NSObject {

      static let shared = AppOpenAdController()

      private let adUnitID = "ad-unit-ID" // Use R-M-XXXXXX-Y or "demo-appopenad-yandex" (look for the description below)

      weak var delegate: AppOpenAdControllerDelegate?

      private var appOpenAd: AppOpenAd?
      private weak var presentingVC: UIViewController?

      private lazy var appOpenAdLoader: AppOpenAdLoader = {
          let loader = AppOpenAdLoader()
          loader.delegate = self
          return loader
      }()

      private override init() {
          super.init()
      }

      func loadAd() {
          print("[AppOpen] Loading ad...")
          let configuration = AdRequestConfiguration(adUnitID: adUnitID)
          appOpenAdLoader.loadAd(with: configuration)
      }

      func showAdIfAvailable() {
          guard let ad = appOpenAd else {
              return
          }
      
          let rootVC: UIViewController? = nil
      
          ad.show(from: rootVC)
      }
  }

  extension AppOpenAdController: AppOpenAdLoaderDelegate {
      func appOpenAdLoader(_ adLoader: AppOpenAdLoader, didLoad appOpenAd: AppOpenAd) {
          print("[AppOpen] didLoad")
          self.appOpenAd = appOpenAd
          self.appOpenAd?.delegate = self
          delegate?.appOpenAdControllerDidLoad(self)
      }

      func appOpenAdLoader(_ adLoader: AppOpenAdLoader, didFailToLoadWithError error: AdRequestError) {
          print("[AppOpen] didFailToLoad: \(error.error)")
          appOpenAd = nil
          delegate?.appOpenAdController(self, didFailToLoadWithError: error.error)
      }
  }

  extension AppOpenAdController: AppOpenAdDelegate {
      func appOpenAdDidShow(_ appOpenAd: AppOpenAd) {
          print("[AppOpen] didShow")
      }

      func appOpenAdDidDismiss(_ appOpenAd: AppOpenAd) {
          print("[AppOpen] didDismiss")
          self.appOpenAd = nil
          delegate?.appOpenAdControllerDidDismiss(self)
      }

      func appOpenAdDidClick(_ appOpenAd: AppOpenAd) {
          print("[AppOpen] didClick")
      }

      func appOpenAd(_ appOpenAd: AppOpenAd, didFailToShowWithError error: Error) {
          print("[AppOpen] didFailToShow: \(error)")
          self.appOpenAd = nil
          delegate?.appOpenAdController(self, didFailToShowWithError: error)
      }

      func appOpenAd(_ appOpenAd: AppOpenAd, didTrackImpressionWith impressionData: ImpressionData?) {
          print("[AppOpen] didTrackImpression: \(impressionData?.rawData ?? "nil")")
      }
  }

Подписывается на события и реагирует на результат (UX/аналитика).

  import UIKit
  import YandexMobileAds

  class AppOpenViewController: UIViewController {
      override func viewDidLoad() {
          super.viewDidLoad()
          loadAd()
      }
      
      private func loadAd() {
          AppOpenAdController.shared.delegate = self
          AppOpenAdController.shared.loadAd()
      }
  }

  // MARK: - AppOpenAdControllerDelegate

  extension AppOpenViewController: AppOpenAdControllerDelegate {
      func appOpenAdControllerDidLoad(_ controller: AppOpenAdController) {
      }
      
      func appOpenAdControllerDidDismiss(_ controller: AppOpenAdController) {
      }
      
      func appOpenAdController(_ controller: AppOpenAdController, didFailToLoadWithError error: Error) {
      }
      
      func appOpenAdController(_ controller: AppOpenAdController, didFailToShowWithError error: Error) {
      }
  }

Отслеживает состояние приложения и инициирует показ рекламы при состоянии active.

  class SceneDelegate: UIResponder, UIWindowSceneDelegate {
      var window: UIWindow?

      // other settings

      func sceneDidBecomeActive(_ scene: UIScene) {
          AppOpenAdController.shared.showAdIfAvailable()
      }
  }